최대 1 분 소요

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 을 사용해서 처음부터 연관된 데이터까지 같이 가져오게 하는 것입니다.

태그:

카테고리:

업데이트: