객체그래프탐색을 통해 주문에서 회원을 찾아가거나 회원에서 주문을 차아가거나
객체그래프 탐색할때마다 데이터베이스와 통신을 계속해야함
이를 보완하고자 프록시 객체를 도입
실제객체가 멤버를가져오는 시점에 연관된 테이블이 엔티티가 되는것이 아니라 프록시 객체로 매핑시켜놓고 고 객체를 사용하는순간에 조회한다
@Slf4j
@SpringBootTest
public class ProxyTest {
@Autowired
EntityManagerFactory emf;
@BeforeEach
void setUp() {
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
// 주문 엔티티
Order order = new Order();
order.setUuid(UUID.randomUUID().toString());
order.setMemo("부재시 전화주세요.");
order.setOrderDatetime(LocalDateTime.now());
order.setOrderStatus(OPENED);
entityManager.persist(order);
// 회원 엔티티
Member member = new Member();
member.setName("kanghonggu");
member.setNickName("guppy.kang");
member.setAge(33);
member.setAddress("서울시 동작구만 움직이면쏜다.");
member.setDescription("KDT 화이팅");
member.addOrder(order); // 연관관계 편의 메소드 사용
entityManager.persist(member);
transaction.commit();
}
@Test
void proxy() {
EntityManager entityManager = emf.createEntityManager();
// 회원 조회 -> 회원의 주문 까지 조회
Member findMember = entityManager.find(Member.class, 1L);
log.info("orders is loaded : {}", entityManager.getEntityManagerFactory()
.getPersistenceUnitUtil().isLoaded(findMember.getOrders())); //프록시객체인지 확인
log.info("-------");
log.info("{}" ,findMember.getOrders().get(0).getMemo());
log.info("orders is loaded : {}", entityManager.getEntityManagerFactory()
.getPersistenceUnitUtil().isLoaded(findMember.getOrders()));
}
}