트랜잭션 AOP

JIWOO YUN·2024년 4월 18일
0

SpringDB

목록 보기
11/11
post-custom-banner

트랜잭션 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);
        }
    }
}

AOP를 적용한 코드

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

    bizLogic(fromId, toId, money);

}

Transactional 어노테이션을 통해서 스프링이 제공하는 트랜잭션 AOP를 사용

  • 비즈니스 로직만 남게되고 트랜잭션 관련 코드는 모두 제거됨.

선언적 트랜잭션 과 프로그래밍 방식 트랜잭션

  • 선언적 트랜잭션 관리

    • @Transaction 애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것

    • 해당 로직에 트랜잭션을 적용하겠다 하고 어딘가에 선언하기만 하면 트랜잭션이 적용됨.

    • 훨씬 간편하고 실용적이기 때문에 실무에서는 대부분 선언적 프로그래밍을 사용한다고 한다.
  • 프로그래밍 방식 트랜잭션 관리

    • 트랜잭션 매니저 또는 트랜잭션 템플릿 등을 사용해서 트랜잭션 관련 코드를 직접 작성하는 방식

    • 스프링 컨테이너나 AOP 기술없이 간단히 사용할 수 있지만 대부분 스프링 컨테이너와 스프링 AOP를 사용하기 때문에 거의 사용되지 않음.

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

  • 스프링부트 등장전에는 데이터소스와 트랜잭션 매니저를 개발자가 직접 빈에 등록해서 사용
    • 스프링부트로 개발을 시작시 데이터소스나 트랜잭션 매니저를 직접 등록한 적이 없을것이다.
데이터소스 - 자동 등록
  • 스프링부트는 데이터소스를 스프링 빈에 자동으로 등록을 진행한다.
  • 개발자가 직접 데이터소스를 빈에 등록시에는 자동으로 등록하지 않음.
트랜잭션 매니저 - 자동등록
  • 스프링부트가 적절한 트랜잭션 매니저를 자동으로 빈에 등록
  • 마찬가지로 개발자가 직접 트랜잭션 매니저를 빈에 등록시 자동으로 등록되지 않음.
스프링부트는 application.properties에 있는 속성을 사용해서 DataSource를 생성 해준다.(스프링부트 굉장하다.)
  • yml 파일도 동일
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=
  • properties에 맞춰서 dataSource생성 진행
  • 트랜잭션 매니저의 경우에도 등록된 라이브러리에 맞춰서 빈을 등록해준다.
    • JDBC 기술을 사용하면 DataSourceTransactionManager를 등록하고
    • JPA 기술 사용시 JpaTransactionManager를 빈으로 등록해준다.
    • 둘다 사용하면 JpaTransactionManager를 등록 진행.
      • JpaTransactionManager 는 DataSourceTransactionManager 가 제공하는 기능도 대부분 지원

Spring AOP

  • 관점 지향 프로그래밍
    • 흩어진 관심사들을 하나로 모듈화 한 것
    • 여러군데서 사용되는 중복 코드를 떼어내서 분리하고 자신이 해야할 작업만 가지고 있자는 개념
  • 프록시 패턴을 사용하여 AOP의 효과를 낸다.
    • 어떤 클래스가 SpringAOP의 대상이라면 기존 클래스의 빈이 만들어 질때 SpringAOP가 프록시를 자동으로 만들고 원본 클래스 대신 프록시를 빈으로 등록 -> 원본 클래스가 사용되는 지점에서 프록시를 대신 사용

참고 블로그 : [Spring] 스프링 AOP 개념 이해 및 적용 방법 (tistory.com)

[Spring] AOP와 @Transactional의 동작 원리 (velog.io)

profile
열심히하자
post-custom-banner

0개의 댓글