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 |