코딩못하는사람

@Transactional의 동작방식(AOP,PSA) 본문

스프링(Spring)/개념

@Transactional의 동작방식(AOP,PSA)

공부절대안함 2022. 1. 3. 20:08

@Transactional 어노테이션을 AOP와 PSA의 관점에서 공부해보았다.

 

AOP(Aspect Oriented Programming)

@Transactional 어노테이션을 사용하면 별도의 트랜잭션 관련 코드없이 트랜잭션 서비스를 이용할 수 있다. 트랜잭션에 대한 공통 코드를 어노테이션이 AOP를 통해 대신 처리해주어 우리가 구현해야 할 비즈니스 로직에 집중할 수 있게 해주는 것이다.

 

Spring에서는 Proxy pattern을 이용해 AOP를 구현한다. @Transactional을 사용하고 있는 aspect를 보자.

 

@Transactional어노테이션이 붙어있는 곳에서 transactionalMethodExecution메서드를 실행하라는 aspect이다.

 

 

transactionalMethodExecution를 보면 aop의 around를 사용하여 invokeWithinTransaction 메서드에서

 

 

  • 트랜잭션을 생성하는 부분
  • 우리가 구현한 서비스를 실행시키는 부분(proceed(txObject))
  • 트랜잭션을 해제하는 부분

이러한 프록시 패턴 방식으로 구현되어 우리는 항상 proceedWithInvocation() 부분만 신경을 써서 나머지 트랜잭션 처리에 대한 코드를 신경쓰지 않고 트랜잭션을 사용할 수 있던 것이다.

 

PSA

트랙잭션을 통해 DB에 접근하는 방법은 여러가지이다.Jdbc를 통한 접근(DatasourceTransactionManager)할 수 있으며 ORM을 이용하고자한다면 JPA(JpaTransactionManager)를 사용하는등 여러가지 방법이 있다. 하지만 우리는 @Transactional 어노테이션만 사용하면 어떤 TransactionManager를 사용하던 기능을 사용할 수 있다. 이렇게 같은 기능을 하는 여러 서비스들을 하나의 추상화로 묶어놓은 것을 PSA(Protable Service Abstraction)이라고 한다.

 

토비의 스프링 3.1 5장

 

따라서 @Transactional 어노테이션은 JDBC에 특화된 DatasourceTransactionManager, JPA에 특화되어 Entity Manager를 사용하는 JPATransactionManager를 각각 구현하는 것이 아니라, 최상위 추상화 인터페이스인 PlatformTransactionManager를 만들고 각각의 TransactionManager가 구현하도록 만들어서 DI로 주입받아 사용하도록 만들었다.

 

https://sabarada.tistory.com/127?category=803157

 

위 코드는 Transaction을 사용할 때 특정 기술에 국한되지 않고 같은 기능을 수행해 낼 수 있는 Spring PSA를 보여주는 코드이다.

이러한 PSA 를 통해 우리는 DB 트랜잭션 방식을 사용하던 문제없이 비즈니스 로직에만 집중할 수 있다.

 

 

공부한 곳 및 출처

https://sabarada.tistory.com/category/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/Spring

토비의 스프링 3.1

'스프링(Spring) > 개념' 카테고리의 다른 글

@AuthenticationPrincipal 어노테이션  (0) 2022.01.02
Filter와 Interceptor  (0) 2021.12.30
스프링과 스프링부트  (0) 2021.09.17
스프링이 무엇이고 왜 나왔을까?  (1) 2021.09.17
객체지향 설계 5원칙-SOLID  (0) 2021.09.17
Comments