프록시

Shaun·2021년 9월 8일
1

JPA

목록 보기
16/31

프록시

프록시 특징

  • 프록시는 실제 클래스를 상속 받아서 만들어 진다

  • 실제 클래스와 겉 모양이 같다

  • 프록시 객체는 실제 객체의 참조(target)를 보관한다.

  • 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출

프록시 진행방향(프록시 객체 초기화)

  • Member -> Team 있다고 가정해보면 Team 클래스를 부를 떄까지는 프록시(가짜객체)가 나온다

  • 하지만 team의 데이터를 직접건드리는 순간 진짜 데이터객체가 target에 진짜 객체를 연결해준다

  • target 은 처음에는 null이다(프록시)

주의!

• 프록시 객체는 처음 사용할 때 한 번만 초기화

• 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초
기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능

• 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야함 (== 비
교 실패, 대신 instance of 사용)

• 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해
실제 엔티티 반환( 진짜 데이터 영속성 컨텍스트에 넣어놨는데 굳이 프록시 가져올필요 없다)
-> 프록시 호출하면 FIND해도 프록시가 나온다

JPA에서는 A == A 이다 (진짜 데이터 ==프록시)
->한 영속성 컨텍스트에서 가져오고 PK가 같으면 항상 TRUE

• 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때, 프록시를 초기화하면
문제 발생 (= 영속성 컨텍스트를 날려버리면 DB에서 데이터를 가져올수 없기 때문)
(하이버네이트는 org.hibernate.LazyInitializationException 예외를 터트림)

profile
호주쉐프에서 개발자까지..

0개의 댓글