fetch = FetchType.LAZY

우아한테크코스 qna 미션 2단계 진행 중 문제 발생

이전에는 @ManyToOne 으로 연결한 객체들을 fetch 를 설정하지 않아 기본값인 EAGER 로 되어있었음 따라서 실제 객체를 바로 조회해왔음

그러나 순환참조를 방지하기 위해 지연로딩을 걸어두니 이전에 작성한 테스트 코드가 무진장 깨지기 시작함

원인을 알아보니 지연로딩으로 가져온 객체에서 연관된 객체는 프록시 객체로 보관되며

프록시 객체의 메서드를 사용한다고 하더라도 실제 객체를 참조하여 실행했을 뿐 대체되는 것은 아니었음! 그래서 메서드를 호출하더라도 여전히 프록시 객체를 보유하고 있어 usingRecursiveComparison() 를 이용해서 값을 비교하더라도 null 과 비교하여 테스트가 실패하게 됨

문제를 해결하기 위해 프록시 객체는 실제 객체를 언제 조회하며 어떻게 참조하고 있는지를 찾아보았음

JPA 책에서는 프록시 객체의 메서드를 호출할 때 DB 에 접근하여 실제 엔티티를 영속성 컨텍스트에 저장(초기화)하며 실제 엔티티의 참조값을 저장 후 참조값을 통해 실제 객체에 접근하여 값을 가져온다고 적혀있지만

실제로 보면 프록시 객체의 메서드를 호출하기 전에 이미 target 에 엔티티를 참조하고 있음

근데 또 로그를 보면 참조했을 때 select 쿼리문이 날아감

이게 대체 뭘까

ㅠㅠ