다이어리에 대한 코멘트 작성 기능을 만들던 중, 불필요한 select 쿼리가 나가는 것이 눈에 띄었습니다!!!
@Transactional
public Long createComment(CommentCreateDto serviceDto) {
Member member = memberService.findValidMember(serviceDto.getMemberId());
Diary diary = diaryService.findValidDiaryById(serviceDto.getDiaryId());
Comment comment = Comment.createComment(
serviceDto.getGroupId(),
serviceDto.getLevel(),
serviceDto.getUpperId(),
serviceDto.getContent(),
diary,
member,
serviceDto.getCommentVisibility()
);
commentRepository.save(comment);
return comment.getId();
}
Member의 경우 이미 Security를 이용한 AuthFilter를 통해 유효하고 인증된 사용자임이 증명되었습니다.
이 경우에 굳이 service -> repository를 통해 두 번 select할 필요가 없습니다.
하지만 Comment에 insert하기 위해 fk로 Member 엔티티가 필요합니다.
이럴 땐 어떻게 해야할까요?
@Transactional
public void createComment(CommentCreateDto serviceDto) {
Diary diary = diaryService.findValidDiaryById(serviceDto.getDiaryId()); // 접근 가능한 다이어리에 대한 검증은 DiaryService에서 진행했다고 가정 후 생략.
Member member = memberRepository.getReferenceById(serviceDto.getMemberId()); // 로그인한 Member에 대한 검증은 security filter에서 처리
Comment comment = Comment.createComment(
serviceDto.getGroupId(),
serviceDto.getLevel(),
serviceDto.getUpperId(),
serviceDto.getContent(),
diary,
member,
serviceDto.getCommentVisibility()
);
commentRepository.save(comment);
}
memberId가 유효하다는 것은 이미 필터를 통해 증명된 정보이기 때문에, insert할 때에는 단순히 memberId값만 필요하므로getReferenceById
를 사용하여 불필요한 select 쿼리를 줄여보았습니다.
Hibernate:
insert
into
comment
(created_date, deleted_date, last_modified_date, comment_visibility, content, diary_id, group_id, level, upper_id, writer_id)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
select문이 일어나지 않는 것을 확인했습니다.