개발놀이터

면접 준비 : N + 1 문제 본문

CS 지식/면접준비

면접 준비 : N + 1 문제

마늘냄새폴폴 2022. 12. 15. 11:11

Q. N + 1 문제는 무엇이고 이것이 발생하는 이유와 해결 방법에 대해서 설명해주세요.
A. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우를 말합니다. N + 1 문제는 즉시로딩과 지연로딩 둘 다 발생할 수 있는데 즉시 로딩에서 발생하는 이유는 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시로딩 전략이 동작하기 때문입니다. 지연 로딩에서 발생하는 이유는 지연로딩 전략을 사용한 하위 엔티티를 로드할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다. 해결 방법으로는 fetch join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는 @EntityGraph를 사용하는 방법이 있습니다. 1 : 다 관계에서 다 쪽에서 하위 엔티티에 접근 할 때는 @BatchSize를 사용해 조절할 수 있습니다. 각각의 유의사항으로는 fetch join을 사용할 경우 on 절과 같이 사용하면 오류가 나기 때문에 where 절을 사용해야 합니다. @EntityGraph를 사용할 경우 복잡한 연관관계에서는 꼬여버릴 경우 참사가 일어날 수 있으니 조심해서 사용해야 합니다.