(Spring DB 1부) – 10. 트랜잭션 AOP / @Transactional

지금까지 편리하게 거래 처리하기 위해 트랜잭션 추상화또한 소개,

에 추가 반복적인 트랜잭션 로직 해결하기 위해 트랜잭션 템플릿또한 소개.


트랜잭션 템플릿 덕분에 트랜잭션을 처리하기 위한 반복적인 코드를 해결할 수 있었습니다..

그러나 목표는 순수한 비즈니스 로직만 서비스 계층에 남겨두는 것입니다.아직 도달하지 못한.

이때AOP프록시 실행하시면 깔끔하게 문제를 풀 수 있습니다.

참조 ) 지금 @거래 두번째 사용하면 스프링 AOP거래가 편리하게 이루어짐을 알 수 있습니다..

프록시를 통한 문제 해결

프록시 전


프록시 도입 전, 이전과 같이 서비스 로직에서 직접 트랜잭션 시작하다.

서비스에서 비즈니스 로직 및 트랜잭션 처리 논리가 뒤섞이다.

대리 도입 후


대리 : 어떻게든 대리인오전. 대신, 무언가를 다루는 사람.

클라이언트가 서비스를 직접 호출하는 대신. 프록시를 통해 호출하다.

프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 분리할 수 있습니다. 명확하게 분리할수있다.

트랜잭션 프록시는 모든 트랜잭션 처리 논리를 처리합니다..

그리고 거래를 시작한 후 대신 실제 서비스에 전화하십시오.하다.

트랜잭션 프록시를 사용하면 서비스 계층에 순수한 비즈니스 로직만 남길 수 있습니다.

트랜잭션 프록시 코드

public class TransactionProxy {
    private MemberService target;
    public void logic() { 
        //트랜잭션 시작
        TransactionStatus status = transactionManager.getTransaction(..);
        try {
            //실제 대상 호출 
            target.logic();
            transactionManager.commit(status); //성공시 커밋 
        } catch (Exception e) {
            transactionManager.rollback(status); //실패시 롤백
            throw new IllegalStateException(e);
        }
    } 
}

트랜잭션 프록시에는 호출할 실제 비즈니스 로직(대상)이 있습니다.

트랜잭션 프록시 적용 후 서비스 코드

public class Service {
    public void logic() {
//트랜잭션 관련 코드 제거, 순수 비즈니스 로직만 남음
        bizLogic(fromId, toId, money);
    }
}

Spring에서 제공하는 트랜잭션 AOP

개발자 트랜잭션 처리가 필요한 경우에게 @거래 주석을 추가하기만 하면 됩니다..

봄비지니스 AOP이 주석을 인식하고 트랜잭션 프록시 적용할 것이다.

적용 @트랜잭션

@Transactional
public void accountTransfer(String fromId, String toId, int money) throws
        SQLException {
        bizLogic(fromId, toId, money);
        }

순수한 비즈니스 로직만 남음, 모든 거래 관련 코드 제거했다.

봄 제공 거래 AOP사용하기 위해 @거래 주석 추가했다.

AOP 테스트 코드

@SpringBootTest
class MemberServiceV3_3Test

@SpringBootTest : AOP적용하다 펜 케이스가 필요합니다하다.

이 메모가 있으면 테스트 시 Spring Boot를 통해 Spring 컨테이너 생성하다.

@Autowired
MemberRepositoryV3 memberRepository;
@Autowired
MemberServiceV3_3 memberService;

그리고 테스트에서 @Autowired 등을 통해 Spring 컨테이너 관리 Bean을 사용할 수 있습니다..

@TestConfiguration
static class TestConfig {
   @Bean
   DataSource dataSource() {
      return new DriverManagerDataSource(URL, USERNAME, PASSWORD);
   }
   @Bean
   PlatformTransactionManager transactionManager() {
      return new DataSourceTransactionManager(dataSource());
   }
   @Bean
   MemberRepositoryV3 memberRepositoryV3() {
      return new MemberRepositoryV3(dataSource());
   }
   @Bean
   MemberServiceV3_3 memberServiceV3_3() {
      return new MemberServiceV3_3(memberRepositoryV3());
   }
}

@테스트 구성 : 테스트에서 내부 구성 클래스생성 및 사용시 이 주석을 첨부하면,

Spring Boot에 의해 자동으로 생성되는 Bean 추가 Spring Bean 등록 및 테스트 실행할수있다.

데이터 소스 봄에 사용되는 표준 데이터 소스를 Spring Bean으로 등록하다.

에 추가 거래 관리자에서도 사용.


DataSource트랜잭션매니저 트랜잭션 관리자를 스프링 빈으로 등록하다.

봄 제공 거래 AOPSpring Bean에 등록된 트랜잭션 매니저를 찾아서 사용때문에

트랜잭션 관리자를 스프링 빈으로 등록해야 합니다..

거래 AOP 전체 신청 흐름


0 AOP 프록시 만들기 : @거래 주석이 달린 메서드는 Spring이 트랜잭션을 강제 실행하도록 허용합니다. 프록시 만들기

AOP 프록시는 모든 트랜잭션 논리를 처리합니다. 대신 실제 서비스가 호출됩니다.

1. 고객 서비스에 전화하기: 직접 전화하는 대신 프록시를 통해 호출

2. 스프링 컨테이너를 통해 트랜잭션 관리자 확보

3. 트랜잭션 관리자를 통해 거래를 시작하다하다.

4. 데이터 소스에 대한 연결 생성

5. con.setAutoCommit(false) / 수동 커밋 모드 설정

6-7 연결 동기화: 트랜잭션 동기화 관리자에서 연결 유지

8. 프록시에서 실제 서비스 호출

9. 서비스 비즈니스 로직 작동 -> 리포지토리 호출

저장소는 트랜잭션 동기화 관리자에 있는 연결을 가져옵니다.

10. 성공 -> 커밋/예외 -> 롤백

정리하다

봄 제공 선언적 트랜잭션 관리 덕분에 우리는 마침내 순수 비즈니스 로직에서 트랜잭션 코드를 제거할 수 있었습니다..


개발자 거래가 필요한 곳 @거래 주석 추가그냥 해.

나머지는 스프링 비즈니스 AOP자동으로 처리됩니다.

전체적인 구조를 이해에 집중하자.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

Spring DB Part 1 – 데이터 액세스의 기본 원칙 – 인프라 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 처음부터 이해하고 완성할 수 있습니다. Spring DB 접근 기술의 원리와 구조를 이해하고 심층적인 백엔드 개발자로 성장할 수 있습니다.

www.inflearn.com