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