web developer

[egov] 트랜잭션 처리방식2 - Declarative Transaction Management 본문

Framework/Egovframework [spring]

[egov] 트랜잭션 처리방식2 - Declarative Transaction Management

trueman 2024. 9. 13. 00:22
728x90
728x90

Declarative Transaction Management


1-1. 정의

Spring 프레임워크의 트랜잭션 관리 기능을 활용하여 트랜잭션을 선언적으로 관리하는 방법입니다. 이를 통해 개발자는 코드 내에서 직접 트랜잭션 경계를 설정하지 않고, 애노테이션을 사용하여 트랜잭션을 설정할 수 있습니다.


1-2. 애노테이션 기반 트랜잭션 관리의 기본 개념

  1. 애노테이션 사용:
    • @Transactional 애노테이션을 메서드 또는 클래스에 붙여서 트랜잭션을 설정합니다.
    • 이 애노테이션은 Spring의 PlatformTransactionManager를 사용하여 트랜잭션을 관리합니다.
  2. 자동 트랜잭션 처리:
    • @Transactional 애노테이션을 사용하면, 트랜잭션의 시작, 커밋, 롤백을 Spring이 자동으로 처리합니다.
    • 애노테이션의 속성을 통해 트랜잭션의 격리 수준, 전파 행동, 타임아웃 등을 설정할 수 있습니다.

1-3. 주요 애노테이션 속성

  1. propagation: 트랜잭션 전파 행동을 정의합니다. 기본값은 Propagation.REQUIRED입니다.
    • REQUIRED: 현재 트랜잭션이 존재하면 그 트랜잭션을 사용하고, 없으면 새로운 트랜잭션을 생성합니다.
    • REQUIRES_NEW: 항상 새로운 트랜잭션을 생성합니다. 기존 트랜잭션은 중단됩니다.
    • SUPPORTS: 현재 트랜잭션이 존재하면 그 트랜잭션을 사용하고, 없으면 트랜잭션 없이 실행됩니다.
    • NOT_SUPPORTED: 트랜잭션을 사용하지 않고 실행합니다.
    • MANDATORY: 현재 트랜잭션이 반드시 존재해야 하며, 없으면 예외를 발생시킵니다.
    • NEVER: 트랜잭션 없이 실행하며, 현재 트랜잭션이 존재하면 예외를 발생시킵니다.
    • NESTED: 중첩 트랜잭션을 지원합니다. 내부 트랜잭션이 커밋되면 외부 트랜잭션이 커밋됩니다.
  2. isolation: 트랜잭션의 격리 수준을 설정합니다. 기본값은 Isolation.DEFAULT입니다.
    • DEFAULT: 데이터베이스의 기본 격리 수준을 사용합니다.
    • READ_COMMITTED: 커밋된 데이터만 읽을 수 있습니다.
    • READ_UNCOMMITTED: 커밋되지 않은 데이터도 읽을 수 있습니다.
    • REPEATABLE_READ: 같은 트랜잭션 내에서 동일한 데이터를 여러 번 읽을 때 데이터가 변경되지 않습니다.
    • SERIALIZABLE: 가장 높은 격리 수준으로, 트랜잭션 간의 모든 읽기 및 쓰기 작업이 서로 격리됩니다.
  3. timeout: 트랜잭션의 타임아웃을 설정합니다. 기본값은 -1로, 무제한입니다.
  4. readOnly: 트랜잭션이 읽기 전용인지 여부를 설정합니다. 기본값은 false입니다.
  5. rollbackFor: 특정 예외가 발생했을 때 트랜잭션을 롤백합니다.
  6. noRollbackFor: 특정 예외가 발생해도 트랜잭션을 롤백하지 않습니다.

1-4. 샘플코드

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class SampleService {

    @Autowired
    private SampleDAO sampleDAO;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    public void updateSample(SampleVO vo) throws Exception {
        sampleDAO.updateSample(vo);
    }
}
  1. @Transactional 애노테이션:
    - Propagation.REQUIRED: 현재 트랜잭션이 존재하면 이를 사용하고, 없으면 새로운 트랜잭션을 시작합니다.
    - Isolation.READ_COMMITTED: 커밋된 데이터만 읽을 수 있습니다.
    - rollbackFor = Exception.class: 모든 예외가 발생하면 트랜잭션을 롤백합니다.
  2. updateSample 메서드가 호출되면 Spring은 자동으로 트랜잭션을 시작합니다. 메서드가 성공적으로 실행되면 트랜잭션이 커밋되고, 예외가 발생하면 롤백됩니다.

출처 : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:psl:transaction:declarative_transaction_management#configurational_transaction_management

728x90
728x90