스프링부트에서 @Transactional
어노테이션은 말 그대로 트랜잭션을 처리하는 어노테이션이다. 그렇다면 트랜잭션이란 무엇일까?
Transaction(트랜잭션)이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 논리적인 작업 단위를 의미한다.
그렇다면 작업단위란 무엇일까?
보통은 SELECT, UPDATE, INSERT, DELETE 등과 같은 DML 명령어들을 이용하여 데이터베이스에 접근하는 것을 말한다.
이때, 작업 단위는 여러 개의 쿼리문이 될 수도 있다.
트랜잭션의 특징에는 ACID가 있다.
1. 원자성(Atomicity)
하나의 트랜잭션이 성공적으로 수행되었으며, 데이터베이스가 일관성 있는 상태일 때 하나의 트랜잭션이 끝났다라고 하며, 이를 Commit되었다라고 한다.
하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우 트랜잭션을 처음부터 다시 시작하거나 부분적으로 연산된 결과를 다시 취소 시킨다.
스프링에서는 @Transactional
어노테이션을 통해 메서드, 클래스, 인터페이스의 트랜잭션 처리가 가능하다. 이러한 방식을 선언적 트랜잭션이라고 한다. 이를 사용하면 트랜잭션 기능이 들어가 있는 프록시 객체가 생성되어 자동으로 커밋이나 롤백을 해준다.
@Transactional
public void createVideoLike(PostVideoLikeReq postVideoLikeReq) throws BaseException{
try{
if(likeProvider.checkExistingUser(postVideoLikeReq.getUserId()) == 0){
throw new BaseException(BaseResponseStatus.USER_NOT_EXISTS);
}
if(likeProvider.checkVideoLike(postVideoLikeReq) == 1){
throw new BaseException(BaseResponseStatus.POST_LIKES_ALREAY_EXISTS);
}
int result = likeDao.createVideoLike(postVideoLikeReq);
if(result == 0){
throw new BaseException(BaseResponseStatus.POST_RESULT_NOT_EXISTS);
}
}
catch (Exception exception){
throw new BaseException(BaseResponseStatus.DATABASE_ERROR);
}
}
위의 코드는 영상에 좋아요를 추가하는 메소드이다. 이 코드 위에 @Transactional
어노테이션이 붙어있다. 좋아요를 추가
하는 과정이므로 INSERT
과정이다. 따라서 트랜잭션 기능을 수행하도록 @Transactional
어노테이션을 추가해주었다.
이러한 트랜잭셔널 어노테이션에는 여러가지 옵션들이 있으며, 필요에 따라 이 어노테이션에 옵션을 주어 사용하면 된다.