@Transactional
정의
- 우리말로 '거래'라는 뜻을 가지고 있으며, 스프링에서는 모든 작업들이 성공적으로 완료되어야 작업 묶음의 결과를 적용하고, 어떤 작업에서 오류가 발생했을 떄는 이전에 있던 모든 작업들이 성공적이었더라도 없었던 일처럼 완전히 되돌리는 것
데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용 단위이며, 여기서 단위라는 말은 더 이상 쪼개질 수 없는 최소의 연산이라는 의미이다.
스프링에서 트랜잭션을 이용한 처리방법
DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 매서드에 @Transactional 어노테이션을 달아주면 된다.
클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레벨의 @Transactional 선언이 우선 적용된다.
@Transactional이 붙은 메서드는 메서드가 포함하고 있는 작업 중에 하나라도 실패할 경우 전체 작업을 취소한다.
테스트 환경에서의 @Transactional 동작
테스트 메서드에 @Transactional을 사용하면 트랜잭션으로 감싸지며, 메서드가 종료될 때 자동으로 롤백된다.
@Transactional이 클래스 내지 메서드에 붙을 때, 스프링은 해당 메서드에 대한 프록시를 만든다.
프록시 패턴은 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.
스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 서비스 클래스에서 @Transactional을 사용할 경우, 해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다는 뜻이다. 영속성 컨텍스트는 트랜잭션 AOP가 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션 AOP가 트랜잭션을 커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이 후, 영속성 컨텍스트 역시 종료되는 것이다.

Reference
https://kafcamus.tistory.com/30
https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/