본문 바로가기
개발기초지식

[면접질문대비] SpringBoot 트랜잭션 관리

by 수바니 2025. 6. 9.

🔍 스프링 부트 트랜잭션 관리의 구체적인 동작 원리

1. 선언적 트랜잭션 관리 (@Transactional)

스프링은 AOP를 기반으로 트랜잭션을 관리합니다.

즉, @Transactional 을 붙이면 프록시 객체가 생성되어 해당 메서드에 트랜잭션을 적용합니다.

@Transactional
public void doSomething() {
    // 1. 트랜잭션 시작
    // 2. 비즈니스 로직 실행
    // 3. 성공 시 커밋 / 예외 발생 시 롤백
}

 

2. 내부적으로 어떻게 동작하나?

스프링이 PlatformTransactionManager 를 사용하여 트랜잭션을 시작/커밋/롤백합니다.

 

순서

1. Transactional 이 붙은 메서드 호출

2. 프록시 객체가 해당 호출 가로채기

3. 트랜잭션 시작

4. 메서드 정상 수행 -> 커밋/예외 발생 ->롤백

5. 트랜잭션 종료

 

3. 트랜잭션 프록시의 한계

내부 호출 문제

@Transactional
public void methodA() {
    methodB(); // 이 메서드에 @Transactional 있어도 프록시 못 타기 때문에 트랜잭션 안 먹힘
}

 

methodB()도 @Transactional 이 있지만 같은 클래스 내에서 직접 호출하면 프록시를 거치지 않아 트랜잭션이 적용되지 않음

 

해결방안

트랜잭션 메서드는 다른 클래스에서 호출하도록 분리하거나, 자기 자신의 프록시의 주입받아야 함.

 

 4. 주요 설정과 옵션

옵션 설명
readOnly = true SELECT만 수행할 경우 성능 최적화 가능
rollbackFor 체크 예외에도 롤백하고 싶을 때 사용
noRollbackFor 특정 예외 발생해도 롤백하지 않게 설정
propagation 트랜잭션 전파 방식 설정 (REQUIRED, REQUIRES_NEW 등)
isolation 트랜잭션 격리 수준 설정(READ_COMMITTED, SERIALIZABLE 등)

 

5. 트랜잭션 메니저는 어떻게 결정될까?

스프링 부트는 자동으로 적합한 PlatformTransactionManager 를 설정

JPA 사용시 JpaTransactionManager

JDBC 사용시 DataSourceTransactionsactionManagaer

여러 DB 또는 JPA + Mongo 등 사용하는 경우 명시적으로 설정 필요

 

6. 커스텀 트랜잭션 제어 예시

@Autowired
private PlatformTransactionManager transactionManager;

public void customTransactionLogic() {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        // 작업 수행
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
    }
}

 

✅ 요약

구분 설명
단순 사용 @Transactional 으로 선언적으로 관리
내부 원리 AOP 프록시 기반, PlatformTranactionalManager 가 실질 처리
주의할 점 내부 호출, 전파/롤백 조건
고급사용 직접 트랜잭션 매니저 주입 후 수동 처리 가능