[JPA] 일차원적인 검색 성능 개선하기

이동엽·2023년 3월 13일
1

jpa

목록 보기
6/8
post-thumbnail

배경

팀 주간회의를 진행하던 중, 프런트엔드를 담당하는 세나가 만든 프로토타입 디자인을 보았다.
→ 그리곤, 마이페이지에 들어가면 좋다고 생각해 만들어온 새로운 기능이 눈에 띄기 시작했다.


새로운 기능

  • 자신이 답변한 Q&A 게시글 목록 조회하기

참고) 우리의 프로젝트 기능은 아래와 같다.

  • 회원과 의료진은 독립된 상태로 별개로 존재한다.
  • 회원은 의료진이 소속된 병원의 리뷰를 작성할 수 있다.
  • 회원만이 Q&A 게시판에 글을 작성할 수 있고, 의료진만이 답변할 수 있다.

초기 접근 방법

자신(의료진)이 답변한 게시글 목록 조회하기

  • 현재 엔티티 설계 및 관계 매핑 구조
    • 게시글에는 여러 댓글들이 존재한다.
    • 게시글_댓글은 게시글 하나를 참조하고, 이 댓글은 의료진이 작성한다.
    • 의료진은 여러 게시글에 댓글을 달 수 있다. → 게시글_댓글 리스트를 가진다.

  • 접근 방법
    1. 먼저 게시글_댓글 리스트를 가져와, 해당 댓글을 작성한 의료진을 비교한다.
      1. 의료진이 일치하면? → 해당 댓글_리스트를 가져온다.
    2. 우리가 필요한 건 게시글 목록이니, 댓글마다 참조하는 게시글로 매핑한 뒤 게시글 리스트를 가져온다.

  • 해당 소스코드
/* StaffRepository.java */

public List<Board> findBoardListByStaffId(Staff staff) {

	List<BoardReply> boardReplyList 
		= em.createQuery("select br from BoardReply br where br.staff = :staff", BoardReply.class)
				.setParameter("staff", staff)
				.getResultList();

	return boardReplyList.stream()
				.map(BoardReply::getBoard)
				.collect(Collectors.toList());
}


문제점

  • 파라미터로 넘어온 staff비영속 상태이다.
    • 단순 조회에는 문제가 없을 지 모르지만, 비영속 상태인 객체와 영속 상태인 객체를 비교하는게 맞을까?

  • 영속 상태의 조회 대상 staff를 이용한다면, id 비교를 통해 일치하는 지 검사할 수 있다.
    • 이 경우, 위 경우보다 1차 캐시를 통해 비교할 수 있어 빠르고 무엇보다 정확하다!


개선방안

  • 개선 소스코드
    • 조인을 이용해 직접 id를 비교한다.
/* StaffRepository.java */

public List<Board> findBoardListByStaffId(**Long staffId**) {

	List<BoardReply> boardReplyList 
		= em.createQuery("select br from BoardReply br join br.staff s where s.id = :id", BoardReply.class)
			.setParameter("id", staffId)
			.getResultList();

	return boardReplyList.stream()
			 .map(BoardReply::getBoard)
			 .collect(Collectors.toList());
}

의료진을 비교한다고 해서, 정말 객체끼리 비교할 필요는 없다.
객체 지향 설계시 현실 세계와 확실히 구분하자.

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

0개의 댓글