DataSource
물리적인 데이터소스(데이터베이스)정보를 담는 인터페이스
- 하나의 물리 데이터베이스를 표현
- 다양한 구현체를 사용
- EmbeddedDatabaseBuilder:HSQL, Derby, H2등 임베디드 DB 세팅할때 사용
- DataSourceBuilder:JDBC DataSourceBuilder
- DriverManagerDataSource: JDBC드라이버로 세팅하는 DataSource
- SimpleDriverDataSource: DriverManagerDataSource를 간편하게 만든 버전
- HikariDataSource:HikariCP를 connection pool로 사용하는 DataSource
TransactionManager
스프링 트랜잭션 관리 기능을 담당하는 인터페이스
- 용도에 따라 다양한 인터페이스와 구현체들이 있다
- PlatformTransactionManager, ReactiveTransactionManager
-JPATransactionManager: Spring Data JPA일반적인 상황에 사용하는 구현체, 단일 EntityManagerFactory를 사용
- DataSourceTransactionManager:단일 JDBC DataSoruce를 사용하는 구현체
- HibernateTransactionManager: 하이버네이트 SessionFactory를 사용하는 구현체
- ChainedTransactionManager:여러 개의 트랜잭션 매니저를 묶어서 사용하는 구현체
- @Deprecated (as of Boot 2.5)
JPA 수동 설정(Java code)
자바 코드로 DataSource, TransactionManager를 수동으로 세팅해야하는 경우가 있다.
- configuration properties로 커버되지 않는 세밀한 옵션을 줄때
- 다중 DataSource
- 세팅해야하는 요소는 크게 3가지
- DataSource
- EntityManagerFacoty 구현체중 LocalContainerEntityManagerFactoryBean을 사용
- 추가적인 예외 처리 기능때문에, 인터페이스 말고 구현체를 직접 빈으로 등록한다.
- PlatformTransactionManager(트랜잭션 관리)
- 세팅 구성: DataSource(DB 설정) -> EntityManagerFactory(JPA엔티티 관리) -> PlatformTransactionManager(트랜잭션 관리)
@Transactional
스프링이 애노테이션 기반 트랜잭션 관리 기능을 제공한다.
- EntityManager를 불러오고 구역을 지정하고 commit(),rollback()을직접할 필요가 없어졌다.
- 서비스 클래스, 메소드에 적용하는 것으로 간단히 트랜잭션 구역을 설정
- JpaRepository는 메소드 단위 @Transactional이 이미 붙어 있음
- 관련 애노테이션
- 스프링 테스트 지원 애노테이션: @DataJpaTest와 좋은 궁합
- @Commit
- @Rollback 이렇게 두가지 가 있다.
- javax.transaction.@Transactional: 스프링패키지가 아님, 기대하는 기능을 주지 않으므로 주의 해야한다.
Spring패키지의 @Transactional과 자동완성으로 잘못된것이 들어갈 수 잇으므로 주의하기!
@Transactional:attributes
@Transactional이 제공하는 다양한 옵션들
- transactionalManger(value): 사용할 트랜잭션 매니저를 이름으로 특정
- label: 트랜잭션을 구분짓고 식별하는 레이블
* propagation: 트랜잭션이 중첩될 경우 동작(트랜잭션 효과의 전파) 규칙(default는 REQUIRED)
- isolation: 트랜잭션 내부 데이터의 격리 레벨(default:DEFAULT)
- timeout,timeoutString:시간 제한을 거는 것이 가능
- readOnly: "이트랜잭션안에는 select만 일어남"를 표현
- 강제성 X
- 이 옵션을 처리하지 않는 트랜잭션 매니저 구현체를 사용할 경우, 별도의 예외 처리를 안함
- rollbackFor, roobackForClassName
- noRollbackFor,noRollbackForClassName
중요 @Transactional:Propagation
중첩된 트랜잭션의 동작 규칙 트랜잭션이 있는경우 없는경우로 나눠짐
중요 @Transactional:isolation
트랜잭션 내부 데이터 격리 수준
JPA 테스트
@DataJpaTest
persistence layer(Repository) 를 슬라이스 테스트하기 위한 각종 자동 설정을 지원 (테스트에서만 사용한다)
- 단순 select, insert등 기본 쿼리 메소드의 테스트를 하지는 않는 편
- 복잡한 JPQL이나 쿼리 표현을 테스트하기에 적합
- 잘사용하는 세부 기능들
- TestEntityManager: 테스트 데이터를 주입할 EntityManager를 사용할 수 있게 해준다.
- @AutoConfigureTestDatabase: 테스트용 인메모리 DB를 다른 환경으로 바꾸고자 할때
- 기타 스프링 부트 테스트 애노테이션
- @JdbcTest:Spring Data기능 없이 DataSource만 테스트
- @DataJdbcTest:DataSource+ Spring Data JDBC