@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. 자주 사용되는 엔티티가 아닌 경우에 유용하며, 엔티티 간의 관계가 복잡하거나 대량의 데이터를 처리할 때 효과적이다.
'WEB > spring' 카테고리의 다른 글
관점 지향 프로그래밍과 객체 지향 프로그래밍을 합쳐서 간단하게 (0) | 2023.12.22 |
---|---|
JPA open-in-view와 Lazy 연관 (0) | 2023.12.14 |
웹 페이지를 만들 때, 사진에서 엑박 생기는 이유와 UUIID 사용해서 이미지 이름 지정 (0) | 2023.12.14 |
@AuthenticationPrincipal 애너테이션 방식 (0) | 2023.12.05 |
JPA 연관관계 매핑 정리 (1) | 2023.12.05 |