OSIV

SeungJoo
|2024. 4. 10. 20:26
728x90

OSIV

소프트웨어 개발에서 주로 웹 애플리케이션에서 사용되는 패턴 중 하나입니다.

이 패턴은 영속성 컨텍스트를 뷰까지 확장하여 데이터베이스 트랜잭션의 영향 범위를 확장시키는 기능을 제공합니다. 주로 JPA나 Hibernate와 같은 영속성 프레임워크에서 사용됩니다.

 

일반적으로, 웹 애플리케이션에서는 클라이언트의 요청을 처리하는 동안 여러 개의 데이터베이스 조회가 발생할 수 있습니다. 이 경우, 각각의 데이터베이스 조회는 별도의 트랜잭션을 필요로 합니다. 그러나 웹 애플리케이션에서는 주로 한 번의 요청을 대해 한 번의 트랜잭션을 사용하게 됩니다.

이는 뷰를 렌더링 하기 위해 여러 데이터베이스 조회가 필요할 때 문제가 될 수 있습니다. 예를 들어 뷰에서 지연 로딩을 통해 연관된 엔티티를 로드하려고 할 때 영속성 컨텍스트가 이미 닫혀있어서 LazyInitializationException과 같은 예외가 발생할 수 있습니다. OSIV는 이러한 문제를 해결하기 위해 사용됩니다. 영속성 컨텍스트를 뷰까지 열어두어 영속성 컨텍스트가 뷰가 렌더링 되는 동안 유지되도록 합니다. 이렇게 함으로써 뷰에서 지연 로딩이나 지연 초기화가 필요한 경우에도 문제없이 처리할 수 있게 됩니다.

 

application.yml

spring:
  datasource:
    url:
    username: 
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
    open-in-view: false //기본값은 true

OSIV의 특징

  1. OSIV는 클라이언트의 요청이 들어올 때 영속성 컨텍스트를 생성해서 요청이 끝날 때까지 같은 영속성 컨텍스트를 유지합니다. 따라서 한 번 조회한 엔티티는 요청이 끝날 때까지 영속 상태를 유지합니다.
  2. 엔티티 수정은 트랜잭션이 있는 계층에서만 동작합니다. 트랜잭션이 없는 프레젠테이션 계층은 지연 로딩을 포함해서 조회만 할 수 있습니다.

OSIV의 단점

  1. OSIV를 사용하면 하나의 영속성 컨텍스트가 여러 개의 트랜잭션에서 공유될 수 있습니다. 이는 동시에 여러 요청이 처리될 때 문제를 일으킬 수 있습니다. 예를 들어, 한 트랜잭션에서 영속성 컨텍스트에 있는 엔티티를 수정하고 다른 트랜잭션에서 이를 읽어 오는 경우, 예상치 못한 결과가 발생할 수 있습니다. 이는 일관성과 예측 가능성을 해칠 수 있습니다.
  2. OSIV를 사용할 경우 프레젠테이션 계층에서 엔티티를 수정하고 비즈니스 로직을 실행하는 경우 발생할 수 있습니다. 이는 엔티티의 상태가 예상치 못하게 변경될 수 있음을 의미합니다. 예를 들어, 사용자가 화면에서 데이터의 수정하고 저장을 누른 후, 이 변경 사항이 아직 트랜잭션에 반영되지 않은 상황에서 비즈니스 로직을 실행되면 엔티티의 상태가 일관성 없게 될 수 있습니다.
  3. OSIV를 사용하면 영속성 컨텍스트가 뷰를 렌더링 하는 동안 열려 있기 때문에, 뷰에서 지연 로딩이 발생할 수 있습니다. 이는 프레젠테이션 계층에서 SQL 쿼리가 실행되는 상황을 초래할 수 있으며, 이는 프레젠테이션 계층에서 SQL 쿼터가 실행되는 상황을 초래할 수 있으며, 이는 성능 저하를 야기할 수 있습니다.

OSIV를 켤 때의 장점

개발 및 유지 보수의 용이성

OSIV를 켜면 영속성 컨텍스트가 뷰까지 열려 있기 때문에, 컨트롤러나 뷰 템플릿에서 지연로딩을 처리하기 쉽습니다. 이로 인해 개발 과정이 단순화되고 유지 보수가 용이해집니다.

엔티티 쿼리의 간편함

OSIV를 켜면 프레젠테이션 계층에서 영속성 컨텍스트에 직접 접근할 수 있기 때문에 엔티티 관리가 편리해집니다. 데이터의 변화를 뷰까지 실시간으로 반영할 수 있습니다.

OSIV를 끌 때의 장점

성능 향상

OSIV를 끄면 영속성 컨텍스트의 범위를 제한할 수 있으므로, 불필요한 데이터베이스 커넥션을 피할 수 있습니다. 특히, 대규모 트래픽을 처리하는 경우 성능 향상에 큰 영향을 줄 수 있습니다.

컨트롤되는 데이터 액세스

OSIV를 끄면 데이터 액세스를 컨트롤하기 쉬워집니다. 각각의 트랜잭션에서 명시적으로 데이터베이스 접근을 처리할 수 있으며, 이로 인해 데이터베이스 커넥션 관리가 더욱 효율적으로 이루어집니다.

정리

OSIV를 켤지 끌지 결정은 성능이나, 유지보수 편의성, 데이터 관리 등을 고려해야 합니다. 실시간 API서비스를 하는 곳은 OSIV를 끄는 것이 적합하며 관리적인 편의성이 필요한 곳에서 OSIV 키는 것이 좋을 수 있습니다.

// 자바 ORM 표준 JPA (참고)

 

728x90

'Spring(Boot & FrameWork)' 카테고리의 다른 글

벌크 연산  (0) 2024.04.29
@Not Empty  (0) 2024.04.01
Enumerated  (0) 2024.03.28