참고

https://kafcamus.tistory.com/30

https://kafcamus.tistory.com/33

https://goddaehee.tistory.com/167

https://steady-coding.tistory.com/610

  1. 트랜잭션

트랜잭션을 클래스나 메소드에 붙여줄 경우 해당 범위 내 매소드가 트랜잭션이 되도록 보장해준다.

선언적 트랜잭션이라고도 하는데 직접 객체를 만들 필요없이 선언만으로도 관리를 용이하게 해준다.

트랜잭션을 사용할 경우 연산의 원자성이 보장되어 실패할 경우 commit되지 않는다.

  1. 스프링에서의 트랜잭션 작동 원리

트랜잭션 어노테이션을 걸어주면 스프링은 매소드에 프록시를 만든다.

트랜잭션의 경우 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로 프록시를 생성해 해당 매서드의 앞 뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.

서비스 클래스에서 @Transactional을 사용할 경우, 해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다는 뜻이다. 영속성 컨텍스트는 트랜잭션 AOP가 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션 AOP가 트랜잭션을 커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이후 영속성 컨텍스트 역시 종료되는 것이다.

이러한 방식으로 영속성 컨텍스트를 관리해 주기 때문에, @Transactional을 쓸 경우 트랜잭션의 원칙을 정확히 지킬 수 있다.

또한, 아래의 원칙 역시 유의해야 한다.