KSCOLD LogoKSCOLD
Blog
Feed
Product
Admin Night
Vault
Guestbook
Info

Vault 목록

Fetch Type

연결된 노트와 함께 읽기

Fetch Type

2026년 5월 17일
  • FetchType이란, JPA(Java Persistence API)가 하나의 엔티티(Entity)를 조회할 때, 연관 관계(Relationships)에 있는 객체(Object)들을 어떻게 가져올 것이냐를 나타내는 설정값이다.

  • JPA(Java Persistence API)는 ORM기술로, 사용자가 직접 쿼리(query)를 생성하지 않고, JPA(Java Persistence API)에서 JPQL(Java Persitence Query Language)을 이용하여 쿼리(query)문을 생성하기 때문에 객체(Object)와 필드(Field)를 보고 쿼리(query)를 생성한다.

  • 따라서 다른 객체(Object)와 연관 관계(Relationships) 매핑이 되어있으면 그 객체(Object)들까지 조회하게 되는데, 이때 이 객체(Object)를 어떻게 불러올 것인가를 설정할 수 있다.

  • 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)으로 나눌 수 있다.

즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)의 장단점 분석

즉시 로딩(Eager Loading)

장점

  • 연관된 엔티티를 모두 가져올 수 있다.

단점

  • 엔티티(Entity)간의 관계가 복잡해질수록 조인(JOIN)으로 인한 성능 저하가 나타날 수 있다.

  • 불필요한 조인까지 포함해서 처리하는 경우가 많다.

  • 예를 들어 Order 연관된 객체가 Member가 N개라면, Order 1개 조회 시 필요하지 않은 Member 객체를 조회하는 쿼리 N개가 생성된다.

  • JPQL(Java Persitence Query Language)에서 N+1 문제를 일으킨다.

지연 로딩(Lazy Loading)

장점

  • 다른 접근 방식보다 훨씬 적은 초기의 로딩 시간이 걸린다.
  • 다른 접근 방식에 비해 메모리 소비량 감소한다.

단점

  • 초기화가 지연되면 원하지 않는 순간 성능에 영향을 줄 수 있다.

결론

  • 따라서 모든 연관 관계(Relationships)는 지연 로딩(Lazy Loading)으로 설정한다.

  • 즉시 로딩(Eager)는 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다.

  • 특히 JPQL(Java Persitence Query Language)을 실행할 때 N+1 문제가 자주 발생한다.

  • 실무에서 모든 연관관계는 지연 로딩(Lazy Loading)(LAZY)으로 설정해야 한다.

  • 연관된 엔티티를 함께 데이터베이스(DataBase)에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용한다.

  • @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시 로딩(Eager Loading)이므로 직접 지연 로딩(Lazy Loading)으로 설정해야 한다.

Synapse Map Insight