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
https://thenicesj.tistory.com/90
https://thenicesj.tistory.com/93
'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 |
댓글