지연 로딩, 즉시 로딩

김태훈·2024년 1월 10일
0

Spring

목록 보기
12/16

엔티티 간의 연관 관계

지연 로딩과 즉시 로딩을 하기 전에 먼저 엔티티 간의 연관 관계를 알 필요가 있습니다.
관계형 데이터베이스에서는 테이블 간 foreign key로 연관 관계를 맺어 JOIN을 통해 테이블을 조회합니다.

Teacher 테이블과 Lecture 테이블이 있다고 했을 때, 하나의 교수는 여러 개의 강의를 할 수 있습니다.
즉, Teacher와 Lecture는 1 : M 인 연관 관계라고 할 수 있습니다.

이를 JPA에서는 @ManyToOne, @JoinColumn 애너테이션을 통해 나타냅니다.

@Entity
public class Teacher {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column
    private String name;
@Entity
public class Lecture {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column
    private String lectureName;
    
    @ManyToOne
    @JoinColumn(name = "teacher_id")
    private Teacher teacher;

@ManyToOne 은 N:1 관계를 나타내는 어노테이션이며,
@JoinColumn은 외래키를 정의하는 어노테이션입니다.

@OneToMany 어노테이션을 통해 1:N 단방향 관계를 할 수 있지만, 그렇게 되면 Lecture 테이블에서 외래키가 생성되는 것이 아닌 Teacher 테이블에 Lecture의 외래키가 생성되기 때문에 관리하기 힘들고, DB에 이슈가 생길수도 있습니다.

지연 로딩, 즉시 로딩

JPA에서는 연관 관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있습니다.
가져오는 시점을 정할 수 있는데 이를 Fetch Type이라고 부릅니다.

지연 로딩

지연 로딩은

...
@ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
private Teacher teacher;
...

처럼 사용할 수 있는데 지연 로딩을 사용하게 되면, 필요한 시점에 정보를 가져올 수 있습니다.

기본적으로 @OneToMany 애너테이션의 FetchType의 경우 default 값으로 LAZY로 지정되어 있습니다.

지연로딩 사용 시 주의점

지연로딩은 영속성 컨텍스트가 제공하는 기능 중 하나입니다.
따라서 지연 로딩된 Entity의 정보를 조회하려고 할 때는 영속성 컨텍스트가 존재해야합니다.
즉, 트랜잭션이 적용되어 있어야 합니다.

즉시 로딩

즉시 로딩은

@ManyToOne(fetch = FetchType.EAGER)
...

으로 사용할 수 있습니다.
@ManyToOne 애너테이션의 FetchType의 default 값이 EAGER로 되어있습니다.
즉시 로딩의 경우 조회할 때 연관된 모든 Entity의 정보를 즉시 가져옵니다.

0개의 댓글