Q) 메소드에 내에 구현된 JpaRepository.save(entity1); JpaRepository.save(entity2);가 실행되었을 때 entity2를 저장하면서 오류가 발생했는데 entity1은 저장되고 entity2는 저장되지 않고 rollback되었어요. 왜 그런건가요?
A) 아래와 같은 현상을 이해하려면 Transaction과 Transaction의 전파에 대해 알 필요가 있습니다.Transaction은 데이터베이스가 처리하는 작업 단위를 뜻합니다. 좀 더 실용적으로 이야기한다면 SQL이 실행되고 종료하기까지의 작업 단위를 뜻합니다. Transaction의 기본 속성으로 작업 처리 중 예외과 발생하게되면 해당 작업을 Rollback시키게 됩니다. 그렇기 때문에 작업 수행 중 오류가 발생하면 데이터베이스에 저장하지 않게 되죠. Spring에서는 @Transaction으로 선언하여 해당 작업단위를 구분합니다.Transaction의 전파는 Transaction이 수행되는 과정에서 다른 Transaction이 실행 되었을 때 어떻게 처리되는 지를 뜻합니다. Transaction의 기본 전파 속성은 REQUIRED로 하위 Transaction은 최상단의 부모 Transaction에 종속되어 따르게 되어있습니다.그럼 아래의 코드를 해석해보면 test()메소드에 @Transaction 선언되어 있지 않기 때문에 JpaRepository.save() 내부에 선언되어 있는 개별 Transaction을 따르게 됩니다. 그래서 오류가 나지 않은 entity1은 저장되고 오류가난 entity2는 Rollback하게 된 것이죠.
@Test
Public void test() {
Entity entity1 = new Entity();
…
JpaRepository.save(entity1);
Entity entity2 = new Entity();
…
JpaRepository.save(entity2);
}
그렇다면 test() 메소드 전체를 Transaction 단위로 묶으려면 어떻게 해야할까요?
@Test
@Transacation // <- test() 전체를 Transaction 단위로 묶어주어야 전파되겠죠?
Public void test() {
Entity entity1 = new Entity();
…
JpaRepository.save(entity1);
Entity entity2 = new Entity();
…
JpaRepository.save(entity2);
}
참고)
https://velog.io/@myspy/Transaction-%EC%A0%84%ED%8C%8C%EA%B0%80-%EB%AD%A1%EB%8B%88%EA%B9%8C