추가로 주문 api 강의들에서 트랜잭션 없이도 지연 로딩을 활용했는데요 해당 링크 속 질문글의 영한님 답변은 아래와 같습니다. 트랜잭션 범위 밖의 영속성 컨텍스트는 1회성 영속성 컨텍스트라 생각하시면 됩니다. 보통 단순 조회성으로 사용하고, 지연로딩, 더티 체킹이 안됩니다. 답변 내용대로면 지연 로딩이 안되는 게 맞는데 어떻게 가능했던 건가요?
몇가지 테스트를 해보니까 또 읽기 전용은 계속 유지가 되는 거 같은 생각이 드네요 연관관계 편의 메서드에서 연관관계 주인 쪽을 수정하는 부분( child.setParent(this) )을 주석 치고 테스트를 해보았습니다. // JpaMain.java Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); tx.commit(); // ================================================ // Parent.java public void addChild(Child child) { childList.add(child); // child.setParent(this); } 이렇게 해도 child1 과 child2 는 INSERT 가 되더라고요. 대신, PARENT_ID 컬럼에는 null 값이 들어갑니다. 질문1) 그렇다면 아래와 같이 정리한 내용이 맞나요? INSERT 가 되는 이유는 cascade 속성 때문이고 null 값이 들어간 이유는 읽기 전용이기 때문이다 질문2) 만약 읽기 전용이 아닐 때( mappedBy 를 안 적었을 때)는, 주인 쪽에 setParent() 를 안 하고 주인 반대쪽에서 childList.add() 만 해도 PARENT_ID 컬럼에 값이 들어가죠? 질문3) 질문1의 내용이 맞다면, orphanRemoval=true 는 진짜 읽기 전용 속성을 무시하게 해준다고 생각해도 되나요?
원래의 질문과 아래 추가 질문에 대해 지식 공유자님의 답변도 부탁드립니다. https://www.inflearn.com/community/questions/264414 이 질문글의 David님 답변에서 1차 캐시에는 프록시 객체가 아닌 엔티티가 들어있습니다. 이건 무슨 의미인지 알 수 있을까요?
1번 질문에 대한 추가 답변을 해보자면 컨테이너가 생성되는 과정에서 @ComponentScan 이 진행되고 이 때 스코프와 상관없이 BeanDefinition 정보가 등록됩니다 그리고 싱글톤 스코프의 경우에는 BeanDefinition 정보가 등록되면서 동시에 BeanDefinition 을 근거로 빈 생성이 이루어지고 프로토타입 스코프는 컨테이너에 요청할 때, 리퀘스트 스코프는 http 요청이 들어올 때 미리 등록된 BeanDefinition 을 근거로 빈 생성이 이루어집니다 혹시 잘못된 부분 있으면 지적 부탁드립니다.