[스프링 부트] 32. Join으로 연관 관계인 객체 1번에 불러오기 - 웹 게시판 v6

KangHo Lee's avatar
Dec 02, 2024
[스프링 부트] 32.  Join으로 연관 관계인 객체 1번에 불러오기 - 웹 게시판 v6

연관 관계에 있는 객체(Board, User)를 1번에 불러올 경우 장점

  1. 성능 향상
      • 지연 로딩 방지
        • 기본적으로 fetch = FetchType.LAZY로 설정된 관계에서는 User 객체를 사용할 때 추가 쿼리가 실행됩니다.
        • 하지만 join fetch를 사용하면, Board 객체를 로드할 때 User 객체도 함께 로드되므로 추가 쿼리를 방지할 수 있습니다.
      • 쿼리 최적화
        • 한 번의 쿼리로 BoardUser 데이터를 모두 가져오므로 데이터베이스와의 통신 횟수를 줄일 수 있습니다.
        • 이는 데이터베이스 부하를 줄이고, 네트워크 트래픽을 감소시켜 성능을 최적화합니다.
  1. 코드의 간결성
      • 명확한 데이터 접근
        • Board와 관련된 User 정보를 별도의 쿼리 없이 즉시 사용할 수 있어 코드가 단순해집니다.
      • 복잡성 감소
        • 여러 번의 쿼리를 수행할 필요가 없으므로 코드의 복잡성이 줄어듭니다.
  1. 일관된 데이터
      • 데이터 일관성 유지
        • join fetch를 사용하여 연관된 엔티티를 한 번에 로드하면, 동일한 트랜잭션 내에서 일관된 데이터를 사용할 수 있습니다.
        • 이는 데이터베이스 상태의 일관성을 유지하는 데 도움이 됩니다.

예시

Board와 User 객체는 n : 1 관계입니다.
BoardRepository.java
// id를 통해 Board 객체 1개 찾는 메서드 public Optional<Board> findByIdJoinUser(int id) { String sql = """ select b from Board b join fetch b.user where b.id = :id """; Query q = em.createQuery(sql, Board.class); q.setParameter("id", id); try { Board board = (Board) q.getSingleResult(); return Optional.ofNullable(board); } catch (RuntimeException e) { return Optional.ofNullable(null); } }

JOIN FETCH

💡
기본적으로 join fetch는 INNER JOIN입니다.
  • JPQL(Java Persistence Query Language)에서 고유하게 사용하는 쿼리 구문입니다.
    • JPQL은 객체지향 쿼리 언어로, 데이터베이스 테이블 대신 엔티티 객체를 대상으로 쿼리를 작성할 수 있게 해줍니다.
  • 연관된 엔티티를 한 번의 쿼리로 함께 가져올 때 사용됩니다.
  • 일반적인 JOIN과 달리, join fetch는 지연 로딩(Lazy Loading)을 방지하여 연관된 엔티티를 즉시 로딩(Eager Loading)하게 합니다.
  • LEFT JOIN FETCH로 Left Outer Join은 가능합니다.
    • JPQL은 RIGHT JOIN과 FULL JOIN을 지원하지 않습니다.
 
Share article

devleekangho