[기술 정리] 15. OSIV와 Transactional

KangHo Lee's avatar
Dec 02, 2024
[기술 정리] 15. OSIV와 Transactional
// application.properties spring.jpa.open-in-view=false
@Transactional(readOnly = true) public class BoardService

OSIV false 설정과 @Transactional(readOnly = true) 설정을 같이 하는 이유

  1. 트랜잭션 경계 명확화
      • OSIV(false)
        • 데이터베이스 세션을 서비스 계층에서 시작하고 종료합니다.
        • 이는 트랜잭션 경계가 명확해져서 트랜잭션이 뷰 레이어까지 확장되지 않도록 합니다.
      • @Transactional(readOnly = true)
        • 데이터베이스 읽기 작업에 대한 트랜잭션을 명확히 설정하여 데이터 무결성을 보장합니다.
        • insert(create) 같은 작업은 메서드 별로 따로 @Transactional(readOnly = false)로 해줘야 합니다.
          • (readOnly = false) 생략 가능
  1. 지연 로딩 이슈 방지:
      • OSIV(false) 설정 시 지연 로딩된 엔티티에 접근할 때LazyInitializationException이 발생할 수 있습니다.
      • 이를 방지하기 위해 @Transactional(readOnly = true)를 사용하여 필요한 데이터를 서비스 계층에서 미리 로드합니다.
        • 이는 데이터베이스 세션이 서비스 계층 내에서만 유지되므로, 엔티티를 미리 로드함으로써 뷰 레이어에서의 예외 발생을 방지합니다.
  1. 성능 최적화
      • OSIV(false)
        • 트랜잭션이 길게 유지되지 않도록 하여 성능을 최적화합니다.
        • 데이터베이스 연결을 필요한 시간 동안만 유지하므로 리소스 사용 효율이 높아집니다.
      • @Transactional(readOnly = true)
        • 데이터 읽기 전용 트랜잭션을 사용하여 데이터베이스의 여러 최적화 기능을 활용합니다.
        • 읽기 전용 트랜잭션은 데이터 변경이 없기 때문에, 데이터베이스는 읽기 락만 설정하면 되며, 이는 락 경합을 줄여 성능을 향상시킵니다.
 
Share article

devleekangho