노트

OSIV (Open Session In View)

Open Session In View

백엔드#jpa#spring · 연결된 개념 3개

쉽게 말하면

OSIV는 공부(트랜잭션)가 끝나도 퇴실(요청 끝)할 때까지 열람실 자리를 잡아 두는 설정이에요. 나가는 길에도 책을 더 꺼내 볼 수 있어 편하지만(지연 로딩), 그동안 그 자리는 남이 못 쓰죠.

비유가 깨지는 곳 여기서 자리는 DB 커넥션이라 요청 끝까지 붙잡혀요. 스프링 부트는 기본으로 켜 두지만, API 서버는 끄고 서비스 안에서 필요한 데이터를 DTO로 다 가져오는 편이 쿼리 위치가 분명해요.

영속성 컨텍스트를 트랜잭션이 끝난 뒤에도 HTTP 요청이 끝날 때까지 열어 두는 설정. Spring Boot의 spring.jpa.open-in-view 기본값은 true이고, 이 값을 명시하지 않은 채 시작하면 경고 로그를 남긴다.

  • 켜 두면 컨트롤러·뷰에서도 지연 로딩이 동작한다. 대신 DB 커넥션(connection)을 요청 끝까지 붙잡는다
  • 끄면 필요한 데이터를 서비스(트랜잭션 안)에서 모두 가져와 DTO(Data Transfer Object)로 넘겨야 한다. 빠뜨리면 LazyInitializationException이 난다
  • API 서버는 끄고 시작하는 편이 쿼리가 어디서 나가는지 분명하다

출처: Spring Boot 문서: Open EntityManager in View

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 스프링 설정 외부화와 프로파일

    스프링 부트는 설정값을 코드 밖(application.yml·환경변수·명령줄 인자 등)에 두고, 실행 환경에 따라 다른 값을 주입하게 해 준다. 같은 빌드 산출물을 개발·QA·운영에 그대로 쓰고 설정만 바꾸는 것이 목표다.

  • 의존성 주입 (DI)

    객체가 필요한 협력 객체를 직접 new로 만들지 않고, 바깥(스프링 컨테이너)에서 넣어 받는 방식. 무엇을 언제 만들고 어떻게 연결할지의 제어가 내 코드에서 컨테이너로 넘어가므로 제어의 역전(Inversion of Control, IoC)이라고도 부른다.

  • 스프링 부트 자동 설정

    스프링 부트는 스프링 앱을 만들 때 반복되던 설정(의존성 버전 맞추기, 서블릿 컨테이너 연결, 배포)을 관례(convention over configuration)로 대신해 주는 도구다. 클래스패스(classpath)에 무엇이 있는지 보고 필요한 빈을 자동으로 등록하고, 웹 서버를 내장해 java -jar 하나로 실행된다.

  • Spring MVC 요청 흐름

    Spring MVC는 모든 HTTP 요청을 DispatcherServlet 하나가 받아, 알맞은 컨트롤러 메서드로 보내고 결과를 응답으로 바꾸는 프런트 컨트롤러(Front Controller) 구조다. 스프링 이전에는 URL마다 서블릿을 직접 만들고 매핑했다.

  • 자기 호출 문제

    Spring AOP(Aspect-Oriented Programming)에서 같은 객체 안의 메서드가 this로 다른 메서드를 부르면, 그 메서드에 붙은 부가 기능(@Transactional, @Async, @Cacheable 등)이 실행되지 않는 현상. 부가 기능은 프록시가 실행하는데, 내부 호출은 프록시를 거치지 않기 때문이다.

보기 옵션