본문 바로가기
프로그래밍/JPA

[JPA] 프록시와 지연로딩, CASCADE

by yonmoyonmo 2021. 5. 28.
김영한님의 책 [JPA 프로그래밍]을 읽고 요약한 내용입니다.

프록시와 즉시로딩, 지연로딩 :

객체 그래프 탐색 중에 연관된 객체를 데이터베이스에서 불러올 때 JPA 구현체들은 프록시라는 기술을 사용한다.

실제 객체를 사용하는 시점에 데이터베이스에 조회하는 것을 지연로딩이라고 한다.

프록시

@Entity
public class Student{
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="STUDENT_ID")
	private Long id;

	@ManyToOne
	@JoinColumn(name="SCHOOL_ID")
	private School school;
}

@Entity
public class School{
	@Id
	@Column(name="SCHOOL_ID")
	private Long id;
	
	@OneToMany(mappedBy="school")
	private List<Student> students = new ArrayList<Student>();
}

요런게 있을 때 비지니스 로직에 따라 Student 인스턴스에서 항상 필드의 School 데이터가 필요하지 않을 경우가 있다.

그래서 student를 데이터베이스에서 조회할 때마다 school까지 조인하여 조회할 필요가 없다.

JPA는 실제로 사용 될 때 조회해서 가져올 수 있게되어있다(지연로딩) 이 때 필요한 것이 프록시이다.

프록시 클래스는 실제 엔티티를 상속 받아서 만들어진다. 사용하는 입장에서는 진짜 엔티티인지 뭔지 신경 쓸 필요가 없다.

프록시 객체는 실제 객체에 대한 참조를 보관한다. 프록시 객체의 메소드를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.

프록시 객체의 초기화 : 실제 사용될 때 데이터베이스를 조회해서 실제 엔티티 객체를 생성하는 것

초기화 과정

  1. 프록시 객체에 member.gerName()을 호출해서 실제 데이터를 조회한다.
  2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하는데 이것을 초기화라 한다.
  3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다.
  4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버변수에 보관한다. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.

즉시 로딩과 지연 로딩

프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다.

즉시 로딩 : 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.

    -> @ManyToOne(fetch=FetchType.EAGER) 요런 식으로 설정하면 댐

지연 로딩 : 연관된 엔티티를 실제 사용할 때 조회한다.

    -> @ManyToOne(fetch=FetchType.LAZY) 요런 식으로 설정하면 댐, 연관된 엔티티를 프록시 객체로 갖게 된다.

JPA의 기본 FatchType은 연관 엔티티가 하나일 경우 즉시, 컬렉션일 경우(@OneToManny 같은거)지연로딩

권장하는 방법은 모든 연관관계에서 지연로딩, 꼭 필요한 곳에서만 즉시 로딩 아무튼 유연하게 최적화

영속성 전이: CASCADE

연관관계가 있는 객체를 한 방에 영속성 컨텍스트에 영속화 하려면

@OneToMany(mappedBy="뭐시기", casade = CascadeType.ALL) 

요런 느낌으로 연관관계 매핑 어노테이션의 cascade 속성을 이용할 수 있다. 

CascadeType은 여러가지가 있다.(구글링 ㄱ)

이러면 부모엔티티(보통 @OneToMany로 매핑된 쪽)가 삭제 될 경우 외래 키로 참조하던 자식들까지 다 삭제 된다(보통 @ManyToOne으로 매핑된 쪽)

비슷한 것으로 고아객체 삭제 옵션이 있다. 이것은 orphanRemoval = true 로 설정할 수 있다.

@OneToMany쪽의 컬렉션에 저장된 객체를 삭제할 경우 진짜로 데이터베이스에서 삭제해준다.

아예 부모쪽을 삭제할 경우 관련 자식들이 다 삭제 된다.

둘 다 무결성을 지켜주는 기능이다.

 

'메모장/JPA' 카테고리의 글 목록

프로그래밍 & 일상

wonmocyberschool.tistory.com

 

댓글