728x90
JPA Error: could not initialize proxy - no Session
접근
JPA강의에서 분명히 이거에 대한 내용을 다뤘던 거 같은데 기억이 안난다..
영속성 컨텍스트, Proxy, Lazy Loading에 대한 이해가 필요함.
Lazy Loading 내용은 제외하고 작성하겠다.
원인
JPA를 사용할 때 흔히 볼 수 있는 에러임.
DB에 저장된 값을 사용할 때 발생한다.
User와 Post는 1 : N 관계를 맺고있다.
Post 엔티티에서 User Fetch => Lazy로 설정해놓은 상태임. (국룰)
Post를 조회할 때 API 과정을 살펴보자.
오류가 나는 컨트롤러
Post를 조회하는 내요이고, PostId를 이용해서 조회 함.
Post 제목, 작성자, 내용, 등등 PostDTO의 정보를 받아온다.
=> 실행 결과는?
왜 에러가 나는 거야?
- open-in-view: false 설정,
- Lazy Loading 사용
Post를 조회할 때, Lazy Loading으로 연관 된 User는 프록시 객체로 채워진다.
실행하면 컨트롤러 단에서 다음 Post 객체를 갖게 되는 것임.
PostDetailDto로 변환하는 작업을 할 때 문제가 발생한다.
User의 값을 사용해서 DTO를 채워야 되는데
User의 값이 초기화 되지 않은 상태라 DTO 생성이 불가능하다.
우리는 서비스단에서 트랜잭션이 일어나도록 설정을 해두었고,
트랜잭션은 컨트롤러단으로 나오면서 영속성 상태가 끝난다.그러한 상태이기 때문에 에러가 발생하는 것이다
해결 방법
Post -> DTO 변환을 서비스에서 하자.
컨트롤러에서 서비스로 변경을 하면 트랜잭션 영역이기 때문에 DTO 정상적으로 생성!
open-in-view: true 설정
Lazy Loading -> Eager Loading
2, 3번은 적절한 방법이 아니기 때문에 생략하겠다.
이번 기회로 JPA의 개념을 다시 공부할 수 있었다.
728x90
'Spring > 오류' 카테고리의 다른 글
No enum constant: QueryDSL에서 Enum타입을 어떻게 받아서 처리할 수 있을까? (0) | 2023.04.01 |
---|---|
com.querydsl.core.types.ExpressionException (0) | 2023.03.31 |
JPA: Parameter value [1] did not match expected type (0) | 2023.03.21 |
org.hibernate.PersistentObjectException: detached entity passed to persist (0) | 2023.02.07 |
org.hibernate.PersistentObjectException: detached entity passed to persist (0) | 2023.02.07 |