[JPA] entityManager.getReference()

seojun·2023년 4월 20일
0

스프링 jpa

목록 보기
1/1
post-thumbnail

프록시 기초

em.find() : DB를 통해서 실제 엔티티 객체 조회
em.getReference() : DB 조회를 미루는 가짜 엔티티 객체 조회

여기서 가짜 엔티티가 프록시이다.


em.getReference()를 알아보기 전
member와 team 엔티티가 양방향 연관관계를 가지고 있다.

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;
}
@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name = "team_id")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

em.find()

Member member = new Member();
member.setName("user1");

em.persist(member);

em.flush();
em.clear();

System.out.println("=================================");
Member findMember = em.find(Member.class, member.getId());
System.out.println("=================================");
System.out.println(findMember.getName());

tx.commit();

em.find()를 사용하면

등호 사이에 select 쿼리가 나가는 것을 볼 수 있다.
그렇다면 이번에는 em.getReference()를 사용해보자.

em.getReference()

Member member = new Member();
member.setName("user1");

em.persist(member);

em.flush();
em.clear();

System.out.println("=================================");
Member findMember = em.getReference(Member.class, member.getId());
System.out.println("=================================");
System.out.println(findMember.getName());

em.getReference()를 사용하면

등호 사이에 select 쿼리가 있는 것이 아닌 findMember.getName() 위에 쿼리가 있는 것을 볼 수 있다.
즉, em.getReference()를 사용할 때 select가 되는게 아닌 findMember.getName()을 실행할 때 select 한다는 것을 알 수 있다.

여기서 findMember의 클래스를 출력하면

위와 같이 Member 후에 Proxy가 있는 것을 볼 수 있다.
Proxy는 다음에 자세히 알아보자.

참고 : 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

0개의 댓글