포스트

2023-12-11-TIL

Today I Learned

Best Tech Blogs

꾸준히 읽을 기술 블로그 목록을 모아 둔 글들이다. 개발 블로그를 소개하는 글, 기술 뉴스 사이트를 묶은 글, 피드 구독 서비스인 Feedly가 보여 주는 인기 기술 블로그 목록이 섞여 있다. 목록을 하나씩 방문하기보다는 관심 있는 블로그를 RSS 리더에 등록해 두고 새 글을 모아 보는 편이 오래 간다.

  • https://www.wearedevelopers.com/magazine/software-development-blogs
  • https://medium.com/coinmonks/best-tech-blogs-869002e1c483
  • https://www.pluralsight.com/blog/technology
  • https://blog.bit.ai/top-technology-blogs/
  • https://www.technewsworld.com/section/tech-blog
  • https://feedly.com/i/top/tech-blogs

Fetch Join

JPA에서 연관 엔티티를 LAZY로 두면 처음에는 프록시만 들어 있고, 실제로 접근할 때 추가 쿼리가 나간다. 목록 N건을 조회한 뒤 각 건의 연관 엔티티에 접근하면 쿼리가 1 + N번 나가는 N+1 문제가 생긴다. 트랜잭션이 끝난 뒤 접근하면 LazyInitializationException이 난다.

페치 조인은 이 두 문제를 한 번에 푸는 도구다. Hibernate 사용자 가이드는 페치 조인이 연관의 지연 로딩 설정을 덮어쓰고, 그 연관을 SQL 조인으로 함께 가져오게 한다고 설명한다.

1
2
3
List<Person> persons = entityManager.createQuery(
        "select distinct p from Person p left join fetch p.phones", Person.class)
    .getResultList();

join fetch(inner)는 연관 엔티티가 있는 행만 돌려주고, left join fetch는 연관 엔티티가 없는 행도 포함한다. 일반 join과의 차이는 결과에 있다. 일반 조인은 조건이나 프로젝션에 연관을 쓸 뿐 연관을 채워 주지 않고, 페치 조인은 조회한 엔티티의 연관 필드를 실제 객체로 채운다.

같은 가이드가 주의할 점도 짚는다.

  • to-one 연관은 여러 개를 페치 조인해도 안전하다. 하지만 컬렉션(to-many) 여러 개를 동시에 페치 조인하면 DB에서 카티션 곱이 생겨 성능이 크게 나빠질 수 있다.
  • 페치 조인한 엔티티에 조건을 거는 것은 대개 좋지 않다. 가져온 컬렉션의 원소가 일부만 담기게 된다.
  • setFirstResult(), setMaxResults() 같은 페이징 쿼리에서는 페치 조인을 피하는 것이 좋다.

컬렉션을 여러 개 가져와야 하면 가이드는 페치 조인 대신 연관을 따로 초기화하는 추가 쿼리를 권한다.

  • https://cobbybb.tistory.com/18
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다