TIL 231008

geon·2023년 10월 8일
0

스프링 DB 1편

트랜잭션 문제 해결

트랜잭션 템플릿

트랜잭션 시작, 비즈니스 로직 실행, 트랜잭션 종료(성공시 커밋, 예외 발생시 롤백)하는 코드가 반복되는 문제 발생

템플릿 콜백 패턴을 통해 이런 문제를 해결할 수 있는데, 스프링은 TransactionTemplate이라는 템플릿 클래스를 제공함

@Slf4j
public class MemberServiceV3_2 {

//    private final PlatformTransactionManager transactionManager;
    private final TransactionTemplate txTemplate;
    private final MemberRepositoryV3 memberRepository;

    public MemberServiceV3_2(final PlatformTransactionManager transactionManager, final MemberRepositoryV3 memberRepository) {
        txTemplate = new TransactionTemplate(transactionManager); //트랜잭션 템플릿은 클래스, 트랜잭션 매니저는 인터페이스
        this.memberRepository = memberRepository;
    }

    public void accountTransfer(String fromId, String toId, int money) throws SQLException {
        txTemplate.executeWithoutResult(status -> {
            try {
                bizLogic(fromId, toId, money);
            } catch (SQLException e) {
                throw new IllegalStateException(e);
            }
        });
    }
    
    ...
}

비즈니스 로직이 정상 수행되면 커밋하고, unchecked exception이 발생하면 롤백함

반복 코드는 제거되었지만 서비스 로직에 트랜잭션 처리 로직이 들어가고, SRP에 위배됨

서비스 입장에서 비즈니스 로직은 핵심 기능이고, 트랜잭션은 부가 기능임 -> 이를 AOP를 사용해서 따로 개발할 수 있음

선언적 트랜잭션 적용

트랜잭션 프록시를 도입

트랜잭션 프록시가 트랜잭션 처리 로직을 모두 가져가고 트랜잭션 시작 후 타겟 객체의 메서드를 대신 호출함으로써 서비스 계층에는 순수 비즈니스 로직만 남길 수 있음

스프링에서는 @Transactional 어노테이션만 붙이면 트랜잭션 프록시를 적용해 줌

@Transactional은 메서드, 클래스에 모두 붙일 수 있는데, 클래스에 붙이는 경우 public 메서드가 AOP 적용 대상이 됨

스프링 부트 자동 리소스 등록

스프링 부트는 DataSourcePlatformTransactionManager를 자동으로 등록해 줌

  • DataSource
    dataSource라는 이름으로 빈 등록
    개발자가 직접 DataSource 빈을 등록하면 스프링 부트는 빈을 자동으로 등록하지 않음
    application.properties(또는 application.yml)에 있는 속성을 사용해서 DataSource 생성
    기본으로 생성하는 DataSourceHikariDataSource (관련 설정은 spring.datasource.hikari.* 와 같이 수행)
    spring.datasource.url 속성이 없으면 embedded database를 띄움

  • PlatformTransactionManager
    transactionManager라는 이름으로 빈 등록
    DataSource와 마찬가지로 개발자가 직접 등록하면 자동 등록하지 않음
    등록된 라이브러리를 기반으로 구현체를 선택함 (JdbcTransactionManager, JpaTransactionManager 등)

profile
뭐라도 적기

0개의 댓글