반응형

지연로딩 

프로그램에서 데이터를 필요로 할 때 데이터를 불러오지 않고 해당 데이터가 실제로 필요한 순간에 로딩하는 방식입니다.

예를 들어보자면 엔티티 A가 다른 엔티티 B와 일대다 관계를 갖고 있다고 가정하면 A를 조회할 때 B 엔티티 들은 처음에 데이터베이스에서 가져오지 않고 A에서 B에 접근할 때 실제로 필요한 시점에 데이터베이스에서 로딩됩니다

 

 

지연로딩 전

@Entity(name = "Member")
@Getter
public class Member extends TimeStamp{

@ManyToOne
@JoinColumn(name = "team_id")
	private Team team;
}

지연로딩 후 (FetchType.LAZY)

@Entity(name = "Member")
@Getter
public class Member extends TimeStamp{

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
	private Team team;
}

 

즉시 로딩

관련된 데이터를 필요로 하기 전에 미리 데이터베이스에서 가져와 메모리에 로드하는 방식입니다. 스프링과 JPA에서 엔티티 간의 관계를 설정할 때 이 방식을 선택할 수 있습니다.

엔티티 A가 엔티티 B와 일대다 관계를 갖고 있다고 했을 때 A를 조회할 때 즉시 로딩을 설정한다면 A를 가져올 때에는 연관된 B 엔티티들도 함께 데이터베이스에서 가져와 메모리에 로드됩니다.

 

 

즉시로딩 사용 전

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Comment> comments = new ArrayList<>();
}

 

즉시로딩 사용 후 ( FetchType.EAGER로 comments를 설정하여 즉시로딩 사용 변경)

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @OneToMany(mappedBy = "post", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Comment> comments = new ArrayList<>();
}
728x90

'Spring(Boot & FrameWork)' 카테고리의 다른 글

Thymeleaf  (0) 2023.11.16
@Entity와 @Table의 차이  (0) 2023.11.14
디자인 패턴  (1) 2023.11.13