You are a developer, not a coder.

JPA N+1 해결방법? 본문

FrameWorks/Spring (Boot포함)

JPA N+1 해결방법?

Mattmk 2023. 5. 18. 13:38
SMALL
JPA N+1 문제란?


@OneToMany 등에서 하위 엔티티들을 Lazy Loading으로 가져올때마다 자식 조회 쿼리가 추가로 발생하는 이슈

(참고)

위의 문제점을 해결하기 위해서는 아래와 같이 2가지의 방법이 존재한다.

 

일대다 필드의 타입을 Set으로 선언
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="academy_id")
// 정렬이 먹히지 않을 경우, 아래의 @Orderby 어노테이션을 사용하여 순서를 보장함
@Orderby("academy_id, idx desc")
private Set<Subject> subjects = new LinkedHashSet<>();

Set은 중복을 허용하지 않는 자료구조이기 때문에 중복을 없애기 위해 사용한다.

또한, LinkedHashSet을 사용하여 순서를 보장해야 한다.

 

* 주의할점

위의 방법은 하이버네이트로 JPA를 구현시, 해결할 수 있는 방법이라고 한다.

다른 블로그를 보았는데 다음과 같이 적용을 하여도 순서대로 정렬되어 linkedhashset에 담기지 않는다고 한다.

그럴때에는 위의 @JoinColumn 어노테이션 밑에 @Orderby 어노테이션을 설정하여 순서를 보장하고

linkedhashset에 담는방법을 추가해야 된다고 한다.

 

 

 

Set의 설명

Set은 List와는 다르게 객체(데이터)를 중복해서 저장할 수 없다. 또한 저장된 객체(데이터)를 인덱스로 관리하지 않기 때문에 저장 순서가 보장되지 않는다. 수학의 집합과 비슷한 내용이다.
Set은 인덱스로 객체를 관리하지 않기 때문에 데이터를 검색하기 위해서는 iterator() 메서드로 Iterator(반복자)를 생성하고 데이터를 가져와야 한다.

HashSet
HashSet은 Set 컬렉션을 구현하는 대표적인 클래스이다. 데이터를 중복 저장할 수 없고 순서를 보장하지 않는다. HashSet을 생성하는 방법은 아래와 같다.

 

TreeSet

TreeSet은 soretedSet의 2가지 인터페이스중에 1개이다.

TreeSet도 HashSet과 같이 중복된 데이터를 저장할 수 없고 입력한 순서대로 값을 저장하지 않는다.

차이점은 TreeSet은 기본적으로 오름차순으로 데이터를 정렬한다.

 

LinkedHashSet

중복된 데이터를 저장할 수 없고, 입력된 순서대로 데이터를 관리하기 때문에 순서를 보장할 수 있다.

 

distinct 사용

Set보다는 List를 사용을 해야 된다면, Query 문에 distinct를 사용하여 중복을 제거하는 방법이 있다.

 

 

 

LIST

'FrameWorks > Spring (Boot포함)' 카테고리의 다른 글

@Controller, @RestController 차이점  (0) 2023.05.18
json serialize 에서 ignore 하고 싶다면?  (0) 2020.12.28
JPA, Hibernate, Mybatis 요약, 정리  (0) 2020.04.21
Oauth 2.0  (2) 2020.03.13
Comments