[Spring] 트랜잭션(Transaction)

·2022년 11월 13일
0

Spring

목록 보기
17/24
post-thumbnail

SQL
위 링크에 포함되어 있는 트랙잭션 개념에 추가학습한 내용

트랜잭션(Transaction)

트랜잭션이란?

: 여러개의 작업들을 하나의 그룹으로 묶어 처리하는 하나의 단위로 애플리케이션에서 사용하는 데이터의 무결성을 보장하는 핵심적인 역할을 한다.

  • 데이터의 무결성을 보장하기 위해 하나의 트랜젝션 안에 모든 작업이 성공으로 끝나야 그 트랙잭션이 성공했다 인식하며, 작은 작업 하나라고 실패로 돌아간다면 그 트랙잭션의 작업은 실패로 처리된다.
  • All or Nothing

🧐 데이터의 무결성
위키백과-데이터의 무결성
데이터의 정확성과 일관성을 유지하고 보증하는 것

트랜잭션의 특징(AICD 원칙)

: 트랜잭션의 특징은 ACID 원칙을 따른다. 각각 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 의미한다.

A, 원자성(Atomicity)

: 트랜잭션 내의 작업들을 어떤 작업은 처리하고 어떤 작업은 처리하지 않는 식으로 더이상 쪼갤 수 없음을 의미하며, 하나의 트랜잭션은 하나의 작업으로 인식해 모두 성공하거나, 모두 실패하는가의 결과 중에 하나로만 처리되는 것이 보장되어야 한다.

하나의 작업, 하나의 결과

C, 일관성(Consistency)

: 트랜잭션이 에러없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것을 말한다.

  • ex, 커피를 3잔 주문하여 회원 정보의 스탬프 개수를 커피 수량에 맞게 업데이트 해야 하는 상황이라고 가정했을 때, 주문 - 처리 - 업데이트 의 과정에서 처리-업데이트 부분에 에러가 발생해 실 수량에 맞게 스탬프 수가 업데이트되지 못하는 경우가 없어야 한다는 말이다.

I, 격리성(Isolation)

: 여러개의 트랜잭션이 실행될 경우 각각 독립적으로 실행하며 서로에게 간섭하지 않는 것을 말한다.

  • CPU가 프로세스를 처리하는 과정에서 두개의 작업을 동시에 처리하고 있는 것처럼 보이지만 사실은 아주 빠른 속도로 두 작업을 번갈아가며 처리하고 있다!
  • 데이터베이스도 성능 향상을 목적으로 한 개 이상의 트랜잭션을 번갈아가며 처리한다. 이때, 트랜잭션이 서로에서 영향을 주지 않고 독립적으로 실행되게 해야 한다.

D, 지속성(Durability)

: 트랜잭션이 완료되면 그에 따른 결과가 지속되어야 한다.

  • 데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되어 지속적으로 유지되어야 하는 것을 말한다.

커밋과 롤백

: 데이터베이스에서 사용되는 명렁어들을 말한다.

커밋(Commit)

: 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어로 해당 명령어를 수행하면 하나의 트랜잭션 과정은 종료된다.

롤백(Rollback)

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

💡주의할 점
트랜잭션은 데이터베이스에만 한정적으로 사용하는 것이 아니다.
필요에 따라 전혀 다른 리소스를 하나의 작업 단위로 묶어서 사용할 수도 있다. (예를 들면 데이터베이스 저장과 동시에 클라이언트에게 처리완료 메세지를 보내는 경우) 항상 어떻게 여러개의 작업들을 하나의 트랜잭션으로 묶어 처리할 지 고민해야 한다.

트랜잭션의 선언형 적용 방식

: 트랜잭션에는 크게 로컬 트랜잭션분산 트랜잭션 두가지로 구분할 수 있으며, Spring에서는 로컬 트랜잭션선언형프로그래밍 코드 베이스 방식을 사용한다.

작성한 비즈니스 로직에 애너테이션을 추가

@Transactional

  1. 클래스 레벨에 @Transactional 애너테이션을 추가해 해당 클래스에 포함되어 있는 메서들 전체에 적용된다.
  2. 메서드 레벨에 @Transactional 애너테이션을 추가한다.

☝️ @Transactional
클래스 레벨과 메서드 레벨에 함께 적용된 경우, 메서드 레벨의 애너테이션이 우선 적용된다.

@Transactional의 애트리뷰트

: 메서드 레벨에서만 해당되는 애트리뷰트이다.

트랙잭션 전파(Transaction Propagation)

: 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식을 말한다.

  • Propagation.REQUIRED : default, 진행 중인 트랜잭션이 없으면 새로 시작하고, 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여한다.
  • Propagation.REQUIRES_NEW : 이미 진행중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작된다. 기존에 진행중이던 트랜잭션은 새로 시작된 트랜잭션이 종료할 때까지 중지된다.
  • Propagation.MANDATORY : 진행 중인 트랜잭션이 없으면 예외를 발생시킨다.
  • Propagation.NOT_SUPPORTED : 트랜잭션을 필요로 하지 않는다. 진행 중인 트랜잭션이 있으면 메서드 실행이 종료된 때까지 진행중인 트랜잭션을 중지되며, 메서드 실행히 종료되면 트랜잭션을 계속 진행한다.
  • Propagation.NEVER : 트랙잭션을 필요로 하지 않는다. 진행 중인 트랜잭션이 존재할 경우에는 예외를 발생시킨다.

트랜잭션 격리 레벨(Isolation Level)

: 트랜잭션의 ACID원칙에 맞게 격리성을 보장하기 위한 애트리뷰트

  • Isolation.DEFAULT : 데이터베이스에서 제공하는 기본값
  • Isolation.READ_UNCOMMITTED : 다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용한다.
  • Isolation.READ_COMMITTED : 다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용한다.
  • Isolation.REPEATABLE_READ : 트랜잭션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 한다.
  • Isolation.SERIALIZABLE : 동일한 데이터에 대해서 동시에 두개 이상의 트랜잭션이 수행되지 못하도록 한다.

☝️ 격리레벨은 일반적으로 데이터베이스나 데이터 소스에 설정된 격리레벨을 따르는 것을 권장히기 때문에 자주 사용되지 않는 애트리뷰트이다. 참고로만 알고 있을 것

💡작업별로 트랜잭션을 새로 생성해야 한다거나 특정 작업에는 트랜잭션을 적용하지 않는 등의 경우가 아니라면 애트리뷰트 없이 @Transactional 애너테이션만 추가해도 무방하다.

AOP 방식

: @Transactional 애너테이션을 비즈니스 로직에 적용하지 않고, 트랜잭션을 적용하는 방법이다.

  • Config 클래스를 생성해 트랜잭션의 애트리뷰트 등을 설정하여 메서드 별로 트랜잭션을 사용할 수 있게 하는 방식
  • 사용이 복잡하기 때문에 잘 사용하지 않음......사실 코드만 보면 뭔 말인지 잘 모르겠음 어질쓰
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글