지금까지 편리하게 거래 처리하기 위해 트랜잭션 추상화또한 소개,
에 추가 반복적인 트랜잭션 로직 해결하기 위해 트랜잭션 템플릿또한 소개.
트랜잭션 템플릿 덕분에 트랜잭션을 처리하기 위한 반복적인 코드를 해결할 수 있었습니다..
그러나 목표는 순수한 비즈니스 로직만 서비스 계층에 남겨두는 것입니다.아직 도달하지 못한.
이때 봄 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