게시글
질문&답변
2021.07.28
엔티티 매니저 질문드립니다!
학습테스트로 확인은 했으나 뭔가.. 영한님께 한번 더 확실한 확인을 받고 싶어서 그랬습니다!! ㅎㅎㅎ 감사합니다 😄
- 0
- 2
- 170
질문&답변
2020.11.18
로그인 구현 질문드립니다.
정말정말 감사드립니다!!!!!!!!!
- 1
- 4
- 241
질문&답변
2020.11.18
로그인 구현 질문드립니다.
답변 정말 감사드립니다. 결국 스프링 시큐리티의 로그인 인증은, UserDetailService 구현체에서 DB에서 검색해 username, password 등의 정보를 채워넣어 반환한 "스프링 시큐리티의 User객체"의 username, password 정보만 보고 인증을 진행하는게 맞나요?
- 1
- 4
- 241
질문&답변
2020.11.05
@Embedded와 @MappedSuperclass
답변 감사합니다. 제가 올바르게 이해하고 있는 건가요?
- 0
- 3
- 245
질문&답변
2020.07.30
@RequestBody와 @ModelAttribute
아 아니네요.. @PathVariable은 주소에 URI로 들어오지만 @RequestParam은 POST요청의 경우 본문에 들어오니까.. 결국 @ModelAttribute는 요청 매개변수형태(key=value)는 쿼리파라미터든 본문이든 모두 매핑이 되지만, JSON형태는 매핑이 안되는 거군요?
- 0
- 4
- 359
질문&답변
2020.07.30
@RequestBody와 @ModelAttribute
@ModelAtteibute는 @PathVariable이나 @RequestParam으로 들어오는 값들만 매핑이 돼서, @RequestBody로 들어오는, 즉 JSON형태로 요청 body 본문에 들어오는 내용은 매핑을 못하는 것 같은데.. 맞나요??
- 0
- 4
- 359
질문&답변
2020.07.29
@NamedEntityGraph 와 Fetch
아, 제가 했던것은 Notification 자체를 조회하는 것 이었습니다. Notification.java @Entity @Getter @Setter @EqualsAndHashCode(of = "id") @NoArgsConstructor public class Notification { @Id @GeneratedValue private Long id; @Enumerated(EnumType.STRING) private NotificationType notificationType; private String title; private String link; private boolean ringBellChecked = false; private boolean linkVisited = false; @ManyToOne private Account account; @ManyToMany private List commonTag = new LinkedList(); private LocalDateTime createdDateTime; } NotificationController.java @RequiredArgsConstructor @Controller public class NotificationController { private final NotificationService notificationService; @GetMapping(ALL_NOTIFICATION_LIST_URL) public String showALLNotificationList(@SessionAccount Account sessionAccount, Model model){ model.addAttribute(SESSION_ACCOUNT, sessionAccount); List allNotification = notificationService.ringBellCheck(sessionAccount); model.addAttribute("allNotification", allNotification); return ALL_NOTIFICATION_LIST_VIEW_NAME; } } 여기서 @SessionAccount는 강의에서의 @CurrentUser와 이름만 다를 뿐, 나머지는 같습니다. NotificationService.java @Transactional @RequiredArgsConstructor @Service public class NotificationService { private final NotificationRepository notificationRepository; public List ringBellCheck(Account sessionAccount) { List allNotification = notificationRepository.findByAccountOrderByCreatedDateTimeDesc(sessionAccount); allNotification.forEach(notification -> notification.setRingBellChecked(true)); return allNotification; } } N+1 select 문제 해결 적용 안한 상태입니다. 디버깅 해봤을 때, List allNotification = notificationRepository.findByAccountOrderByCreatedDateTimeDesc(sessionAccount); 에서 2020-07-29 15:49:42.664 DEBUG 8952 --- [io-8080-exec-10] org.hibernate.SQL : select notificati0_.id as id1_2_, notificati0_.account_id as account_8_2_, notificati0_.created_date_time as created_2_2_, notificati0_.link as link3_2_, notificati0_.link_visited as link_vis4_2_, notificati0_.notification_type as notifica5_2_, notificati0_.ring_bell_checked as ring_bel6_2_, notificati0_.title as title7_2_ from notification notificati0_ where notificati0_.account_id=? order by notificati0_.created_date_time desc 2020-07-29 15:49:42.665 TRACE 8952 --- [io-8080-exec-10] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1] 2020-07-29 15:49:42.703 DEBUG 8952 --- [io-8080-exec-10] org.hibernate.SQL : select account0_.id as id1_0_0_, account0_.bio as bio2_0_0_, account0_.count_of_sending_email_verification_email as count_of3_0_0_, account0_.email_first_verified as email_fi4_0_0_, account0_.email_verification_token as email_ve5_0_0_, account0_.email_verified as email_ve6_0_0_, account0_.email_waiting_to_be_verified as email_wa7_0_0_, account0_.first_count_of_sending_email_verification_email_set_date_time as first_co8_0_0_, account0_.location as location9_0_0_, account0_.nickname as nicknam10_0_0_, account0_.nickname_before_update as nicknam11_0_0_, account0_.notification_comment_on_my_comment_by_email as notific12_0_0_, account0_.notification_comment_on_my_comment_by_web as notific13_0_0_, account0_.notification_comment_on_my_post_by_email as notific14_0_0_, account0_.notification_comment_on_my_post_by_web as notific15_0_0_, account0_.notification_like_on_my_comment_by_email as notific16_0_0_, account0_.notification_like_on_my_comment_by_web as notific17_0_0_, account0_.notification_like_on_my_post_by_email as notific18_0_0_, account0_.notification_like_on_my_post_by_web as notific19_0_0_, account0_.notification_my_interest_tag_added_to_existing_post_by_email as notific20_0_0_, account0_.notification_my_interest_tag_added_to_existing_post_by_web as notific21_0_0_, account0_.notification_new_post_with_my_interest_tag_by_email as notific22_0_0_, account0_.notification_new_post_with_my_interest_tag_by_web as notific23_0_0_, account0_.occupation as occupat24_0_0_, account0_.password as passwor25_0_0_, account0_.profile_image as profile26_0_0_, account0_.show_password_update_page_token as show_pa27_0_0_, account0_.sign_up_date_time as sign_up28_0_0_, account0_.user_id as user_id29_0_0_, account0_.verified_email as verifie30_0_0_ from account account0_ where account0_.id=? 2020-07-29 15:49:42.704 TRACE 8952 --- [io-8080-exec-10] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1] 이와 같이 Account를 조회하는 쿼리도 같이 발생됩니다. 그런데 이는 Notification이 DB에 1개이상 존재할 때 이고, 존재하지 않을때는 2020-07-29 15:52:09.195 DEBUG 4604 --- [nio-8080-exec-7] org.hibernate.SQL : select notificati0_.id as id1_2_, notificati0_.account_id as account_8_2_, notificati0_.created_date_time as created_2_2_, notificati0_.link as link3_2_, notificati0_.link_visited as link_vis4_2_, notificati0_.notification_type as notifica5_2_, notificati0_.ring_bell_checked as ring_bel6_2_, notificati0_.title as title7_2_ from notification notificati0_ where notificati0_.account_id=? order by notificati0_.created_date_time desc 2020-07-29 15:52:09.196 TRACE 4604 --- [nio-8080-exec-7] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [9] 이와같이 Account를 조회하는 쿼리는 발생하지 않았습니다. Notification count를 조회할 때는 말씀하신 것처럼 Account를 조회할 필요가 없지만, Notification 자체를 조회할 때는 참조하고있는 Account도 조회해야 하는건가요? Notification이 존재하지 않을때는 어차피 조회할 Notification이 없으니 Account 자체를 조회하지 않는 것 같고.. 그런데 쿼리를 보면 Notification에 대한 select쿼리를 먼저 하고 그 다음에 Account를 조회하는 쿼리를 날리는데, Notification에 대한 select쿼리를 일단 날리고 보니 Account객체가 필요해서 Account객체를 조회하는 select쿼리를 또 날리는 건가요? count조회는 Account조회를 하지 않는데 Notification 자체 조회는 왜 Account조회를 하는지 궁금합니다. Notification 관련 디렉토리 Github 주소입니다. https://github.com/taehee-kim-dev/portfolio2/tree/master/src/main/java/portfolio2/module/notification
- 0
- 5
- 209
질문&답변
2020.07.28
@NamedEntityGraph 와 Fetch
감사합니다! 그리고 NotificationInterceptor.java에서 SecurityContextHolder에서 세션객체를 꺼내서 해당 세션객체로 Notification를 조회할 때는 왜 Account를 조회하는 쿼리는 안날아가나요? SecurityContextHolder에 있는 session 객체는 detached 상태이고, NotificationRepository에서 long countByAccountAndChecked(Account account, boolean checked); 로 조회를 할 때, Account를 가져오는 쿼리가 날아가야하지 않나요?? 제가 Service단에서 비슷한 형식의 조회를 했을 때는 Account객체를 찾는 쿼리문도 같이 날아갔거든요..
- 0
- 5
- 209
질문&답변
2020.07.18
querydsl 설정관련 질문드립니다.
이거 해결하셨나요? 저도 이것때문에 미치겠네요 ㅠ
- 1
- 10
- 15K
질문&답변
2020.07.18
querydsl 빌드 에러 질문드립니다.
답변 감사합니다!! 하지만 안되네요ㅠ 그냥 gradle과의 호환성 버그인 것 같습니다 ㅠ
- 0
- 3
- 5.6K