지연로딩 시 프록시객체의 null값 문제
추가 해당 원인을 나중에 알게되어서 추가한다.
lazy loading 한 프록시 객체는 결국 jpa context 안에서 유지되는 것이 있어야 사용 시에 로딩해서 사용할텐데,
jpa context 생명주기가 트랜젝션에 따른다. 그래서 트랜잭션을 나와서 controller 단에서 반환하면 에러가 나는 것이다.
해결방법은 이전에 썼던 내용으로 처리하면 될 듯 하다.
- 지연로딩으로 연관관계가 있는 하위 객체가 프록시객체로 만들어진 경우, 해당 객체의 값은 가져올 수 있다.
- 하지만 프록시객체 자체를 http response로 넘기게 되면, 내부에서 serialize를 거칠 때 아래와 같은 에러를 볼 수 있다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
Cascade type 기본값이 EAGER 이지만, LAZY 로 해서 지연로딩을 하는 것이 거의 대부분 좋다한다.
지연로딩 시 실사용 안하는 경우 proxy 객체로 남아있다가 다른 범주에서 행동할 때 위와 같은 에러가 나는 경우가 있다.
- 이를 해결하기 위해서는, 도메인과 response dto 분리도 시킬 겸, 프록시 객체를 구체화 시킬 별도의 dto 객체를 만들어 담아서 내보내는 방법이 있고.. (확인함)
- 복사생성자나 프로토타입 패턴 clone 을 만들어서 새로 생성하면서 실체화 시키는 방법도 있다. (확인함)
- Hibernate.unproxy(object) 를 써서 프록시객체를 실체화 시키는 방법이 있다. (확인함)
..음 아니면 serialize 를 해봐도 될랑가 해봐야겠다.