스프링에서 여러 SQL을 하나의 작업 단위로 묶어 원자성 보장하는
@Transactional = 트랜잭션 관리용 어노테이션 💡 즉, "모두 성공하거나 전부 실패해야 함"을 보장
@Transactional(readOnly = true) 설정 가능 ⚠️ 체크 예외도 rollback 원하면 rollbackFor = Exception.class 지정 필요
@Transactional
public boolean trans1() {
transMapper.trans1("배두훈"); // 정상 insert
transMapper.trans2("강형호"); // SQL 오류 발생
return true;
}
@Transactional
public boolean transfer(Map<String, String > transInfo){
transMapper.withdraw("조민규", 100000); // 출금
throw new RuntimeException("강제예외"); // 중간에 예외 발생
transMapper.deposit("고우림", 100000); // 실행 안 됨
}
💡 계좌이체는 반드시 출금+입금 동시에 성공해야 함 → @Transactional이 필요
@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);
}
int(영향받은 행 수) 반환하는 게 일반적 int == 1 확인 후 실패 시 예외 발생시키는 방식 권장 @Transactional 적용 권장 readOnly = true 적용 시 약간의 최적화 효과 있음 @Transactional 붙이기 ==1 체크 ⚡ 정리:
@Transactional은 여러 SQL을 하나의 묶음으로 처리해서 원자성 보장하는 장치임.
초보자는 commit/rollback 원리와 예외 발생 시 전체 취소되는 부분만 명확히 이해하면 됨.