N + 1 문제
- 연관관계가 설정된 엔티티 사이에서 한 엔티티를 조회하였을 때, 조회된 엔티티의 개수(N 개)만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는 문제를 의미
개인적으로 한 엔티티를 조회하는데 여러개의 쿼리가 나가는 것이니깐..1+N이 더 맞는 말이 아닐까하는 생각이 있다..- 한번의 쿼리로 가져올 수 있음에도 테이블 수 만큼의 쿼리가 나간다는 뜻 (물론 상황에 따라 좋을 수도 안좋을 수도 있다.)
- ex) 멤버와 팀 테이블이 있을 때
팀정보는 필요업속 멤버만 필요하다면 각각 나가는 것이 유리하다.
멤버와 팀 정보가 항상 같이 필요할 때는 쿼리가 한번만 나가는 것이 유리하다.
Fetch join 과 일반Join 비교
- 일반 Join
- Fetch Join과 달리 연관 Entity에 Join을 걸어도 실제 쿼리에서 SELECT 하는 Entity는 오직 JPQL에서 조회하는 주체가 되는 Entity만 조회하여 영속화
- 조회의 주체가 되는 Entity만 SELECT 해서 영속화하기 때문에 데이터는 필요하지 않지만 연관 Entity가 검색조건에는 필요한 경우에 주로 사용됨
- Fetch Join
- 조회의 주체가 되는 Entity 이외에 Fetch Join이 걸린 연관 Entity도 함께 SELECT 하여 모두 영속화
- Fetch Join이 걸린 Entity 모두 영속화하기 때문에 FetchType이 Lazy인 Entity를 참조하더라도 이미 영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 N+1문제가 해결됨
'I leaned > 스프링,스프링부트' 카테고리의 다른 글
컨트롤러와 서비스의 책임 (0) | 2023.07.17 |
---|---|
요청 DTO 유효성 검사 (0) | 2023.07.17 |
컨트롤러에 비즈니스로직을 넣으면 안되는 이유 (0) | 2023.07.04 |
데이터의 변환과 검증 (0) | 2023.05.30 |
DispatcherServlet (0) | 2023.05.26 |