페치 전략에 따라도 다르지만 영속성 컨텍스트에 어떻게 추가하는지에 따라 또 달라집니다.
EAGER Fetch
EntityManager.find()
find 메소드와 EAGER 페치전략을 사용하면 inner join으로 N+1문제 없이 주로 같이 조회가 되는 연관관계의 경우에 사용할 수 있습니다.
EntityManger.createQuery()
EAGER 페치전략을 사용해도 EntityManger.createQuery(JPQL)를 사용하면 한 번의 쿼리에 정보를 모두 가져오지 않지만 EAGER 페치전략을 사용하기 때문에 곧바로 N+1 문제가 터집니다.
Spring Data JPA
JpaRepository의 기본구현체인 SimpleJpaRepository의 findById 와 findAll, 커스텀 find 메소드의 구현방법이 다릅니다.
findById
EntityManager.find()를 사용해서 EAGER 전략과 함께 사용한다면 N+1 문제 없이 사용할 수 있습니다.
findAll, 파생 쿼리
내부적으로 EntityManger.createQuery JPQL을 만들거나 EntityManger 내에서 JPQL 쿼리를 만들어 실행합니다.
EAGER 페치 전략을 잘 사용하지 않겠지만 만약 사용할 때 위의 메소드들과 같이 사용하면 예상치않은 N+1 문제가 발생할 수 있습니다.