개발 무지렁이

[Spring] Spring Framework Transaction과 AOP, Transaction Manager 본문

Backend/스프링

[Spring] Spring Framework Transaction과 AOP, Transaction Manager

Gaejirang-e 2023. 5. 10. 23:26

📌.트랜잭션(Transaction)이란?

: 데이터의 조작이 일어나는 여러 작업 프로세스하나의 단위로 묶어
일관성있게 commit or rollback할 수 있게 하는 것을 말한다.
원자성 부여.
(하나의 작업이라도 실패하면 모두 실패)

ex. 💰 결제와 동시에 좌석할당
결제를 수행 + 결제내역 저장 + 구매내역 저장

Spring Framework Transaction


📌. Transaction 동작원리

Caller -> AOP Proxy -> Transaction Advisor(transaction 생성) -> Custom Advisor(s) -> Target Method
-> Custom Advisor(s) -> Transaction Advisor(commit or rollback) -> AOP Proxy -> Caller


 🚀 Transaction 모듈AOP 기반으로 만들어졌다.

  • 사전처리(transaction 시작), 사후처리(commit, rollback)
     (advice가 이미 around방식으로 만들어져있다.)

  • 크게는 인터페이스 단위에서, 작게는 method 단위까지 세분화하여 Transaction을 컨트롤할 수 있다.


    Platform Transaction Manager(Interface, 기반코드)와
    Transaction 구현체 (설정 ⚙️)


  <!-- oracle 연결 -->
  <beans:bean id="dataSource" 
              class="org.apache.commons.dbcp.BasicDataSource"
                     p:driverClassName="${jdbc.oracle.driver}"
                    p:url="${jdbc.oracle.url}"
                    p:username="${jdbc.oracle.username}"
                    p:password="${jdbc.oracle.password}"
                    p:maxActive="10" />
  <!-- transaction관련 설정 -->
  <beans:bean id="transactionManager" class="org.springframwork.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </beans:bean>

💡. DataSourceTransactionManager의 내부 동작.(DataSource객체 필요)

transaction 생성 -> 여러 작업이 Connection(SqlSession) 공유 -> commit or rollback (transaction end)

: DataSource에서 획득할 Java.sql.Connection 객체를 이용하여 트랜잭션을 관리한다.
(connection을 관리하려면 connection을 획득해야한다.)

Transaction 전파


  - 'REQUIRED': method를 수행하는데 트랜잭션이 필요하다, 이미 존재하면 해당 트랜잭션을 사용한다.
  - 'MANDATORY': 'REQUIRED'와 대부분 같지만, 트랜잭션이 존재하지 않을 경우 Exception 발생.
  - 'REQUIRES_NEW': 항상 새로운 트랜잭션을 시작한다. 이미 존재하면 잠시 중지하고 새로운 트랜잭션을 시작한다.
  - 'SUPPORTS': method가 트랜잭션을 필요로 하지는 않지만, 이미 존재하면 트랜잭션을 사용한다.
  - 'NOT_SUPPORTS': method가 트랜잭션을 필요로 하지 않는다, 이미 존재하면 트랜잭션을 일시 중지.
  - 'NEVER': 'NOT_SUPPORTS'와 대부분 같지만, 이미 존재하면 Exception 발생.
  - 'NESTED': 이미 트랜잭션이 존재하면 중첩된 트랜잭션에서 method를 실행
Comments