오늘 학습한 내용
- 최종 프로젝트 중간발표 준비
오늘의 문제점 최종 프로젝트를 준비하던 도중에 일어난 일이다. 중간발표를 위해서 팀원분들과 각자 하던 작업을 머지하는 과정에서 한 팀원 분이 만드신 후기 게시판을 내가 실행했을 때 읽어오지 못하는 에러가 발생했다.
에러 메세지는 다음과 같았다.
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.sparta.travelshooting.reviewPost.entity.ReviewPost.images: could not initialize proxy - no Session
나를 제외하고 팀원 분들은 모두 잘 읽어왔어서 코드에는 문제가 없었다. 컴퓨터의 문제인가 해서 재부팅도 해보고 여러가지 방법을 시도했지만 해결이 되지 않았다.
LazyInitializationException은 이 예외는 지연로딩(Lazy Loading)된 엔티티의 컬렉션을 초기화할 때 세션(Session)이 없는 경우에 발생한다고 한다. 그래서 우선
@Transactional(readOnly=true)
를 추가해주니 데이터는 잘 읽었다.
그런데도 의문이 사라지지 않았다. 왜 내 코드에서만 어노테이션을 붙여줘야 했을까??
팀원분들과 내 코드가 다른 곳은 어디일까를 생각해본 결과 application.properties부분밖에 없었고, 여기서
spring.jpa.open-in-view=false
이 한줄의 코드를 발견했다.
이 코드는 Open Session in View 패턴(OSIV)을 비활성화하는 설정이다.
OSIV는 Hibernate 세션을 오픈한 상태로 HTTP 요청이 처리되는 동안 유지하며, 이로 인해 지연로딩(Lazy Loading) 예외를 방지할 수 있다.
OSIV를 비활성화하면 Hibernate 세션을 직접 열고 닫아야 하므로 세션 관리에 주의해야 합니다. 트랜잭션 관리 및 세션 관리를 명확하게 처리해야 한다.
즉, 이 설정을 비활성화를 해놓았기 떄문에 @Transactional 어노테이션을 달아줘서 세션을 관리해줬어야 했던 것이다.
위의 코드를 지우니 다른 팀원 분들과 마찬가지로 데이터를 잘 읽어왔다. (OSIV가 활성화됐다.)
'TIL&WIL' 카테고리의 다른 글
| 2023-09-08 TIL (최종 프로젝트 배포) (0) | 2023.09.08 |
|---|---|
| 2023-09-06 TIL (email 인증기능 + redis) (0) | 2023.09.06 |
| 2023-08-25 TIL (0) | 2023.08.25 |
| 2023-08-23 TIL (0) | 2023.08.23 |
| 2023-08-22 TIL (0) | 2023.08.22 |