Weekly devIL 6

임선용·2022년 6월 21일
0

Spring

JPA

JPA(Java Persistence API) - Java를 이용하여 데이터 관리/유지 기법을 정리해 놓은 표준 Spec
Java로 코드를 작성하면 SQL로 번역해줄 뿐만 아니라, 기본적인 기능이 거의 완벽하게 들어있다
Java - ORM 기술에 대한 인터페이스의 모음

  • 데이터 베이스 관련 작업을 대신 처리해주는 추상화된 계층의 구현 스펙
  • 이전 사용되는 EJB라는 기술 스펙에서 Entity Bean이라는 데이터를 처리해주는 스펙을 정해준 것이 JPA의 효시
  • JPA를 이해하기 위해서는 우선 ORM이라는 기법을 이해
  • 데이터 베이스와 연관된 처리를 JPA 계층에서 처리하므로 좀 더 추상화된 형태의 코드를 제작하는 것으로 개발이 가능

N+1 문제와 해결법

1번의 쿼리를 의도했는데 N개의 쿼리가 더 생기는 것 (주로 다대일 연관관계의 엔티티를 불러올 때 발생)

하위 엔티티들을 첫 쿼리 실행시 한번에 가져오지 않고, Lazy Loading으로 필요한 곳에서 사용되어 쿼리가 실행될때 발생하는 문제가 N+1 쿼리 문제이다

해결법

Fetch Join 사용 <= Inner Join

@EntityGraph 사용 <= Outter Join

Fetch Join과 EntityGraph는 공통적으로 카테시안 곱 (Cartesian Product)이 발생 하여 중복이 생기게 된다
카테시안 곱 : 두 테이블 사이에 유효 join 조건을 적지 않았을 때 해당 테이블에 대한 모든 데이터를 전부 결합하여 테이블에 존재하는 행 갯수를 곱한만큼의 결과 값이 반환되는 것

LinkedHashSet이나 distinct를 사용하여 중복을 제거할 수 있다

지연 로딩, 즉시 로딩의 원리

JPA에서 연관관계를 조회할 때 참조하는 객체들의 조회 시점을 선택할 수 있도록 제공하는 두 가지 방법

즉시 로딩 - 이거 로딩 ( EAGER Loading )

즉시 로딩 (EAGER Loading)은 외부 조인(OUTER JOIN)을 사용하고,
특정 엔티티를 조회할 때 연관된 모든 엔티티를 같이 로딩하는 것을 즉시 로딩 이라고 한다

연관된 엔티티를 모두 가져온다는 장점이 있지만, 엔티티 간의 관계가 복잡해질수록 조인으로 인한 성능 저하를 피할 수 없고, N+1 문제를 일으킨다

즉시 로딩은 불필요한 조인까지 포함해 처리하는 경우가 많이 때문에 지연 로딩의 사용을 권장한다

지연 로딩 - 레이지 로딩 ( LAZY Loading )

원하는 엔티티만 조회가 가능하지만, 추가로 연관된 엔티티를 조회하고 싶다면 데이터베이스와의 재연결이 필요하다, (@Transactional 어노테이션으로 해결 가능)

연관된 엔티티를 조회하는 과정에서 즉시 로딩과 같이 N+1 문제를 일으킨다

각 연관관계의 default 속성은 다음과 같다.
@ManyToOne : EAGER
@OneToOne : EAGER
@ManyToMany : LAZY
@OneToMany : LAZY

profile
백엔드 개발 공부중

0개의 댓글