🍃 Spring

@Transactional과 트랜잭션 정리

보배 진 2026. 2. 2. 12:13

@Transactional 이란?

@Transactional서비스(Service) 레이어 메서드 위에 붙여서 트랜잭션을 처리하도록 만드는 어노테이션이다.

▪ 메서드 안의 작업들을 하나의 트랜잭션 단위로 묶어준다

▪ 중간에 하나라도 실패하면 전체 작업을 롤백한다

▪ 모든 작업이 설공하면 커밋한다

즉, 이 메서드 안의 작업은 전부 성공하거나, 전부 실패해야 한다를 보장한다

 

 

 

트랜잭션 매니저(Transaction Manager)

트랜잭션을 처리를 위해서는 반드시 '트랜잭션 매니저'가 필요하다

  트랜잭션 매니저는 객체(Object) 이다

  객체이므로 Spring Bean으로 등록되어야 한다 (new -> <bean> -> @Component)

Spring Boot 에서는 우리가 직접 만들지 않아도 자동으로 등록된다

 

 

 

왜 Bean 등록이 필요한가?

트랜잭션 매니저는

우리가 직접 만든 클래스가 아니라

Spring에서 제공하는 기능이기 때문에 

Spring이 관리할 수 있도록 Bean 등록이 필요하다

과거에는 <bean> 태그로 설정했지만, 지금은 @Component 기반 자동 등록 또는 Spring Boot 자동 설정을 사용한다

ref에 들어가는 dataSource는 연결 connection을 하기 위해 같은 id인 DB 설정을 가져온다'

 

 

 

부트의 것 : properties

자바 클라이언트 : xml

 

트랜잭션 처리를 할 때 필요한 3가지 설정

트랜잭션 처리 == 공통로직 처리 == AOP 설정

트랜잭션 처리는 공통 로직이다. 그래서 Spring에서는 AOP(관점 지향 프로그래밍) 방식으로 처리한다

트랜잭션 AOP의 핵심 구성 요소 3가지 : 

1) 포인트컷 설정하기  : 어디에 적용할 것인지(어떤 메서드)

2) 어드바이스 설정하기 : 무엇을 할 것인지(트랜잭션 시작/커밋/롤백)
3) 애스팩트(어드바이저) 설정하기 : PointCut + Advice를 묶은 것

 

🔼 이러한 설정을 이제 @Transactional 하나로 한번에 적용이 가능해진다

 

 

 

 

트랜잭션 사용해보기

@Service("ms")
public class MemberServiceImpl implements MemberService {
	@Autowired
	private PlusMemberDAO memberDAO;
	
	@Override
	@Transactional
	public boolean insertMember(MemberDTO dto) {
		return memberDAO.insertMember(dto);
	}
    [ 생략 ]

회원가입을 하는 코드이다

위와 같은 코드를 고의적으로

이렇게 만들어 실행시켰고

아이디, 비번, 이름을 입력하여 회원가입을 진행했더니 에러가 발생한다

20번  insert는 문제가 없고, 21번에서 문제가 발생하는데 PK 충돌이 일어나서 없는 것이다

그래서 20번까지 문제 없이 수행을 했기 때문에 회원가입이 됐어야 하는데 실제로 DB를 보면

방금 입력한 아이디, 비번, 이름이 조회되지 않는다

트랜잭션은 여기 있는 메서드 중에서 하나라도 안되면 전부 안될거야~를 해준다

20번 라인에서 롤백을 하고 > 전체 취소

23번에서 커밋을 한다고 보면 된다 > 승인

 

 

커밋과 롤백 개념 정리

Commit : 모든 작업 성공 ➡ DB에 최종 반영

Rollback : 중간 실패 발생 ➡ 이전 상태로 되돌림

 

트랜잭션 관점에서 보면:

메서드 시작 시 → 트랜잭션 시작

예외 발생 ❌ → Rollback

정상 종료 ✅ → Commit

 

 

 

트랜잭션이 무엇인가? ➡ 하나의 작업 단위