CommentController 클래스의 getComments() API를 호출할 때 N+1 문제가 발생하고 있다.
여기서 N+1 문제란 뭘까?
N+1 문제란?
N+1 문제는 ORM 기술에서 특정 객체를 대상으로 수행한 쿼리가 해당 객체가 가지고 있는 연관관계 또한 조회하게 되면서 N번의 추가적인 쿼리가 발생하는 문제를 말한다.
왜 발생할까?
N+1문제가 발생하는 근본적인 원인은 관계형 데이터베이스와 객체지향 언어간의 패러다임 차이로 인해 발생한다. 객체는 연관관계를 통해 레퍼런스를 가지고 있으면 언제든지 메모리 내에서 Random Access를 통해 연관 객체에 접근할 수 있지만 RDB의 경우 Select 쿼리를 통해서만 조회할 수 있기 때문이다.
N+1이 문제가 되는 이유
N+1문제가 발생하면 쿼리가 배수적으로 증가하면서 DB에 큰 부담이 발생하게 되고 장애 요인이 될 수 있다. 또한 사용자 관점에서 지연율 또한 크게 증가할 수 있다.
처음에는 Fetch Type의 지연로딩을 사용해서 문제를 해결하려고 했다.
Fetch Type이란
FetchType이란, JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값이다. JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다.
즉시로딩(Eager)
즉시로딩이란 데이터를 조회할 때, 연관된 모든 객체의 데이터까지 한 번에 불러오는 것이다.
지연로딩(Lazy)
지연로딩이란, 필요한 시점에 연관된 객체의 데이터를 불러오는 것이다.
현상 재현
1. Fetch 모드를 EAGER(즉시 로딩)으로 한 경우
[출처]
https://velog.io/@xogml951/JPA-N1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EC%B4%9D%EC%A0%95%EB%A6%AC
JPA N+1 문제와 해결법 총정리
JPA로 개발 과정에서 N+1문제를 만나면서 해맸던 부분들과 실제 프로덕션에서 이를 제대로 처리하지 못하면 성능적인 저하뿐만 아니라 장애로 이어질 수 있다는 부분을 깨닫고 정리 해보고자 합
velog.io
[기술 면접] JPA 즉시 로딩과 지연 로딩의 차이
JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다. 이 두 가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오
velog.io
https://s-y-130.tistory.com/184
[JPA] N+1 문제 원인 및 해결방법
JPA를 사용하면 자주 만나게 되는 것이 N + 1 문제이다. N + 1 문제는 성능에 큰 영향을 줄 수 있기 때문에 N + 1 문제가 무엇이고 어떤 상황에 발생되는지, 어떻게 해결하면 되는지에 대해 알아보고
s-y-130.tistory.com
'JPA' 카테고리의 다른 글
[JPA] JPA에 대하여(+Spring Data JPA) (0) | 2024.11.21 |
---|