배너 이미지

즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading)

2025. 4. 23. 23:19·CS공부/Java & Spring

ORM(Object-Relational Mapping) 환경에서는 연관된 엔티티를 어떻게 로딩할지에 따라
즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading) 두 가지 방식이 존재한다.
각 방식은 성능, 데이터 양, 비즈니스 로직 요구사항에 따라 선택이 달라지며,
Spring JPA, Hibernate 같은 환경에서 빈번하게 설정되는 항목이다.


✅ 즉시 로딩 (Eager Loading)

개념

  • 즉시 로딩은 연관된 모든 데이터를 한 번에 로딩하는 방식이다.
  • 주 테이블(엔티티)과 연관된 엔티티를 포함해 즉시 하나의 SQL로 모두 조회한다.

사용 예시

@ManyToOne(fetch = FetchType.EAGER)
private Team team;

특징

  • 연관 객체를 바로 사용할 수 있다.
  • 연관 데이터를 항상 함께 조회하므로, 쿼리 수를 예측할 수 있다.
  • N+1 문제를 유발하지 않지만, 불필요한 데이터가 로드될 수 있다.

사용 시점

  • 연관된 데이터를 항상 필요로 하는 경우
  • 데이터 양이 작아 성능에 큰 영향이 없는 경우
  • 데이터 무결성 보장이 중요한 경우
  • 주로 @ManyToOne, @OneToOne 관계에서 사용

✅ 지연 로딩 (Lazy Loading)

개념

  • 지연 로딩은 연관 데이터를 즉시 로드하지 않고,
    실제 해당 데이터가 필요한 시점에 로딩하는 방식이다.
  • 초기에는 프록시 객체만 생성되고, 접근 시점에 SQL이 실행된다.

사용 예시

@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;

특징

  • 필요할 때만 데이터를 조회하므로 초기 로딩 속도가 빠르다.
  • 메모리 사용과 DB I/O 비용을 줄일 수 있다.
  • 잘못 사용하면 LazyInitializationException이 발생할 수 있다.

사용 시점

  • 연관된 데이터가 항상 필요하지 않은 경우
  • 데이터의 양이 많고 성능에 민감한 경우
  • 사용자 요청에 따라 동적으로 로딩해야 하는 경우
  • 주로 @OneToMany, @ManyToMany 관계에서 사용

✅ 선택 기준

기준 즉시 로딩 (Eager) 지연 로딩 (Lazy)
데이터 사용 빈도 항상 사용된다 상황에 따라 사용됨
데이터 양 작음 많음
초기 성능 초기 느림 (많은 데이터 조회) 초기 빠름
유지보수 단순 Lazy 예외 주의 필요
트랜잭션 범위 중요하지 않음 트랜잭션 안에서 사용 필요

📘 결론

즉시 로딩과 지연 로딩은 각각의 장단점이 뚜렷하며,
애플리케이션의 요구 사항과 성능 민감도, 데이터 크기 등을 고려하여 선택하는 것이 중요하다.

  • 무조건 하나를 고정하는 것이 아니라, 각 엔티티 관계와 사용 빈도에 따라 선택하는 유연한 설계가 필요하다.
  • Spring JPA에서는 기본이 Lazy이지만, 필요에 따라 Eager로 설정하며, @EntityGraph 등을 통해 동적 제어도 가능하다.

'CS공부 > Java & Spring' 카테고리의 다른 글

문자열 클래스 정리: String vs StringBuffer vs StringBuilder  (0) 2025.05.25
JWT 인증 및 토큰 기반 인증 시스템 정리  (0) 2025.04.28
Spring Boot의 Bean과 어노테이션  (1) 2025.04.23
MVC 모델이란 무엇인가?  (0) 2025.04.23
자바 컴파일 과정  (0) 2025.04.23
'CS공부/Java & Spring' 카테고리의 다른 글
  • 문자열 클래스 정리: String vs StringBuffer vs StringBuilder
  • JWT 인증 및 토큰 기반 인증 시스템 정리
  • Spring Boot의 Bean과 어노테이션
  • MVC 모델이란 무엇인가?
quokkaST
quokkaST
  • quokkaST
    stquokka
    quokkaST
    • 개발자 (77)
      • n8n (2)
      • CS공부 (46)
        • Java & Spring (15)
        • 인프라 (7)
        • 운영체제 & 시스템 (9)
        • 기타 CS지식 (7)
        • 네트워크 (6)
        • 데이터베이스 (2)
      • 알고리즘 (16)
      • 프로젝트 (8)
        • 감정&금융챗봇 (8)
      • 리팩토링 (5)
        • horong (5)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바