[스프링] Transaction

Kyu·2021년 3월 26일
0

Spring 공부기록

목록 보기
7/10

Transaction 이란?

  • 영어사전 : 거래, 매매, 처리 (과정)

  • DBMS에서 수행하는 작업의 단위

  • Controller에 있는 비즈니스 로직을 하나의 Transaction 단위로 Service로 옮기는 작업을 할 수 있다.

  • 단일 쿼리로는 해결 할 수 없는 로직을 처리할 때 필요한 개념이다.

    단일 쿼리로 해결 할 수 없는 로직이란?

    예를 들어서, 쇼핑몰에서 상품을 구매하는 과정을 로직으로 처리한다고 상상해보면?

    1. 회원의 잔여 금액이 충분한지 확인.
    2. 잔여 금액이 상품 가격보다 높다는 것을 확인.
    3. 상품의 재고가 있는지 확인
    4. 회원의 잔여 금액을 상품가격만큼 감소
    5. 종료

    이 과정에서 예외가 발생해서 상품이 없음에도 불구하고 있다고 판단하거나, 또는 잔여 금액이 감소하는 찰나에 서버의 전원이 나가서 상품을 구매했는데도 회원의 잔여 금액이 감소하지 않을 수도 있다.

    이런 문제를 해결하기위해서 Transaction 기술이 나옴.

출처 : https://mangkyu.tistory.com/50

Transaction 기술

Transaction은 2개 이상의 쿼리를 하나의 커넥션으로 묶어 DB에 전송하고, 이 과정에서 에러가 발생할 경우 자동으로 모든 과정을 원래대로 되돌려 놓는다. 이러한 과정을 구현하기 위해 Transaction은 하나 이상의 쿼리를 처리할 때 동일한 Connection 객체를 공유하도록 한다.

출처 : https://mangkyu.tistory.com/50

Transaction의 성질

  • 원자성(Atomicity) : 한 Transaction 내에서 실행한 작업들은 하나로 간주한다. 즉, 모두 성공 또는 모두 실패.
  • 일관성(Consistenct) : Transaction은 일관성 있는 DB 상태를 유지한다. (data integrity 만족 등)
  • 격리성(Isolation) : 동시에 실행되는 Transaction들이 서로 영향을 미치지 않도록 격리해야한다.
  • 지속성(Durability) : Transaction을 성공적으로 마치면 결과가 항상 저장되어야 한다.

출처 https://goddaehee.tistory.com/167

스프링과 Transaction

  • 스프링에서 Annotation 방식으로 @transactional 을 선언하여 사용하는 방법이 일반적이며, 선언적 Transaction이라고 부른다.
  • 클래스나 메서드 위에 @Transactional 을 추가 할 수 있다. 추가되면, 해당 클래스에 Transaction 기능이 적용된 프록시 객체가 생성된다.
  • 이 프록시 객체는 @Transactional 이 포함된 메서드가 호출 될 겨우, PlatformTransactionManager 을 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback 한다.

출처 https://goddaehee.tistory.com/167

스프링에서 Transaction 사용법

스프링은 코드 기반의 트랜잭션(Programmatic Transaction) 처리 뿐만 아니라 선언적 트랜잭션(Declarative Transacton)을 지원한다. 스프링이 제공하는 Transaction template class를 이용하거나 설정파일, Annotaion을 이용해서 Transaction의 범위 및 규칙을 정의할 수 있다. 스프링에서는 주로 Declarative Transaction을 지원하는데, <tx:advice> 태그 또는 @Transactional 어노테이션을 이용한다. 쿼리문을 처리하는 과정에서 에러가 났을 경우 자동으로 Rollback 처리를 해준다.

출처 : https://mangkyu.tistory.com/50

일반적으로 스프링에서는 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://mangkyu.tistory.com/50

출처:
https://goddaehee.tistory.com/167
https://mangkyu.tistory.com/50

profile
TIL 남기는 공간입니다

0개의 댓글