📍 서론
스프링 부트를 통해 웹 개발을 하던 중, DB에 해당 아이디 값이 있는지 확인한 후, 새로운 값으로 update를 하는 메서드가 있었는데, 아무리 update를 해주어도 해결이 안되다가 해당 메서드에 @Transactiuonal이라는 어노테이션을 사용하니 해결이 되었다. 그래서 @Transactional 어노테이션은 무엇이고 어떻게 작동하는지 찾아보았다.
우리 말로는 '거래'를 뜻하는데 데이터베이스를 다룰 때 트랜잭션을 적용하면 데이터에 관련된 작업들을 처리하던 중 오류가 발생했을 때 모든 작업들을 롤백 / 원상태로 되돌릴 수 있다. 그리고 모든 작업들이 성공해야만 최종적으로 데이터베이스에 반영하도록 한다.
트랜잭션은 4가지의 성질을 가지고 있다.
1. 원자성(Atomicity)
= 트랜잭션과 관련된 작업들은 부분적으로 실행되다가 중단되지 않는다.
2. 일관성(Consistency)
= 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지한다.
3. 독립성(Isolation)
= 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장한다.
4. 지속성(Durability)
= 성공적으로 수행된 트랜잭션은 영원히 반영된다.
@Transcational 어노테이션
스프링에서는 @Transactional 어노테이션을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다. 이 방식을 선언적 트랜잭션이라 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행해준다.
예시:@Transactional //추적하기 public BoardResponseDto updateBoard (Long id, BoardRequestDto requestDto) { Board board = boardRepository.findById(id).orElseThrow( () -> new NullPointerException("선택한 게시물이 존재하지 않습니다.") ); if(board.getPassword().equals(requestDto.getPassword())){ board.update(requestDto); return new BoardResponseDto(board); } else { return new BoardResponseDto(); } }위의 코드를 보면 @Transactional 어노테이션을 메서드 위에 추가하여 메서드에 트랜잭션 기능이 가능하게 해주었다. 위 코드에서는 트랜잭션의 4가지 성질을 반영해서 업데이트하는 값들을 DB에 추가 해주었다.
나중에 따로 @Transactional에 관해 더 다루어 보겠다.
출처:
202304017 TIL