Jpa시 유의 사항
OneToMany fetch join 데이터 뻥튀기 문제
컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터베이스 row가 증가한다.
해결방안으로는 distinct 를 사용하면 되지만 그렇게 되면 데이터의 수가 정확히 예측이 안되므로 페이징이 불가능합니다.
그렇기에 default_batch_fetch_size 옵션을 사용하여 컬렉션이나, 프록시 객체를 한꺼번에 설정한 size 만큼 IN 쿼리로 조회하여 해결 한다.
N + 1 문제
n + 1 문제란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미한다.
- 원인
-
Fetch 전략이 지연 로딩인 경우 연관된 데이터는 프록시로 불어와집니다. 그렇기에 연관된 데이터를 조회 시에 영속성 컨텍스트를 확인하고 없다면 db 에서 조회를 하기 때문에 N 번의 추가 쿼리가 나가는 것입니다.
fetch 전략이 즉시로딩인 경우에도 연관된 데이터를 로딩하기 위해 똑같이 영속성 컨텍스트를 조회하고 연관된 데이터가 없다면 db에서 조회하기 때문에 동일하게 추가적인 n 번의 쿼리가 생성이 됩니다.
- 해결방안
-
fetch_join 을 사용해서 처음부터 연관된 데이터까지 같이 가져오게 하는 것입니다.