[Spring] Transaction(트랜잭션)이란?

2023. 7. 25. 16:30·Spring/개념

DB의 트랜잭션 개념에 대해 학습하고 Spring에서 트랜잭션이 어떻게 동작하고 활용되는지 살펴보고자.

 

[DB] 트랜잭션이란?

트랜잭션이란? 트랜젝션은 하나의 작업을 수행하는데 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이스의 *무결성을 유지하며 DB의 상태를 변화시키기 위한 작업 수행의 논리적

s-y-130.tistory.com

 

Transaction(트랜잭션)이란?


Transaction의 탄생 배경

보다 복잡한 프로그램을 개발하다 보면 쿼리 한 줄로 해결할 수 없는 로직을 처리해야하는 경우가 많다. 그리고 여러 개의 쿼리가 처리되는 상황에서 문제가 생겨버린다면 시스템에 큰 결함을 남기게 된다. 예를 들어 쇼핑물 서비스를 구현한다고 하면 아래와 같은 로직은 한 줄로 처리하는 것이 불가능할 것이다.

 

먼저 쇼핑몰에서 상품을 구매할 때 회원의 잔여 금액이 충분한지 확인하고 잔여 금액이 상품 가격보다 높을 때 구매 로직으로 넘어가야 한다. 그리고 상품의 재고가 있는지 확인 후에 회원의 잔여 금액을 상품 가격만큼 감소시키고 로직을 종료해야 한다.

 

그런데 선택상품구매 단계에서 Exception()이 발생하여 상품이 없음에도 불구하고 있다고 판단하였거나 잔여 금액이 감소하는 찰나에 서버의 전원이 나가서 상품을 구매했는데도 회원의 잔여 금액이 감소하지 않을 수 있다. 이러한 상황은 곧바로 엄청난 비용 손실을 유발하는데, 이러한 문제를 해결하기 위해 Transaction 기술이 탄생하게 되었다.

 

 

Transaction의 기본 방법

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

 

 

 

Spring에서 Transaction의 사용법


Spring의 Transaction

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

 

 

Spring @Transactional

일반적으로 Spring에서는 Service Layer에서 @Transactional 을 추가하여 Transaction 처리를 한다.

 

아래의 예시는 상점과 관련된 Service 부분이고, 데이터의 조회만 일어나는 select 메소드에서는 @Transactional 을 활용하고 있지 않지만, 값을 추가하거나 변경 또는 삭제하는 insert, update, delete 메소드에는 @Transactional을 추가하여 트랜잭션을 설정해두었다.

package com.mang.store.service;

import com.mang.store.vo.StoreVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

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);

}

 

위의 예시는 아주 기본적인 내용들만 다루었기 때문에 이해하기에는 부족할 것이다.

 

Spring이 제공하는 트랜잭션에 대해 보다 깊이있게 이해를 원한다면 다음 글을 참고하자.

'Spring/개념' 카테고리의 다른 글
  • [Spring] 엔티티(Entity) 또는 도메인 객체(Domain Object)와 DTO를 분리해야 하는 이유
  • [Spring] JDBC 기본에 충실한 Transaction 동작 원리
  • [Spring] Spring의 3가지 핵심 특징(IoC/DI, PSA, AOP)와 3가지 계층 구조(Controller, Service, Repository)
  • [Spring] 빈(Bean)의 생성과 소멸에 대한 관리(@PostConstruct초기화와 @PreDestroy소멸자)
s_y_130
s_y_130
  • s_y_130
    About SY
    s_y_130
  • 전체
    오늘
    어제
    • 분류 전체보기 (432) N
      • JAVA (54)
        • 더 자바 8 (0)
        • JAVA (41)
        • JAVA (JVM) (13)
      • Computer Science (86)
        • CS Basic (7)
        • OOP (11)
        • Design Pattern (16)
        • Network (8)
        • HTTP (6)
        • WEB (22)
        • OS (16)
      • DataBase (29)
        • DB theory (15)
        • MySQL (14)
        • Redis (0)
      • Collection Framework (1)
        • 구현 (1)
      • Data Structure (14)
        • Linear (9)
        • Non-Linear (5)
      • Algorithm (19)
        • Basic (12)
        • 응용 (2)
        • 완전 탐색(Brute Force) (1)
        • 다익스트라 (1)
        • Algorithm Problem (3)
      • Spring (104)
        • 스프링 핵심 원리 - 기본편 (9)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 (11)
        • 스프링 DB 1편 - 데이터 접근 핵심 원리 (6)
        • 스프링 DB 2편 - 데이터 접근 활용 기술 (10)
        • 스프링 핵심 원리 - 고급편 (13)
        • 스프링 부트 - 핵심 원리와 활용 (9)
        • Spring Security 6.x (2)
        • Spring Batch (2)
        • Spring Cloud로 개발하는 MSA (1)
        • 재고시스템으로 알아보는 동시성이슈 해결방법 (4)
        • 개념 (27)
        • 테스트 (0)
        • Annotation (1)
        • Error Log (2)
      • TEST (0)
        • 부하 테스트 (0)
        • Practical Testing: 실용적인 테스트.. (0)
      • JPA (40)
        • 자바 ORM 표준 JPA 프로그래밍 (12)
        • 1편- 실전! 스프링 부트와 JPA 활용 (7)
        • 2편- 실전! 스프링 부트와 JPA 활용 (4)
        • 실전! 스프링 데이터 JPA (6)
        • 실전! Querydsl (6)
        • 개념 (5)
      • 백엔드 부트캠프[사전캠프] (35)
        • TIL (12)
        • 문제풀이 (23)
      • 백엔드 부트캠프 (1) N
        • Calculator (1) N
      • Open Source (0)
      • Book Study (1)
        • Morden Java in Action (1)
        • Real MySQL 8.0 Vol.1 (0)
        • TDD : By Example (0)
      • AWS (0)
        • EC2 (0)
      • git (2)
      • AI (22)
        • Machine Learning (17)
        • Deep Learning (0)
        • TensorFlow (1)
        • PyTorch (1)
        • YOLO (1)
        • Data Analysis (0)
        • Ai code Error (1)
        • Numpy (1)
      • MY (0)
      • WEB (15)
        • Django (3)
        • WEB 개념 (1)
        • React (1)
        • Maven (10)
      • Python (6)
      • 기초수학 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_y_130
[Spring] Transaction(트랜잭션)이란?
상단으로

티스토리툴바