JPA

지연로딩(FetchType.LAZY)으로는 N+1 문제가 해결되지 않는 이유[미완]

Young_Han 2024. 11. 23. 02:08

 

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

https://velog.io/@jinyeong-afk/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A6%89%EC%8B%9C-%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9%EC%9D%98-%EC%B0%A8

 

[기술 면접] 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