본문 바로가기
꿀팁

Springboot 어노테이션을 알아보자 - Transactional

by zho 2024. 11. 13.

트랜잭션이란?

트랜잭션은 데이터베이스에서 하나의 작업 단위를 의미합니다. 여러 데이터 조작 작업이 하나의 논리적인 작업으로 묶여 원자성(Atomicity)을 갖습니다. 즉, 모든 작업이 성공적으로 완료되거나, 실패 시 모두 롤백됩니다.

ACID 원칙

트랜잭션은 다음과 같은 ACID 원칙을 따릅니다:

  • 원자성 (Atomicity): 트랜잭션 내의 모든 작업이 모두 적용되거나 전혀 적용되지 않아야 합니다.
  • 일관성 (Consistency): 트랜잭션 전후에 데이터베이스는 일관된 상태를 유지해야 합니다.
  • 격리성 (Isolation): 동시에 실행되는 트랜잭션들이 서로 간섭하지 않아야 합니다.
  • 지속성 (Durability): 트랜잭션이 커밋되면 그 결과는 영구적으로 저장되어야 합니다.

 

언제 @Transactional을 사용해야 할까?

1. 데이터 일관성 보장이 필요한 경우

  • 여러 데이터베이스 연산을 하나의 작업 단위로 처리하고, 모든 연산이 성공해야만 최종적으로 커밋하고, 실패 시 롤백해야 할 때 사용합니다.
  • 예시: 주문 시스템에서 상품 주문, 결제, 재고 감소 등의 작업이 하나의 단위로 실행될 때.

2. 데이터 무결성이 중요한 경우

  • 애플리케이션에서 예외가 발생할 경우, 데이터 무결성을 보장하기 위해 트랜잭션을 사용하여 데이터가 중간 상태로 저장되지 않도록 합니다.
  • 예시: 은행 계좌 이체와 같이, 하나의 계좌에서 출금되고 다른 계좌로 입금되는 과정에서 하나라도 실패하면 모든 작업을 취소해야 할 때.

3. 다중 테이블에 대한 업데이트가 필요한 경우

  • 여러 테이블에 동시에 데이터를 삽입, 수정, 삭제해야 하는 작업에서 데이터 간의 일관성을 유지하고자 할 때 사용합니다.
  • 예시: 회원 정보 수정 시, 개인 정보 테이블과 관련 계정 테이블이 동시에 업데이트되어야 할 때.

4. 복잡한 비즈니스 로직을 처리할 때

  • 여러 서비스 호출을 포함한 비즈니스 로직에서 일부 작업이 실패하더라도 트랜잭션의 롤백 기능으로 오류를 방지하고 데이터를 안전하게 관리할 수 있습니다.
  • 예시: 전자상거래 애플리케이션에서 장바구니에 담긴 여러 상품을 한 번에 주문 처리할 때.

 


 

이는 또한 connection 점유 관련해서도 문제를 해결할 수 있다.

  • 커넥션 반환 타이밍 관리: @Transactional을 사용하면 트랜잭션이 종료되면서 자동으로 커넥션이 반환됩니다. 즉, 데이터베이스 작업이 끝나자마자 커넥션 풀로 커넥션이 돌아가 다른 요청에 재사용될 수 있어, 불필요하게 커넥션이 점유되지 않습니다.
  • 짧은 트랜잭션 유지: 트랜잭션이 필요한 메서드에만 @Transactional을 적용하고 필요하지 않은 경우에는 커넥션을 사용하지 않도록 하여 커넥션을 효율적으로 유지할 수 있습니다. 이로 인해 커넥션 풀이 불필요하게 고갈되는 것을 방지할 수 있습니다.
  • 커넥션 풀 로드 감소: 트랜잭션 격리 수준을 낮추거나 readOnly=true 옵션을 활용하면 커넥션 풀의 리소스를 덜 소모하게 됩니다. 예를 들어, 읽기 전용 트랜잭션에서는 락을 줄이고 리소스를 절약할 수 있습니다.

 

또한 데이터 삽입, 수정과 같은 작업이 아닌 읽기 작업만 하는 경우엔 아래와 같이 붙여주면 된다.

@Transactional(readOnly = true)

 

 

728x90