JPA를 사용할 때 N+1 문제를 조심하라는 얘기를 여기저기서 들었는데 우리 프로젝트에서도 쿼리가 여러번 나가는 현상이 발견됐다.
이런 현상이 발생하는 이유에 대해 많이 찾아보고 공부했는데 우리 코드에서 어떤 부분이 문제가 있었는지 알 수 있었다.
우리 코드에서는 N+1 이 발생했던 이유가 eager로 설정된 entity 때문이였고 lazy로 변경하니 해결
이때는 처음 조회할 때 부터 FetchJoin으로 가져오면 N+1 방지 가능
Paging 처리를 하거나 2개 이상의 collection join에서는 FetchJoin을 해도 문제가 발생하기 때문에
@BatchSize 를 사용해야 한다고 하는데 우리 프로젝트에는 해당되지 않는 내용이라 다음에 해당
lazy로 설정하더라도 이후에 연관 엔티티의 필드를 조회하는 부분에서는 쿼리가 한번 더 발생되는데
상황에 맞닥뜨렸을때 사용
-추가-
lazy로 변경하고 FetchJoin으로 설정 한 부분이 있었는데 나중에 보니까 하위테이블 조회 할 일이 없어서 FetchJoin을 안해도 n+1이 발생 안하는것 확인. 따라서 불필요한 FetchJoin 제거.
https://github.com/chahyoungseok/shoppingmall/commit/abe38671b226116363446b3b891463e375159a71
처음엔 N+1문제인줄 알았는데 코드를 쭉 따라가보니 다음과 같은 문제 발생
프론트엔드에서 보내온 JWT를 받고 Controller로 넘겨줄때 유저ID에 해당하는 username이라는 변수를 넘겨주는 방식을 사용했었는데 이렇게하면 Service Layer에서 유저 객체가 필요할 때 Select 쿼리를 날리고 같은 Select 쿼리가 2번 발생하는 상황
JWT을 검증하는 과정에서 DB에 쿼리를 한번 날리고 Service Layer에서도 한번 더 날리기 때문