플레이 리스트에 음악 추가 시 HHH000496 오류 발생
📝Description
- 처음 Playlist 엔티티를 가져옴
- Playlist 엔티티를 가져올 때 Lazy Loading 으로 설정된 playlistItems 는 프록시 객체가 대신 들어감
- 이때 2번째 jpql 을 사용 → 자동 flush
- 2번째 jpql 실행 전까지도 playlistItems 프록시 객체는 초기화 하지 않음
- 이후 PlaylistItem 객체를 persist 할때 HHH000496 오류 발생
❓Reason
- 구글링 후 영속성 컨텍스트의 엔티티가 detach 되었다고 판단하면서 발생한 것을 확인
- 1번째로 Playlist 엔티티 조회 후 다시 2번째로 jpql 호출
- 이때 2번째 jpql이 실행되며 자동으로 flush가 일어나 cascade 처리 등 여러 정리 작업이 일어날 수 있음
- flush 후에 clear는 일어나지 않았기 때문에 Playlist 엔티티는 영속성 컨텍스트에 살아있지만 Playlist 의 프록시 객체가 초기화 되지 않은채로 flush가 일어나며 cascade 등 여러가지를 처리하려다 상태가 꼬이며 유효하지 않은 프록시 객체가 될 수 있음
- 이후 PlaylistItem 객체를 저장할 때 연관관계로 설정된 Playlist 의 유효성을 검사
- 즉 Playlist 엔티티의 유효성을 검사할 때 내부 프록시 객체의 유효성도 검사하는데, 이 프록시 객체가 유효하지 않으면 Playlist 엔티티도 유효하지 않다고 판단
- 결국 Playlist 엔티티는 유효한 엔티티가 아니기 때문에 오류 발생
✨Conclusion
- 기존 양뱡향 관계는 QueryDSL 에서 조금 더 편하게 쓰려고 만든 것
- 즉 없어도 유지보수에 영향을 주거나 큰 문제가 발생하지 않음
- 오히려 일대다 관계까지 초기화 하기 위해 불필요한 쿼리가 발생하거나 예측이 안되는 동작이 발생할 수 있음