본문 바로가기
프레임워크/JPA

[JPA] 프록시와 연관관계(즉시로딩, 지연로딩, 영속성 전이)

by so5663 2023. 4. 29.

프록시 객체의 초기화

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