상황 설명

@ManyToOne는 ****기본 Fetch 전략이 EAGER이고 @OneToMany는 기본 Fetch전략이 LAZY이다.

기본 Fetch 전략이 EAGER로 되어 있다면 엔티티를 조회할 때 정보가 필요 없는 하위 테이블 일지라도 조회해버린다. 그러므로 @ManyToOneLAZY 설정을 해둔다.

문제 발생

lazyinitializationexception 이라는 Exception이 발생했다.

우선 상황을 파악해보면

  1. Service 단에서 User가 담아두는 OrderList 에서 문제가 발생했다.
  2. UserOrder는 양방향 관계이며, OrderOrderProduct 또한 양방향 관계이다.
  3. User EntityJWT Filter 에서 권한 관리를 편하게 하기 위해 Security Session에 저장 할 Authentication 객체를 만들었을 때 사용하고 request에 담아왔다.

문제 인식

JWT Filter에서 가져온 User Entity는 이미 준영속 상태이다.

JWT Filter 단에서 이미 트랜잭션 처리가 끝난 상태이고, 더 이상 Lazy여서 Proxy로 채워진 List 변수는 영속성 컨텍스트에서 관리하지 않기 때문에 문제가 발생했다,

해결 방법

해당 User Entity를 영속화 시켜줘야 한다.

방법은 다양하지만 프로젝트에선 EntityManager 를 통해 DB에서 find() 해왔다.

조회해온 Entity의 List 변수는 Proxy로 채워져 있고, 해당 Service단의 메소드에서 트랜잭션 처리가 끝나 EntityManager가 close된 상태가 아니니 Lazy 방식대로 조회가 된다,