22/05/31 DataSource,TransactionManager

김석진·2022년 6월 1일
0

다시 초심으로

목록 보기
15/19

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
profile
주니어 개발자 되고싶어요

0개의 댓글