목차
1. DataSource
2. @Transactional
1. DataSource
1) base
- 물리적인 데이터소스(데이터베이스) 정보를 담는 인터페이스
- 하나의 물리 데이터베이스를 표현
- 다양한 구현체를 사용
- EmbeddedDatabaseBuilder: HSQL, Derby, H2 등 임베디드 DB 세팅할 때 사용
- DataSourceBuilder: JDBC DataSource 빌더
- DriverManagerDataSource: JDBC 드라이버로 세팅하는 DataSource
- SimpleDriverDataSource: DriverManagerDataSource를 간편하게 만든 버전
- HikariDataSource: HikariCP를 connection pool로 사용하는 DataSource
- etc.
2) TransactionManager
- 스프링 트랜잭션 관리 기능을 담당하는 인터페이스
- 용도에 따라 다양한 인터페이스와 구현체들
- PlatformTransactionManager, ReactiveTransactionManager
- JpaTransactionManager: Spring Data JPA 일반적인 상황에 사용하는 구현체, 단일 EntityManagerFactory를 사용
- DataSourceTransactionManager: 단일 JDBC DataSource를 사용하는 구현체
- HIbernateTransactionManager: 하이버네이트 SessionFactory를 사용하는 구현체
- ChainedTransactionManager: 여러 개의 트랜잭션 매니저를 묶어서 사용하는 구현체
Deprecated 되었다. (SpringBoot 2.5~)
- etc
JPA DB 수동 설정(Java code)
- 자바 코드로 DataSource, TransactionManager를 수동 세팅해야 하는 경우가 있다.
- 언제?
- configuration properties로 커버되지 않는 세밀한 옵션을 줄 때
- 다중 DataSource
- 세팅해야 하는 요소
- DataSource
- EntityManagerFactory -> LocalContainerEntityManagerFactoryBean
(추가적인 예외 처리 기능 때문에, 인터페이스 말고 구현체를 직접 빈으로 등록해야 한다!)
- PlatformTransactionManager
- 세팅 구성:
DataSource (DB설정) -> EntityManagerFactory (JPA 엔티티 관리) -> PlatformTransactionManager (트랜잭션 관리)
2. @Transactional
1) @Transactional
- 스프링이 애노테이션 기반 트랜잭션 관리 기능을 제공
- EntityManager 불러오고 -> 구역 지정하고 -> commit(), rollback() 직접 할 필요 없다!!
- 서비스 클래스, 메소드에 적용하는 것으로 간단히 트랜잭션 구역을 설정
- JpaRepository는 메소드 단위
@Transactional
이 이미 붙어있음
- 관련 애노테이션
- 스프링 테스트 지원 애노테이션:
@DataJpaTest
와 좋은 궁합
javaxm.transaction.@Transactional
: 스프링 패키지가 아님, 기대하는 기능을 주지 않으므로 주의
2) @Transactional: attribute
@Transactional
이 제공하는 다양한 옵션들
- transactionManager(value): 사용할 트랜잭션 매니저를 이름으로 특정
- label: 트랜잭션 구분 짓고 식별하는 레이블
- propagation: 트랜잭션이 중첩될 경우 동작(트랜잭션 효과의 전파) 규칙(default: REQUIRED)
- isolation: 트랜잭션 내부 데이터의 격리 레벨(default: DEFAULT)
- timeout, timeoutString: 시간 제한을 거는 것이 가능
- readOnly: "이 트랜잭션 안에서는 select만 일어난다"를 표현
- 강제성이 없음을 주의 - 힌트로 생각하자
- 이 옵션을 처리하지 않는 트랜잭션 매니저 구현체를 사용할 경우, 별도의 예외처리를 안 함
- rollbackFor, rollbackForFClassName
- noRollbackFor, noRollbackForClassName
3) @Transactional: Propagation
- 중첩된 트랜잭션의 동작 규칙
- REQUIRED(default): 현재 트랜잭션이 있으면 보조, 없으면 새로 만들기
- SUPPORTS: 현재 있으면 보조, 없으면 트랜잭션 없이 실행
- MANDATORY: 있으면 보조, 없으면 예외 처리
- REQUIRES_NEW: 트랜잭션 생성하고 실행, 현재 있던 것은 미룸
- NOT_SUPPORTED: 트랜잭션 없이 실행, 현재 있던 것은 미룸
- NEVER: 트랜잭션 없이 실행, 현재 트랜잭션이 있었으면 예외 처리
- NESTED: 현재 있으면 그 안에서 중첩된 트랜잭션 형성
4) @Transactional: isolation
- 트랜잭션 내부 데이터의 격리 수준
- DEFAULT: 데이터베이스에게 맡김
- READ_UNCOMMITED: dirty read + non-repeatable read + phantom read
- READ_COMMITTED: non-repeatable read + phantom read
- REPEATABLE_READ: phantom read
- SERIALIZABLE: 완전 직렬 수행