🔍 스프링 부트 트랜잭션 관리의 구체적인 동작 원리
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 가 실질 처리 |
주의할 점 | 내부 호출, 전파/롤백 조건 |
고급사용 | 직접 트랜잭션 매니저 주입 후 수동 처리 가능 |
'개발기초지식' 카테고리의 다른 글
[면접질문대비] Static 클래스/메서드는 오버라이딩이 될까? NO! (1) | 2025.06.06 |
---|---|
[면접질문대비] Static 이란 무엇인가? (0) | 2025.06.06 |
[면접질문] 면접질문대비 / Spring Bean이란 무엇인가? 생명주기는? (1) | 2025.05.29 |
[면접질문] 면접질문대비 / Gradle과 Maven 어떤것을 사용할까? (2) | 2025.05.28 |
[면접준비] 면접질문대비 (1) | 2025.05.26 |