https://www.youtube.com/watch?v=y4a0X7dS2q8&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=46
스프링 트랜잭션의 생명주기는 다음과 같습니다:
트랜잭션은 @Transactional
어노테이션을 사용하여 선언적으로 관리될 수 있습니다. 이 어노테이션은 메서드에 적용되며, 해당 메서드 내에서 수행되는 모든 데이터베이스 작업은 하나의 트랜잭션으로 관리됩니다. 메서드가 정상적으로 완료되면 자동으로 커밋되고, 예외가 발생하면 롤백됩니다.
트랜잭션을 선언적으로 관리할 때, 주의해야 할 몇 가지 사항이 있습니다.
먼저, @Transactional
어노테이션을 사용할 때는 해당 메서드가 public으로 선언되어야 합니다. 또한, 이 어노테이션은 클래스 레벨에도 사용될 수 있으며, 이 경우 클래스 내의 모든 메서드에 자동으로 적용됩니다.
또한, 하나의 메서드 내에서 여러 개의 트랜잭션을 사용하거나, 중첩된 트랜잭션을 사용하는 것도 가능합니다. 하지만 이 경우에는 롤백이 제대로 처리되지 않을 수 있으므로, 주의해서 사용해야 합니다.
스프링에서는 기본적으로 PROPAGATION_REQUIRED
전파 속성을 사용합니다. 이 속성은 이미 진행 중인 트랜잭션이 있는 경우, 해당 트랜잭션에 참여하고, 그렇지 않은 경우 새로운 트랜잭션을 시작합니다. 이 외에도 다양한 전파 속성이 존재하므로, 상황에 맞게 적절한 속성을 선택해야 합니다.