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