영어사전 : 거래, 매매, 처리 (과정)
DBMS에서 수행하는 작업의 단위
Controller에 있는 비즈니스 로직을 하나의 Transaction 단위로 Service로 옮기는 작업을 할 수 있다.
단일 쿼리로는 해결 할 수 없는 로직을 처리할 때 필요한 개념이다.
단일 쿼리로 해결 할 수 없는 로직이란?
예를 들어서, 쇼핑몰에서 상품을 구매하는 과정을 로직으로 처리한다고 상상해보면?
- 회원의 잔여 금액이 충분한지 확인.
- 잔여 금액이 상품 가격보다 높다는 것을 확인.
- 상품의 재고가 있는지 확인
- 회원의 잔여 금액을 상품가격만큼 감소
- 종료
이 과정에서 예외가 발생해서 상품이 없음에도 불구하고 있다고 판단하거나, 또는 잔여 금액이 감소하는 찰나에 서버의 전원이 나가서 상품을 구매했는데도 회원의 잔여 금액이 감소하지 않을 수도 있다.
이런 문제를 해결하기위해서 Transaction 기술이 나옴.
출처 : https://mangkyu.tistory.com/50
Transaction은 2개 이상의 쿼리를 하나의 커넥션으로 묶어 DB에 전송하고, 이 과정에서 에러가 발생할 경우 자동으로 모든 과정을 원래대로 되돌려 놓는다. 이러한 과정을 구현하기 위해 Transaction은 하나 이상의 쿼리를 처리할 때 동일한 Connection 객체를 공유하도록 한다.
출처 : https://mangkyu.tistory.com/50
출처 https://goddaehee.tistory.com/167
@transactional
을 선언하여 사용하는 방법이 일반적이며, 선언적 Transaction이라고 부른다.@Transactional
을 추가 할 수 있다. 추가되면, 해당 클래스에 Transaction 기능이 적용된 프록시 객체가 생성된다.@Transactional
이 포함된 메서드가 호출 될 겨우, PlatformTransactionManager 을 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback 한다.출처 https://goddaehee.tistory.com/167
스프링은 코드 기반의 트랜잭션(Programmatic Transaction) 처리 뿐만 아니라 선언적 트랜잭션(Declarative Transacton)을 지원한다. 스프링이 제공하는 Transaction template class를 이용하거나 설정파일, Annotaion을 이용해서 Transaction의 범위 및 규칙을 정의할 수 있다. 스프링에서는 주로 Declarative Transaction을 지원하는데, <tx:advice>
태그 또는 @Transactional
어노테이션을 이용한다. 쿼리문을 처리하는 과정에서 에러가 났을 경우 자동으로 Rollback 처리를 해준다.
일반적으로 스프링에서는 Service Layer에서 @Transactional
을 추가하여 Transaction 처리를 한다. 아래의 예시는 상점과 관련된 Service 부분이고, 데이터의 조회만 일어나는 select 메서드에서는 @Transactional
을 활용하고 있지 않지만, 값을 추가하거나 변경 또는 삭제하는 insert, update, delete 메서드에는 @Transactional
을 추가하여 Transaction을 설정해두었다.
public interface StoreService {
List<StoreVO> selectStoreInfoList(StoreVO storeVO);
StoreVO selectStoreInfo(StoreVO storeVO);
@Transactional
int insertStoreInfo(StoreVO storeVO);
@Transactional
int updateStoreInfo(StoreVO storeVO);
@Transactional
int deleteStoreInfo(StoreVO storeVO);
}
질문
그래서 지금 사용법 이렇게 하면 위에서 말한대로 Connection이 만들어진다는 것인가?
출처:
https://goddaehee.tistory.com/167
https://mangkyu.tistory.com/50