getReferenceById 사용하기

달래·2024년 1월 31일
0

JPA

목록 보기
4/9

다이어리에 대한 코멘트 작성 기능을 만들던 중, 불필요한 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확인

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문이 일어나지 않는 것을 확인했습니다.

참고
https://jgrammer.tistory.com/entry/JPA-%EB%B9%84%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-%EC%97%B0%EA%B4%80-%EA%B4%80%EA%B3%84-%EC%A0%80%EC%9E%A5-%EB%B0%A9%EC%8B%9D-%EA%B0%9C%EC%84%A0%EB%B6%88%ED%95%84%EC%9A%94%ED%95%9C-select%EB%AC%B8-%EC%A0%9C%EA%B1%B0

profile
아좌잣~!

0개의 댓글