Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[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. 💰 결제와 동시에 좌석할당
결제를 수행 + 결제내역 저장 + 구매내역 저장
: 데이터의 조작이 일어나는 여러 작업 프로세스를 하나의 단위로 묶어
일관성있게 commit or rollback할 수 있게 하는 것을 말한다.
원자성 부여.
(하나의 작업이라도 실패하면 모두 실패)
ex. 💰 결제와 동시에 좌석할당
결제를 수행 + 결제내역 저장 + 구매내역 저장
Spring Framework Transaction
Caller -> AOP Proxy -> Transaction Advisor(transaction 생성) -> Custom Advisor(s) -> Target Method
-> Custom Advisor(s) -> Transaction Advisor(commit or rollback) -> AOP Proxy -> Caller
-> 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를 실행
'Backend > 스프링' 카테고리의 다른 글
[Spring] 개발 및 테스트환경에 적합한 경량화된 DBMS, H2 (0) | 2023.09.10 |
---|---|
[Spring] 의존성 주입(DI)에 의한 의존관계 조립 (0) | 2023.09.09 |
[Spring] myBatis-spring와 주요설정(JNDI: DataSource) (0) | 2023.05.08 |
[Spring] Spring webMVC 동작순서 (1) | 2023.05.06 |
[Spring] webMVC directory 구조와 루트(${pageContext.request.contextPath}), WEB-INF (0) | 2023.05.05 |
Comments