@Entity
public class Image{
    @Id
    @GeneratedValues(stretegy = GenerationType.IDENTITY)
    private int id;
    
    @ManyToOne(fetch = FetchType.EAGER)
    private User user;
}
@Entity
public class User{
    @Id
    @GeneratedValue(strategy = GenerationTye.IDENTITY)
    private int id;
    
    @OneToMany(mappedBy="user", fetch = FetchType.LAZY)
    private List<Image> images;
}

 

User과 Image을 양방향 매핑할거다. 

이때 FetchType.EAGER과 FetchType.LAZY이 등장한다. 

 

EAGER이란?

: 연관된 엔티티를 즉시 로딩하는 방식

 

위의 코드에 따르면 Image를 Select할 때 해당 Image id로 등록된 User를 전부 JOIN해서 가져온다. (부모 엔티티를 가져올 때 연관된 자식 엔티티도 함께 가져온다는 뜻)

-------- @ManyToOne 매핑의 기본은 fetch가 EAGER이라 생략 가능 -------------------

1. 연관된 엔티티들이 실제로 필요하지 않은 경우에도 항상 가져오기 때문에, 데이터를 불필요하게 로드하여 성능에 영향을 줄 수 있다. 

2. 복잡한 데이터 모델이나 성능에 크게 영향을 미치지 않는 경우에 사용될 수 있다. 

 

 

LAZY이란?

: 연관된 엔티티를 필요로 할 때 가져오는 방식

 

위의 코드에 따르면 User를 Select할 때 해당 User id로 등록된 Image들을 가져오지 않는다. (부모 엔티티를 가져올 때 연관된 자식 엔티티는 초기에는 가져오짖 않고, 해당 자식 엔티티가 실제로 접근되거나 사용될 때 가져온다.)

1. 지연로딩을 사용하면 필요하지 않은 데이터를 미리 로드하지 않으므로 성능 향상에 도움이 될 수 있다.

2. 자주 사용되는 엔티티가 아닌 경우에 유용하며, 엔티티 간의 관계가 복잡하거나 대량의 데이터를 처리할 때 효과적이다.

 

 

+ Recent posts