@Transactional 어노테이션을 붙이면, 해당 메소드/클래스의 메소드가 트랜잭션 처리를 받을 수 있게 해준다. 일반적으로 @Transactional 어노테이션을 붙이지 않으면, 각각 메소드 호출이 자신만의 트랜잭션을 가지게 되어, 메소드 호출이 별도 트랜잭션에서 동작하게 된다. 따라서 만약에 여러 개 메소드를 호출하는 중에 오류가 발생하면, 발생한 지점 이후 작업은 롤백되지 않고, 이전에 정상 완료 된 작업들은 영향을 받지 않는다. 그런데 @Transactional 어노테이션을 붙이면, 해당 메소드나 클래스들의 메소드가 하나의 트랜잭션 내에서 동작하게 된다. 따라서, 여러 개의 메소드를 호출 하는 도중에 오류가 발생하면 해당 트랜잭션 전체가 롤백되어 모든 작업이 이전 상태로 복원된다. 동작 예시를 몇 개 들면 아래와 같다. test1() -> testRepo1() @Transactional 이 2개 다 적용 됨 test1()이 끝날 때 testRepo1()에 대한 것이 같이 동작함 만약 testRepo1()에 오류가 나면 test1()도 롤백됨 test2() -> testRepo2() @Transactional이 testRepo2()에만 적용 됨 test2() 메소드에서 testRepo2()를 호출해도 testRepo2() 메소드가 별도 트랜잭션임 testRepo2()에서 예외가 발생해도 test2() 메소드는 롤백되지 않음 test3() -> testRepo3() @Transactional이 test3()에만 적용 됨 test3()에서 testRepo3()을 호출해도, testRepo3() 메소드는 새로운 트랜잭션 없이 실행됨 testRepo3() 을 호출한 뒤에 오류가 발생하면, test3() 의 트랜잭션 안에서 testRepo3()이 호출되었기 때문에 롤백됨. test4() -> testRepo4() @Transactional 이 2개 다 없음 두 메소드 서로 트랜잭션 없이 실행됨 예외가 발생 시에는 해당 메소드 내에서만