Java_31_Transactional Annotation

OngTK·2025년 9월 25일

Java

목록 보기
31/35

@Transactional 정리 ✨

스프링에서 여러 SQL을 하나의 작업 단위로 묶어 원자성 보장하는


📑 목차


1. 개념

  • @Transactional = 트랜잭션 관리용 어노테이션
  • 메서드 실행 전 트랜잭션 시작 → 성공 시 commit → 예외 발생 시 rollback
  • 원자성(Atomicity) 보장 도구

💡 즉, "모두 성공하거나 전부 실패해야 함"을 보장


2. 기본 동작

  • 전파: REQUIRED (기존 트랜잭션 있으면 합류, 없으면 새로 시작)
  • 격리: DB 기본값 사용 (MySQL → REPEATABLE_READ)
  • 롤백 규칙: RuntimeException, Error 발생 시 rollback / 체크 예외는 rollback 안 함
  • 읽기 전용: @Transactional(readOnly = true) 설정 가능

⚠️ 체크 예외도 rollback 원하면 rollbackFor = Exception.class 지정 필요


3. 샘플 코드 설명

(1) 다건 INSERT

@Transactional
public boolean trans1() {
    transMapper.trans1("배두훈"); // 정상 insert
    transMapper.trans2("강형호"); // SQL 오류 발생
    return true;
}
  • 두 번째 insert에서 오류 발생 → 예외 발생
  • 전체 rollback → 첫 번째 insert도 취소됨

(2) 계좌이체

@Transactional
public boolean transfer(Map<String, String > transInfo){
    transMapper.withdraw("조민규", 100000); // 출금
    throw new RuntimeException("강제예외"); // 중간에 예외 발생
    transMapper.deposit("고우림", 100000); // 실행 안 됨
}
  • 출금 후 예외 발생 → rollback
  • 입금 실행 안 됨
  • 결과적으로 출금, 입금 둘 다 취소됨

💡 계좌이체는 반드시 출금+입금 동시에 성공해야 함 → @Transactional이 필요


4. Mapper 반환형

@Mapper
public interface TransMapper {
    @Insert("insert into trans(name) values (#{name})")
    int trans1(String name);

    @Update("update trans set money = money + #{money} where name = #{name}")
    int deposit(String name, int money);
}
  • MyBatis DML 메서드는 int(영향받은 행 수) 반환하는 게 일반적
  • int == 1 확인 후 실패 시 예외 발생시키는 방식 권장

5. 실무에서 고려할 점

  • 서비스 계층 메서드에만 @Transactional 적용 권장
  • 내부 자기호출(self-invocation) 시 어노테이션 안 먹음 → 구조 분리 필요
  • 예외를 잡고 무시하면 rollback 안 됨 → 꼭 다시 던지거나 rollbackOnly 지정 필요
  • 조회 메서드에는 readOnly = true 적용 시 약간의 최적화 효과 있음
  • 전파/격리 수준은 기본값으로 충분한 경우 많음, 특수 케이스만 옵션 변경

6. 초보자 체크리스트 ✅

  • 서비스 계층 메서드에 @Transactional 붙이기
  • 여러 SQL이 모두 성공해야만 commit됨
  • 중간에 오류 발생하면 전부 rollback됨
  • Mapper 반환형은 int로 받아서 ==1 체크
  • 예외 무시하지 않고 던져야 rollback 동작

⚡ 정리:
@Transactional여러 SQL을 하나의 묶음으로 처리해서 원자성 보장하는 장치임.
초보자는 commit/rollback 원리예외 발생 시 전체 취소되는 부분만 명확히 이해하면 됨.

profile
2025.05.~K디지털_풀스택 수업 수강중

0개의 댓글