메서드 내부 호출 때문에 트랜잭션 프록시가 적용되지 않는 문제를 해결하기 위해 internal() 메서드를 별도의 클래스로 분리
실제 호출되는 흐름
- 클라이언트인 테스트 코드는 callService.external() 을 호출
- callService 는 실제 callService 객체 인스턴스
- callService 는 주입 받은 internalService.internal() 을 호출
- internalService 는 트랜잭션 프록시이다. internal() 메서드에 @Transactional 이 붙어 있으므로 트랜잭션 프록시는 트랜잭션을 적용
- 트랜잭션 적용 후 실제 internalService 객체 인스턴스의 internal() 을 호출