JPA - N+1 문제

연어는결국강으로·2022년 10월 20일
0

참고 링크

https://www.inflearn.com/questions/39516
https://www.inflearn.com/questions/30446
https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1

유튜브 노마드코더 중에 백앤드 워드롭 영상이 있다. 이 영상에서 N+1 문제를 공부해야 된다고 나와 있었는데, 그때는 N+1이 뭔가 했다.

N+1문제는 Entity가 연관관계를 가지고 있을 때, 이 연관관계가 있는 데이터를 조회하려면 N+1번의 쿼리를 실행해야 된다는 것이다.

나의 경우에는 대부분 메타코딩 강의에서 잘 설계해준대로 거의 복붙을 하다보니 볼일이 좀처럼 없었는데, User의 Role부분을 설계하다 보니 문제가 생겼다. Role이 연관관계가 있고, 내가 로그인을 할 때 따로 AuthService에서 login을 하는 것이 아니라 스프링 시큐리티에서 제공하는 로그인을 하다보니 이미 Transaction이 끝난 상태였고, 그 상태에서 Role을 가져오려고 하니 Exception이 터졌다.

내용인 즉, json에 넣을라고 하는데 트랜잭션이 끝나버려서 role정보를 내가 따로 가져올수가 없어라는 내용이었다.

이것을 해결하려면 fetch join이나 eager타입의 로딩을 할 수도 있지만, eager는 대부분의 경우 좋은 방법은 아니고 fetch join역시 이 상황에서 적절한 방법은 아닌거 같다. dto를 만들어서 entity를 직접 리턴하지 않는 방법으로 해결했다.

0개의 댓글