일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 문자열
- 위상정렬
- BFS
- dataframe
- disjoint set
- equals
- ddd
- 알고리즘
- 헥사고날 아키텍처
- DP
- series
- 세그먼트 트리
- 다익스트라
- 자바
- JPA
- springboot
- 포트앤어댑터 아키텍처
- 파이썬
- 이펙티브 자바
- pandas
- spring security
- 스프링
- UML
- Redis
- 백준
- dfs
- 비트마스크
- docker
- java
- 데이터 flow
- Today
- Total
코딩못하는사람
@Transactional의 동작방식(AOP,PSA) 본문
@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)이라고 한다.
따라서 @Transactional 어노테이션은 JDBC에 특화된 DatasourceTransactionManager, JPA에 특화되어 Entity Manager를 사용하는 JPATransactionManager를 각각 구현하는 것이 아니라, 최상위 추상화 인터페이스인 PlatformTransactionManager를 만들고 각각의 TransactionManager가 구현하도록 만들어서 DI로 주입받아 사용하도록 만들었다.
위 코드는 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 |