트랜잭션 쪽을 공부하던 도중 아래와 같은 WARN 메세지가 떴다. 이에 대해 알아보던 도중 OSIV와 관련된 메세지인 것을 알게 되었다. 공부한 내용을 정리해보자!
spring.jpa.open-in-view
: true
(기본값)다음은 default(true)값으로 설정하고 Application 실행 시 뜨는 warning 메세지다.
언제 jpa가 DB Connection을 가져오고, 언제 반환을 할지에 대한 문제
OSIV가 켜져있으면, Controller에서 클라이언트에게 응답을 보내주기까지 트랜잭션을 물고있는다. 즉 DB 커넥션 반환을 끝날 때까지 안 한다.
why? 예를 들어 fetch type이 LAZY로 설정되어 있을 때, 프록시 객체를 호출할 일이 생겼을 때, 프록시 초기화가 필요하다. 이 때 영속성 컨텍스트가 DB 커넥션을 물고 살아있어야 하기 때문.
하지만 이 전략의 치명적인 단점은, 너무 오랫동안 DB 커넥션을 물고 있는다. 그렇기 때문에 실시간 트래픽이 중요한 서비스에서는 커넥션을 너무 오래 들고 있기 때문에, 커넥션이 모자랄 수 있다.
spring.jpa.open-in-view
: false
org.hibernate.LazyInitializationException: could not initialize proxy
true
의 경우, Entity를 LAZY로딩 기술 등을 Controller나 View에서 적극 활용이 가능CQRS(Command and Query Responsibility Segregation)
데이터 저장소에 대한 읽기 및 업데이트 작업을 구분하여 명령과 조회의 책임 분리