지연 로딩과 즉시 로딩을 하기 전에 먼저 엔티티 간의 연관 관계를 알 필요가 있습니다.
관계형 데이터베이스에서는 테이블 간 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의 정보를 즉시 가져옵니다.