[Section 3] 트랜잭션

Kim·2022년 11월 4일
0

Boot Camp

목록 보기
43/64
post-thumbnail

트랜잭션

실습하고 있는 커피 주문 샘플 애플리케이션에서 예시 몇 가지를 들어보겠다.

  1. 회원이 커피 주문 앱으로 아메리카노 두 잔을 선택하고 결제 버튼을 눌렀다. 주문이 진행되는 사이에 네트워크 오류로 인해 결제에 실패했다.
    그런데, 회원의 주문이 정상적으로 데이터베이스에 등록되고, 주문한 커피 수 만큼 스팸프가 적립되었다.
    이러한 경우, 카페는 판매 수익을 얻지 못하는 손해를 보게 될 것이다.

  2. 반대로, 회원이 주문한 커피에 대한 결제는 완료되었으나 데이터베이스에 저장하는 과정 중 에러가 발생했다.
    회원의 주문이 데이터베이스가 정상적으로 등록되지 않는 문제가 발생했고, 이러한 경우에 회원은 금전적인 손해를 볼 것이다.

  3. 회원의 주문이 정상적으로 데이터베이스에 등록되었으나 스탬프 개수를 데이터베이스에 업데이트 하는 도중 에러가 발생했다.
    커피 주문은 완료되었지만 스탬프가 누적되지 않았다.
    이러한 경우, 회원은 커피는 마실 수 있지만 스탬프를 받지 못한다.

3가지 예시의 공통점은 여러 작업들이 하나의 그룹처럼 묶여서 처리되는 과정에서 하나라도 실패할 경우, 애플리케이션의 신뢰성이 깨지는 상황이 발생한다는 것이다.

트랜잭션은 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 단위이다. 애플리케이션의 신뢰성이 깨지는 상황이 발생하면 트랜잭션이라고 할 수 없다.

물리적으로는 여러 개의 작업이지만, 논리적으로는 마치 하나의 작업으로 인식되어 전부 성공하거나, 전부 실패하거나(All or Nothing) 둘 중 하나로 처리되어야만 트랜잭션의 의미를 갖는다.
All or Nothing 트랜잭션 처리 방식은 애플리케이션에서 사용하는 데이터의 무결성을 보장하는 핵심적인 역할을 한다.

ACID 원칙

트랜잭션의 특징을 이야기 할 때 일반적으로 ACID 원칙을 이용한다.

원자성(Atomicity)

트랜잭션에서 원자성은 작업을 더이상 쪼갤 수 없음을 의미한다.
처음에 설명했던 예시를 봤을 때, 커피 주문 작업과 스탬프 개수를 증가하는 작업들은 어느 하나만 처리하고, 다른 하나는 처리하지 않아도 되는 식으로 쪼개서 처리할 수 없다.
All or Nothing 중 하나로만 처리되어야 한다.

일관성(Consistency)

일관성은 트랜잭션이 에러 없이 성공적으로 종료될 경우, 비즈니스 로직이 의도하는대로 일관적이게 저장되거나 변경되는 것을 의미한다.
주문한 커피의 수 만큼, 스탬프 개수가 증가한다는 비즈니스 로직이라면, 회원이 2잔의 커피를 주문했다면 스탬프 개수가 2 증가한 값으로 저장되어야 일관성이 적용된 것이다.

격리성(Isolation)

격리성은 여러 개의 트랜잭션이 실행될 때, 각각 독립적으로 실행되어야 함을 의미한다.
CPU가 프로세스 처리하는 과정을 이해하면 쉽다. 컴퓨터에서 워드 작업을 하는 동시에 뮤직 플레이어로 음악을 듣고 있다면 CPU는 두 가지 프로세스를 아주 빠른 속도로 번갈아가며 실행시킨다.
데이터베이스 또한 성능 향상을 목적으로 하나 이상의 트랜잭션을 번갈아가며 처리할 수 있는데, 각 트랜잭션이 다른 트랜잭션에 영향을 주지 않아야 한다는 것이다.

지속성(Durability)

트랜잭션이 완료되면 그 결과는 지속되어야 한다는 것을 의미한다.
데이터베이스가 종료되어도 데이터는 물리적 저장소에 저장되어 지속적으로 유지되어야 한다.

commit & rollback

  1. commit
    commit은 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어다.
    commit 명령을 수행하면 변경된 내용이 데이터베이스에 영구적으로 저장되고, 하나의 트랜잭션 과정은 종료된다.

  2. rollback
    rollback은 작업 중 문제가 발생했을 때, 트랜잭션 내에서 수행된 작업들을 취소한다.
    즉, 트랜잭션 시작 전의 상태로 돌아간다.


트랜잭션의 진정한 의미

트랜잭션은 데이터베이스에만 한정되어 사용하는 의미는 아니다.
어떤 데이터를 로컬 데이터베이스에 저장하고, 그 결과를 푸시 알림(push notification)으로 클라이언트에게 전송하는 기능이 있다고 가정해보자.
데이터베이스 저장과 푸시 알림 전송이라는 두 개의 작업이 하나의 트랜잭션으로 묶여서 둘 중 하나라도 실패한다면 rollback 되어야 할 수도 있다.

전혀 다른 타입의 리소스(데이터베이스, 메시지, 파일 등)를 하나의 작업 단위로 묶어서 처리해야되는 상황에서는 어떤 식으로 트랜잭션을 적용하면 좋을지에 대해 생각해보자.


🔑Key Summary

  • 트랜잭션은 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위를 의미한다.

  • ACID 원칙
    원자성(Atomicity)
    ⠀⠀트랜잭션에서의 원자성이란 작업을 더이상 쪼갤 수 없음을 의미한다.
    ⠀⠀따라서 논리적으로 하나의 작업으로 인식해서 둘 다 성공하거나, 둘 다 실패하거나(All or Nothing)의 둘 중 하나로만 처리되는 것이 보장된다.
    일관성(Consistency)
    ⠀⠀일관성은 트랜잭션이 에러없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것을 의미한다.
    고립성(Isolation)
    ⠀⠀고립성은 여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함을 의미한다.
    지속성(Durability)
    ⠀⠀지속성은 여러분들이 잘 알고있다시피 데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되어 지속적으로 유지되어야 한다는 의미한다.

  • commit
    commit은 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어이다. commit 명령을 수행하면 변경된 내용이 데이터베이스에 영구적으로 저장된다.
    만약 commit 명령을 수행하지 않으면 작업의 결과가 데이터베이스에 최종적으로 반영되지 않는다.
    commit 명령을 수행하면, 하나의 트랜젝션 과정은 종료하게된다.

  • rollback
    rollback은 작업 중 문제가 발생했을 때, 트랜잭션 내에서 수행된 작업들을 취소하는 명렁어이다.
    따라서 트랜잭션 시작 이 전의 상태로 되돌아간다.

  • JPA 기술을 사용한 데이터베이스와의 인터랙션은 내부적으로는 JDBC API를 통해서 이루어진다.


참고 자료

📄 H2 Database - JDBC Connection

0개의 댓글