JPA 연관관계

kangking·2024년 6월 24일
0

Spring Boot

목록 보기
6/10

JPA 연관관계

@OneToMany

FetchType.Lazy가 디폴트

@OneToOne

FetchType.Eager가 디폴트

@ManyToOne

FetchType.Lazy가 디폴트

FetchType

Eager

값을 가져올 떄 동시에 같이 가져와서 주입
값을 가져올 때 JOIN하거나 각각 SELECT가 실행됨

Lazy(우선 Lazy로 설정하고 따로 가져오는 경우가 하나도 없다면 Eager로 변경)

값을 가져올 때가 아닌, 실제 사용될 때 가져와서 주입
값을 가져올 때 SELECT문이 실행, 사용할 때 SELECT문이 또 실행

  • Lazy가 가능한 원리?

    FK설정된 클래스를 상속받는 Proxy객체에 연관관계를 맺은 클래스의 객체가 담겨 마치 값을 가져온 척하여 정상 동작할 수 있게 한다.

문제

  • n+1문제

    연관 관계가 있는 테이블간 데이터를 가져올 때, 전체 목록을 가져오는데 1번, n개의 데이터가 조회되면 해당 데이터와 연관된 테이블의 값들을 조회하는데 각각 1번씩 총 n번 쿼리가 추가실행 되기 때문에 불필요하게 많은 쿼리가 사용된다.

  • n+1문제 해결방법

    쿼리를 직접 JOIN으로 작성해서 사용
    이 과정에서 여러 도구를 사용할 수 있기 때문에 생SQL쿼리를 사용해야 하는 것은 아니다

  • 왜 자동으로 안되고 직접 JOIN하는 등 수동으로 쿼리를 작성하는지?

    외래키를 매번 참조해서 JOIN하여 가져오면 연관 테이블이 필요하지 않은 경우에도 불필요하게 가져오게 된다.

    따라서 자동으로 따로 가져오는 것을 기본으로 하고, JOIN이 명시적으로 필요하면 직접 수동으로 설정해서 사용한다.
    (반대일 시 앞서 말한 필요없는 경우를 커버할 수 없음)

profile
하루하루 의미있게

0개의 댓글