일반적으로 스프링 빈이 등록하면, 컨테이너 내부의 빈 저장소에 등록한다.
사용할 때는 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다.
빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다.
빈 후처리기의 기능은 막강해서, 완전히 다른 객체로 바꿔치기 하는 것도 가능하다.
사용 방법은 BeanPostProcessor를 구현한 구현체를 만들고 빈으로 등록하는게 끝이다. 아래는 A 클래스를 B 클래스로 바꿔서 빈을 등록시키는 빈 후처리기다.
일반적으로 스프링 컨테이너가 등록하는 빈들은 중간에 조작할 방법이 없는데, 빈 후처리기를 사용하면 개발자가 등록하는 모든 빈을 중간에 조작할 수 있다.
이런 기능을 이용해서 실제 객체를 프록시 객체로 교체하는 것도 가능하다.
빈 후처리기를 만들어 주입만 해주면 항상 우선순위를 가진다.
결과물을 실행시키면 아래와 같이 프록시 객체로 주입되는 것을 확인할 수 있다.
프록시 팩토리의 문제점
문제1. 너무 많은 설정
문제2. 컴포넌트 스캔으로 등록한 빈에 프록시 적용 불가능
2가지 문제를 빈 후처리기를 통해 해결할 수 있다.
스프링에서는 프록시를 생성하기 위한 빈 후처리기를 이미 만들어서 제공한다.
예시에서는 패키지 기준으로 프록시 적용대상을 정의했는데, 포인트 컷을 쓰면 더 깔끔하게 처리할 수 있다.
Spring AOP는 포인트컷을 사용해서 프록시 적용 대상 여부를 체크한다.
포인트 컷의 사용처
1. 프록시 적용 대사 여부를 판별할 때 (빈 후처리기)
2. 프록시가 호출한 메서드에 어드바이스를 적용할지 판단 (프록시)
먼저 의존성을 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.
@EnableAspectJAutoProxy
를 직접 사용해야 했는데, 스프링부트가 자동으로 처리해준다. AopAutoConfiguration을 참고하자.
AutoProxyCreator
AutoProxyCreator 작동 과정
실제로 코드에 적용할 때는 Advisor만 만들어주면된다. 정확히 타겟을 지정하지 않으면 의도치 않은 곳에도 프록시가 마구 걸리기 때문에, 실무에서는 AspectJExpressionPointcut을 쓴다.
항상 강조하시는 부분은 Advisor 갯수만큼 절대 프록시가 많이 생기지 않는다는 것이다. advisor를 통해서 pointcut을 조회하고 해당하는 위치에 작동하는 proxy는 한개만 생성한다.