본문 바로가기
반응형
Spring/JPA

[JPA] OneToMany 관계일 때 컬렉션 조회를 통한 쿼리성능개선

by brightGarden02 2022. 11. 5.

다음은 닥터 질문 답변 게시판 상황이다.

멤버는 질문을 할 수 있고 닥터는 답변을 달 수 있다.

질문과 답변은 OneToMany 관계이다.

 

여기서 문제는 질문 하나에 대해서 답변이 N개가 달린다면

N번의 쿼리가 나간다는 점이다.

 

답변 N개를 한번에 조회할 수 있는 방법이 있을까?

컬렉션 조회를 이용하면 된다.

 

 

- 닥터 질문 답변 게시판

멤버로 로그인했을 때 멤버가 질문을 하고 닥터 3명이 답변을 단 상황이다.

 

 

 

답변 쿼리는 다음과 같다.

문제점: 답변 쿼리를 조회하면 답변한 닥터 쿼리가 3번 나가게 된다. 

답변 쿼리
1번째 답변 닥터 쿼리
2번째 답변 닥터 쿼리
3번째 답변 닥터 쿼리

질문 하나에 대해서

닥터 3명이 답변을 단 상황에서 OneToMany이므로 쿼리가 3번 나갔다.

이러면 성능에 문제가 생기기에 컬렉션 조회를 이용한다.

 

 

해결방안: application.yml 파일을 수정하자.

jpa:
  hibernate:
    ddl-auto: update # 어플리케이션을 시작할 때 데이터베이스를 초기화하고 다시 테이블 생성
  properties:
    hibernate:
      format_sql: true # 실행되는 query를 보여줌
      default_batch_fetch_size: 100 # 컬렉션 조회를 위함

 

 

 

application.yml 파일에서 default_batch_fetch_size를 이용하면 OneToMany 상황에서 컬렉션 조회가 가능하다.

default_batch_fetch_size: 100 # 컬렉션 조회를 위함

 

 

 

default_batch_fetch_size: 100을 적용한 이후 쿼리 결과

 

답변 쿼리
답변에 대해 한번에 조회된 닥터 3명

컬렉션 조회를 통해 in 쿼리로 한번에 조회된 것을 볼 수 있다. 

 

 

 

default_batch_fetch_size: 100 # 컬렉션 조회를 위함

default_batch_fetch_size 숫자는 DB 혹은 어플리케이션이 순간 부하를 어디까지 견딜 수 있는지에 따라서 결정하면 된다. 

100~1000 사이 선택을 권장한다. 

 

'Spring > JPA' 카테고리의 다른 글

@NoArgsConstructor(access = AccessLevel.PROTECTED) 쓰는 이유  (0) 2023.10.11

댓글


반응형
반응형