본문 바로가기
IT/Java

JPA N+1 이란?

by 성준하이 2022. 2. 11.
반응형

ORM과 JPA에 대한 개념은 아래 참고 포스팅에 추가가 되어있으니 확인 바란다.

 

이 개념은 JPA를 사용하면서 콘솔 창에 보면 나오는 쿼리를 통해서 확인할수 있다.

 

예를들어 책과 도서관이라는 각각의 Entity 가 있다. 

책에는 id과 name 과 library라는 변수들이 있고 library에는 @ManyToOne 이 걸려있다.

 

이럴경우 책 정보를 뽑을때 bookRepository.findBy1Id(id) 를 하면 결과를 가져올때 참조되는 library정보를 가져오게 된다.

 

먼저 sql에서 데이터를 가져오는걸 fetch라고 하는데 fetch에는 2가지 타입이 있다.
데이터가져오는것을 포함해서 데이터베이스의 실행단계가 궁금하면 아래 포스팅을 참고하도록 한다.

 

eager 와 lazy이다.

eager는 참조되는걸 다 가져오는 타입이고 lazy는 필요할때마다 가져오는 방식이다.

default는 earge타입으로 되어있어서 findBy1Id를 하면 참조되는 정보를 모두 가져오게 된다.

 

그렇게 될 경우에는 여러개의 book정보를 가져와도 단 1번의 쿼리만 수행하게 된다.

findBy1Id를 할때 persistence context 개념을 이해했다면 1번만 수행하게 된다.

 

이와 반대로 lazy를 사용할 경우에는 entity에 annotation을 명시해줘야하고 lazy를 사용하게 되면

book 테이블에 총 10개의 컬럼이 있다면 library정보를 가져올때 각각 한번씩 library에 대한 쿼리를 돌린다.

이게 N+1 쿼리이다. N번 만큼 쿼리가 더 수행되기 때문이다.

 

여러번의 쿼리와 1번의 쿼리만 돈다고 했을때는 성능상 eager가 무조건 좋아보이지만 만약에 library 필드 한개가 아닌

여러개의 참조가 걸린다고 가정하였을때는

불필요한 테이블정보들까지 join연산으로 하여 모두 가져오게 되고 그러면 성능이 더욱 나빠진다.

 

이럴때는 annotation 을 사용하여 lazy타입으로 하여 N+1쿼리를 수행하는게 더욱 이득이다.

 

상황에 따라 유리한 타입을 사용하기 위해서는 프로젝트에 대해서 완벽하게 이해를 하고 적시적소에 맞게 배치를 하여 코딩을 하는것이 필요하다.


참고 포스팅

 

https://thenicesj.tistory.com/106 

 

SpringBoot/JPA part.1

저번 spring/mybatis 포스팅에 이어서 이번엔 springboot/JPA 포스팅을 다뤄볼것이다. spring과 springboot는 어떤 차이가 있는지는 아래 참고 포스팅 부분을 확인해보도록 하자. 시작하기 앞서 스프링을 해

thenicesj.tistory.com

 

https://thenicesj.tistory.com/90

 

ORM ( Object-Relational Mapping) 설명 및 소개

ORM에 대해서 들어보거나 사용해보신적이 있으신가요? Java springboot에서 JPA를 사용해봤거나 PHP의 laravel, python의 Django 등을 사용해보셨다면 들어는 보셨을텐데요. ORM은 Object Relational Mapping ,..

thenicesj.tistory.com

 

https://thenicesj.tistory.com/93

 

데이터베이스 실행계획

dbms에서 쿼리를 날리면 데이터베이스에서는 3단계를 거친다. sql 파싱 sql 최적화 sql 실행 순서를 거치는데 간단하게 설명을 하면 파싱부분에서는 syntax, semantic 등의 구문오류나 대상이 올바르게

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

implements, extends 란?  (23) 2022.02.26
JDK , JRE , JVM 차이?  (27) 2022.02.24
SpringBoot/JPA part.10  (36) 2022.02.08
SpringBoot/JPA part.9  (18) 2022.02.07
SpringBoot/JPA part.8  (5) 2022.02.06

댓글