본문 바로가기
Dev/JPA

[JPA] JPA 활용 II - API 개발 고급 (실무 필수 최적화)

by dev_jsk 2021. 10. 20.
728x90
반응형

OSIV (Open Session In View)

영속성 컨텍스트를 View까지 열어두는 전략이다. 영속성 컨텍스트가 유지되면 엔티티도 영속 상태로 유지되기 때문에 View에서도 지연로딩을 사용할 수 있다.

※ 하이버네이트에선 Open Session In View라고 부르며 JPA에선 Open EntityManager In View라고 부른다.

OSIV 설정

// application.yml
spring:
  jpa:
    open-in-view: false // ON : true(default), OFF : false

OSIV ON

OSIV가 ON일 경우 영속성 컨텍스트 생존 범위

OSIV 전략을 사용할 경우 트랜잭션 시작부터 고객의 요청에 따른 처리결과가 반환될 때 까지 DB 커넥션을 유지하고 있는 것이다. DB 커넥션을 계속 유지함으로써 View Template나 API 컨트롤러에서 지연로딩이 가능하다. 그러나 이 전략은 너무나 오래 DB 커넥션 리소스를 사용하기 때문에 실시간 트래픽이 중요한 애플리케이션이나 외부 API를 호출하면 DB 커넥션 반환이 늦어지거나 못할 수 있어 커넥션이 모자라 장애로 이어질 수 있다.

※ OSIV 전략 사용 시 애플리케이션 구동 시 'spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning' 경고 로그를 남긴다.

※ 지연로딩은 영속성 컨텍스트가 살아있어야 하고 영속성 컨텍스트는 기본적으로 DB 커넥션이 유지되어야 한다.

OSIV OFF

OSIV가 OFF일 경우 영속성 컨텍스트 생존 범위

OSIV 전략을 사용하지 않을 경우 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고 DB 커넥션도 반환한다. 따라서 DB 커넥션 리소스를 낭비하지 않는다. 그러나 지연로딩을 트랜잭션 내에서 처리해야 하며 View Template에서는 지연로딩이 동작하지 않는다.

커맨드와 쿼리 분리

실무에서 OSIV 전략을 OFF한 상태로 복잡성을 관리하는 좋은 방법으로는 Command와 Query를 분리하는 것이다. 화면이나 API에 맞춘 서비스를 별도로 구성하여 읽기 트랜잭션을 선언하여 지연로딩을 구현, 사용한다.

※ 참고 : https://en.wikipedia.org/wiki/Command–query_separation

 

Command–query separation - Wikipedia

Command–query separation (CQS) is a principle of imperative computer programming. It was devised by Bertrand Meyer as part of his pioneering work on the Eiffel programming language. It states that every method should either be a command that performs an

en.wikipedia.org

OSIV 전략 선택 고려사항

고객 서비스의 실시간 API는 OSIV를 OFF하고 ADMIN처럼 DB 커넥션을 많이 사용하지 않는 곳은 OSIV를 ON하여 사용하는 것을 권장한다.

728x90
반응형

댓글