My Blog

프록시의 초기화 과정 본문

스프링부트/스프링부트 인프런 김영한님

프록시의 초기화 과정

JAESG 2023. 6. 12. 08:55

프록시객체는 JPA에서 지연로딩일 때 사용되는 것이다.
예를 들어보자

회원 엔티티에

@ManyToOne

private Team team 이라는 필드가 있다.

 

만약 이 메소드에서

public void print(String memberId){
	Member member = em.find(Member.class, memberId);
    Team team = member.getTeam();
    System.out.println(member.getUsername());
	System.out.println(team.getName());
}

여기서는 한 멤버를 조회하고 멤버와 연관된 팀을 조회한다.

반면에 이 메소드에서는

public void print(String memberId){
	Member member = em.find(Member.class, memberId);
    System.out.println(member.getUsername());

}

회원을 조회하고 연관된 팀까지 조회가 됐는데 이것은 효율적이지 않다는 것이다.

 

그래서 JPA에서는 프록시를 지원하는데 

프록시의 기초 내용은 이렇다.

한 회원을 조회할 때 연관된 것은 프록시 객체를 생성해 실제 객체에 대한 참조(target)를 보관한다. 그리고 프록시 객체의 메소드를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.

즉 한 회원을 조회할 때 연관된 것을 프록시 객체로 생성해 놓고 그 연관된 것이 실제로 getName과 같이 사용될 때 프록시 객체는 그 객체에 대한 정보를 위임하는 것이다.

 

그럼 프록시 객체의 초기화는 어떻게 이루어 질까?

1. member.getName()을 호출해서 실제 데이터를 조회한다.

2. 프록시 객체는 실제 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 요청하는데 이것을 초기화 라고 한다.

3. 영속성 컨텍스트는 데이터베이스를 조회해서 실제 엔티티 객체를 생성한다.

4. 프록시 객체는 생성된 실제 엔티티 객체의 참조를 Member target 멤버변수에 보관한다.

5. 프록시 객체는 실제 엔티티 객체의 getName()을 호출해서 결과를 반환한다.

 

 

 

728x90
Comments