5.글쓰기 기능 트랜잭션(Transaction)

강재영's avatar
Aug 16, 2024
5.글쓰기 기능 트랜잭션(Transaction)
 

1.글쓰기기능

package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; //임포트는 알트 + enter @Repository //@Repository를 붙이면 스프링이 new를 해서 Ioc(컬렉션 List 자료형 같은거) 에 저장한다. public class BoardRepository { @Autowired//Ioc에 있는 객체를 찾아온다. private EntityManager em; public BoardRepository() { System.out.println("BoardRepository 생성자"); } //insert 하기 @Transactional // db의 변경요청시에는 해줘야하한다. public void save(String title, String content) { Query query = em.createNativeQuery("insert into board_tb(title, content, create_at) values (?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.executeUpdate(); } }
 
@Repository를 사용해서 ioc 컨테이너가 관리하는 bean에 저장한다.

IoC 컨테이너와 빈의 개념

 
  • IoC 컨테이너
    • 스프링의 핵심 개념 중 하나로, 애플리케이션에서 객체의 생성, 의존성 주입, 생명주기 관리 등을 책임집니다. IoC(제어의 역전)라는 용어는 애플리케이션 코드가 객체를 생성하고 관리하는 것을 스프링 컨테이너가 대신한다는 의미를 내포합니다.
  • 빈(Bean)
    • 스프링 IoC 컨테이너가 관리하는 객체를 빈(bean)이라고 합니다. 스프링 컨테이너에 의해 생성되고 관리되는 객체는 모두 빈으로 간주됩니다.
    • 빈은 스프링 컨테이너에 등록되고, 필요할 때 의존성 주입을 통해 애플리케이션의 다른 부분에서 사용됩니다.
 

트랜잭션이란

💡
트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위해 여러개의 쿼리를 하나로 묶은 작업의 단위이다. 트랜잭션은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolastion), 지속성(Durability) 4가지 특징을 갖는다. 이 앞글자를 따서 ACID 특징 이라고 부른다.
 

ACID 특징

 

원자성(Atomicity)

트랜잭션을 구성하는 작업 전체가 성공하거나, 아니면 전체가 실패하는 것 둘 중 하나만을 보장하는 특징이다. 트랜잭션을 구성하는 여러 쿼리 중 일부분만 성공하거나, 일부분만 실패하면 문제가 발생할 것 이다.
예시로 은행 시스템의 송금 과정을 구현하는 상황을 가정해보자. 송금 과정은 아래의 Operation 들의 순서로 이루어질 것이다.
  1. 계좌 잔액 테이블에서 송금자 A의 잔액을 차감한다.
  1. 계좌 잔액 테이블에서 돈을 받는 B의 잔액을 추가한다.
  1. 거래 내역 테이블에서 A가 B로 송금한 내역을 추가한다.
그런데 이 과정에서 3번 Operation 이 실패한다면, A와 B의 계좌 잔액은 변경되겠지만 그 거래내역은 데이터베이스 어디에서도 찾아볼 수 없을 것 이다.
 

일관성(Consistency)

트랜잭션 실행 이전의 데이터베이스가 Correct State 였다면, 트랜잭션 실행 이후의 데이터베이스도 Correct State 임을 보장해야하는 특징이다. 이때, Correct State 란 도메인의 유효범위, 무결성 제약조건을 만족하는 상태를 의미한다. 예를 들어, 계좌 잔액의 도메인 유효범위는 0이상일 것 이다. 마이너스 통장이 아닌 이상 잔액이 0인 잔고에서 출금을 할 수 없을 것 이다.
 

격리성(Isolation)

실행중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없는 특징이다. 트랜잭션과 관련된 격리성 이슈와 이를 해결하기 위한 격리 수준에 대해서는 좀 더 깊게 공부하고 별개의 포스팅으로 남길 계획이다.
 

지속성(Durability)

성공적으로 완료(Commit)된 트랜잭션은 영원히 반영되어야 하는 특징을 의미한다.
 
 
 

Commit 과 Rollback 연산

 

Commit

트랜잭션을 구성하는 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어이다. '커밋이 수행되었다' 는 '하나의 트랜잭션이 성공적으로 수행되었다' 와 동치이다.
notion image
 

Rollback

에러나 이슈가 발생했을 때 데이터베이스를 트랜잭션 커밋 이전으로 돌리는 작업.
notion image
 
 
 
트랜잭션이 걸린 데이터에 계속해서 수정을 해야 하는 트랜잭션이 걸리면 wait가 걸리고 계속 기다려야 하기에 벨리데이션 체크를 한다 즉 유효성 검사 같은 걸 통해서 최소한의 트랜잭션이 걸리게 한다.
 
 
OLTP 배달의 민족과 같이 실시간 데이터 처리
OLAP 대용량처리 전체 총액처리등
 
Share article

강재영 블로그