트랜잭션 프록시 적용
- 동일한 OrderService 인터페이스를 구현한 프록시를 OrderClient에 주입
![image.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/a7e1e85e-d6f9-43d3-8475-0933babeaf4a/5c224a9b-4620-4b28-8e7b-8c01360ed107/image.png)
스프링이 만들어주는 트랜잭션 프록시
- @Transactional 애너테이션이 붙은 클래스의 메서드가 트랜잭션 안에서 실행되도록 프록시를 만들어 줌
- 스프링컨테이너가 @Transactional이 붙은 클래스 혹은 메서드가 있으면 그 앞에 프록시 오브젝트를 하나 만들어서 트랜잭션을 시작한 다음에 메서드의 기능이 수행되는 방식으로 기능을 넣어줌
(자동으로 런타임에 스프링이 시작될 때 기능을 넣어줌)
애너테이션을 적용하여 트랜잭션 프록시 적용
@EnableTransactionManagement, @Transactional
- @EnableTransactionManagement
- 설명
- 트랜잭션 관리 기능을 활성화
- 스프링이 자동으로 트랜잭션 관련 설정을 적용하고, 트랜잭션 관리에 필요한 프록시 객체를 생성
- 적용 위치
- 설정 클래스(@Configuration)에 적용하여 애플리케이션 전체에 트랜잭션 관리 기능을 활성화
- @Transactional
- 설명
- 특정 클래스나 메서드에 트랜잭션을 적용
- 메서드에 @Transactional을 붙이면 해당 메서드가 호출될 때 스프링이 자동으로 트랜잭션을 시작하고, 메서드가 성공적으로 완료되면 트랜잭션을 커밋
- 예외가 발생하면 트랜잭션을 롤백하여 데이터 일관성을 유지
- 적용 위치
- 서비스 클래스(@Service)나 특정 메서드에 적용
- 클래스 레벨에 적용하면 해당 클래스의 모든 메서드에 트랜잭션이 적용됨
- 메서드 레벨에 적용하면 그 메서드만 트랜잭션 관리 하에 실행됨
애너테이션으로 부가기능 제공시 문제점
애너테이션으로 부가기능 제공하는 것을 많은 곳에서 사용해야 할 때
- TransactionProxy 클래스를 Order, Member 등에 만들어야 하면 Transaction과 관련된 메서드 코드만 수백개 수천개를 만들어야 될 수 있음 → 번거롭고, 오타 또는 오류가 발생할 가능성이 큼
⇒ 해결방법 : AOP
스프링의 프록시 AOP
- AOP는 스프링에서 그다지 성공하지 못한 핵심 기술 중의 한
- 활용 용도가 제한적이면서 막상 사용하기는 매우 어려움
- 스프링이 만들어 놓은 트랜잭션과 보안 기술에서는 유용하게 활용
- 직접 활용하려면 꽤 많은 학습이 필요함