Spring @Transactional 이란 ?

박성현·2025년 9월 10일

개발중 학습

목록 보기
25/43

🔹 Spring @Transactional 정리

1. @Transactional이란?

Spring에서 트랜잭션을 선언적으로 관리할 수 있도록 해주는 어노테이션.
DB 작업 중 오류가 발생하면 자동으로 rollback, 정상 완료 시 commit을 수행한다.


2. 트랜잭션 기존 관리 방식

public void saveData() {
    TransactionStatus status = txManager.getTransaction(new DefaultTransactionDefinition());
    try {
        repository.insertData1();
        repository.insertData2();
        txManager.commit(status);
    } catch(Exception e) {
        txManager.rollback(status);
    }
}

👉 문제:

  • 모든 메서드마다 try/catch + commit/rollback 작성 → 중복 코드
  • 비즈니스 로직과 트랜잭션 코드가 섞여서 가독성 저하

3. @Transactional 기본 예제 (AOP 기반)

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void registerUser(User user) {
        userRepository.save(user);        // 사용자 저장
        userRepository.saveHistory(user); // 로그 저장

        // 만약 예외 발생 시? 👉 두 작업 모두 rollback
    }
}

4. 동작 원리 (프록시 + AOP)

(1) 프록시 패턴이란?

  • 대리인(Proxy) 객체가 진짜 객체의 앞에서 요청을 가로채고, 부가 기능을 수행한 뒤 원래 객체를 호출하는 디자인 패턴
  • 예: "보안 요원(Proxy)"이 먼저 신분 확인 후, 실제 VIP(Real Object)에게 접근 허용

(2) AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)

  • 핵심 로직과 부가 로직(트랜잭션, 로깅, 보안 등)을 분리해서 관리하는 기법
  • @Transactional도 바로 이 AOP 기반으로 동작한다.

(3) @Transactional의 실제 동작

Client
   │
   ▼
[AOP Proxy]  ← 트랜잭션 부가 기능 적용 (@Transactional)
   │
   ├─ 트랜잭션 시작 (begin)
   │
   ├─ UserService.registerUser() 실행
   │
   ├─ 정상 종료 → commit
   │
   └─ 예외 발생 → rollback

👉 여기서 AOP Proxy가 프록시 패턴으로 동작하며, 트랜잭션 시작/종료를 알아서 처리해준다.
개발자는 오직 비즈니스 로직만 작성하면 된다.


✅ 정리

  • 프록시 패턴: 원래 객체 대신 앞에서 요청을 가로채고, 부가 기능을 추가하는 구조적 패턴
  • AOP: 프록시 패턴을 활용해서 트랜잭션, 로깅, 보안 같은 공통 관심사를 자동 적용하는 기법
  • @Transactional: AOP 프록시가 자동으로 begin/commit/rollback을 관리하는 선언적 트랜잭션 처리 방식

profile
개발기록장

0개의 댓글