인프런 커뮤니티 질문&답변

jg.kang님의 프로필 이미지
jg.kang

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

객체 그래프 탐색과 N+1 문제 질문

작성

·

287

0

  1. Repository 를 통해서 join 으로 데이터를 가져와서 처리하는것

  2. Entity 에 비즈니스 모델을 넣어서 객체 그래프 탐색을 통해 데이터를 처리하는것.

 

예를들어 user(1) 과 article(n) 관계가 있다고하면,

유저가 작성한 글의 개수를 구해야되는 문제가 있을때,

  1. ArticleRepository.getCountByUserId(Long user_id)

  2. user.articles.length

 

위 두가지 방법이 어느 차이가 있고 어느 방법이 더 선호되나요?

 

1번 방법은 DB 를 통해 가져와서 DB가 연산을 수행할거고,

2번 방법은 엔티티에서 객체그래프탐색을 통해 FK데이터에 접근해서 메모리에서 길이를 연산한다는 차이가 있다는것까진 이해했습니다.

 

강의에서는 주문취소를 할때, order 에 orderItem 들을 취소처리하던데,

그럼 N+1 문제가 발생하지 않나요?

1개의 Order 에 OrderItem 이 N개면 추가적으로 쿼리를 계속 호출하는걸로 이해했습니다.

 

1번방법은 N+1 문제를 피할수있지만 모델에 비즈니스로직을 작성하지 못하고,

2번방법은 모델에 비즈니스로직을 작성할수있지만 N+1 문제가 발생하는걸로 이해했는데 맞을까요?

답변 1

0

안녕하세요. jg.kang님, 공식 서포터즈 David입니다.

  1. 글 개수만 구해야 한다면, 저는 1번을 선호합니다.

  2. 주문 취소를 해야 한다면, Order 조회시, Order 내 OrderItem들을 함께 조회하여 N+1을 피하는 방법으로 작성할 것 같습니다.

감사합니다.

jg.kang님의 프로필 이미지
jg.kang

작성한 질문수

질문하기