JPA 구현체들은 객체들 처음부터 데이터베이스에서 꺼내서 조회하는 것이 아니다. 이렇게 하면 실제 사용 할때 너무 많은 쓸모 없는 접근이 발생 할 수 있다.
따라서, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 이와 관련 된 기술이 프록시 인데, 이 프록시를 통해서 즉시로딩 ( EAGER ) 과 지연로딩 ( LAZY ) 을 할 수 있다.
"JPA 표준 명세는 지연 로딩 구현방법을 JPA 구현체에 위임했다. 하이버네이트는 지연 로딩을 지원하기 위해 프록시를 사용하는 방법과 바이트코드를 수정하는 두 가지 방법을 제공하는데 바이트코드를 수정하는 방법은 복잡하다."
프록시 객체는 entity
를 참조하며, repository.findById(id)
를 불렀을때 혹은 EntityManager.find()
을 불렀을 때 해당 Entity
를 기반으로 확장되어 만들어 진다. 실제로 Entity
를 만드는 타이밍은 XXX.getName()
과 같은 호출로 실제 데이터가 필요해 질때 Entity
가 생성된다.
tip: 엔티티를 프록시로 조회할 때 식별자 ( PK ) 값을 파라미터로 전달하는데 프록시 객체는 이 식별자 값을 보관한다. 프록시 객체는 식별자 값을 가지고 있으므로 만약 식별자 값을 조회하는 getId() 를 호출해도 프록시를 초기화 하지 않는다.