프록시 객체의 초기화
Member를 조회할 때 Team도 함께 조회되는걸 막기 위해서 지연로딩을 사용한다.
이유는 쓸때없는 join을 해서 쿼리 조회 시간을 낭비 할수도 있기 때문입니다.
지연로딩
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY) //**
@JoinColumn(name = "TEAM_ID")
private Team team;
..
}
지연로딩을 사용할 경우 실제 team을 사용하는 시점에서만 쿼리를 사용하게 됩니다.
Team team = member.getTeam(); team.getName(); // 실제 team을 사용하는 시점에 초기화(DB 조회)
즉시로딩
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER) //**
@JoinColumn(name = "TEAM_ID")
private Team team;
..
}
Member와 Team을 자주 함께 사용한다면? 즉시로딩을 사용하면 쿼리가 항상 한번에 조회가 된다.
프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용(특히 실무에서)!!!
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
실무에서는 거의 지연로딩만 사용한다고 생각해도 지장없다고 합니다.
영속성 전이: CASCADE
부모 엔티티를 저장할때 자식 엔티티도 같이 저장할때 사용
고아 객체
- 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제
- orphanRemoval = true
- 참조하는 곳이 하나일 때 사용해야함!
- 특정 엔티티가 개인 소유할 때 사용
- @OneToOne, @OneToMany만 가능
'프레임워크 > JPA' 카테고리의 다른 글
[JPA] Entity Graph (1) | 2023.10.24 |
---|---|
[JPA] 임베디드 타입 (1) | 2023.05.01 |
[JPA] 상속관계 매핑 (0) | 2023.04.23 |
[JPA] 다대일 [N:1] 일대일 [1:1] 다대다 [N:M] (0) | 2023.04.05 |
[JPA] 연관관계 매핑 (단방향, 양방향) (0) | 2023.04.02 |