인프런 수업 강의를 듣고 정리한 내용입니다.
Open Session In View: 하이버네이트
Open EntityManager In View: JPA
(관례상 OSIV라 한다.)
spring.jpa.open-in-view : true
기본값
이 기본값을 뿌리면서 애플리케이션 시작 시점에 warn 로그를 남기는 것은 이유가 있다.
이유
View Template
이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다.
✏️ 장단점
장점 : 엔티티를 적극 활용해서 지연 로딩 기술을Controller
와View
에서 적극 활용할 수 있다. 중복 줄이고, 투명하게 지연 로딩을 많이 활용할 수 있어, 코드 유지 보수성을 살릴 수 있다.
단점 : 데이터베이스 연결을 너무 오랫동안 하고 있는다!
spring.jpa.open-in-view : false
OSIV 종료
view template
에서 지연로딩이 동작하지 않는다.
✏️ 장단점
장점 : 데이터베이스 연결 시간이 짧다. 트랜잭션이 되는 순간 영속성 컨텍스트, 데이터베이스 연결이 끝나버린다. 커넥션을 원할하게 사용할 수 있다.
단점 : OSIV를 끄면 모든 지연로딩을 트랜잭션 안에서 처리해야 한다.
실무에서는
Command
와Query
를 분리하여OSIV
를 끈 상태로 복잡성을 관리하는 방법을 사용한다.
그래서 크고 복잡한 애플리케이션을 개발한다면, 이 둘의 관심사를 명확하게 분리하는 것은 유지보수 관점에서 매우 좋다.
OrderService
OrderService
: 핵심 비즈니스 로직OrderQueryService
: 화면이나 API에 맞춘 서비스 (주로 읽기 전용 트랜잭션 사용)보통 서비스 계층에서 트랜잭션을 유지한다. 두 서비스 모두 트랜잭션을 유지하면서 지연 로딩을 사용할 수 있다.
💡 참고
- 강사님께서는 고객 서비스의 실시간 API는
OSIV를 끄고
,ADMIN
처럼 커넥션을 많이 사용하지 않는 곳에서는OSIV를 켠다
.