본문 바로가기

Spring/JPA2

[JPA] Hibernate 6.1 @OneToMany 일대다 조회 시 DISTINCT 자동 적용 배경 스프링 부트 3.0 부터 Hibernate 6.1로 기준이 되어 해당 버전을 사용하고 있었다. 일대다에서 fetch join을 하면 중복 row(영한님 말로 - 뻥튀기)가 생긴다. 해결책으로 JSQL의 distinct를 적용하게되는데 SQL distinct와는 다르다. SQL의 distinct는 row의 값이 모두 일치해야 제거가 된다. JPQL에서 distinct를 하면 SQL distinct 기능 + 중복 엔티티 제거하는 기능을 한다. 하지만 Hibernate 6.0부터는 HQL(JPQL의 구현체)에 DISTINCT가 자동 적용된다. https://github.com/hibernate/hibernate-orm/blob/6.0/migration-guide.adoc#distinct 프로젝트 테스트를.. 2023. 1. 25.
[JPA] fetch join 적용하기 게시판 프로젝트에서 홈을 요청하면 게시글 리스트를 불러온다. 문제는 쿼리인데, 페이징 할 때마다 쿼리가 3개가 나간다 select 게시글 select 회원: 닉네임 조회 게시글 count: 페이징 뷰게시판 프로젝트에서 홈 화면에서 게시글을 불러온다. 문제는 쿼리인데, 페이징 할 때마다 쿼리가 3개가 나간다. 김영한님의 JPA 강의에서 들은 fetch join을 적용해보려 한다. fetch join 여러 엔티티를 한 번의 SQL로 가져오는 것이다. 내 상황에서는 게시글을 불러오고 회원을 불러왔는데 이제 한 번에 fetch join으로 가져온다는 것이다. 이렇게 되면 쿼리 한 번에 회원이 영속성 컨테스트에 처음부터 들어있기 때문에 성능 최적화에 좋다. JPQL과 나가는 SQL 쿼리는 이렇다. JPQL: se.. 2023. 1. 19.