항상 용어가 헷갈려서, 용어를 확실하게 정리하는 것이 중요하다.
포인트컷: 어디에 부가기능을 적용할지, 범위를 정하는 곳이다. 주로 클래스와 메서드 이름으로 필터링한다.
어드바이스: 바로 전 글에서 작성했던 것 처럼 프록시가 호출하는 부가 기능이다.
어드바이저: 단순하게 하나의 포인트컷과 하나의 어드바이스를 가지고 있는 것이다.
포인트 컷을 직접 정의할 수도 있지만 스프링이 이미 만들어둔 구현체를 사용하면 편하다.
포인트컷은 정말 많은 포인트컷을 제공한다.
1. NameMatchMethodPointcut: 메서드 이름을 기반으로 매칭, 내부에서는 PatterMatchUtils를 사용
2. JdkRegexMethodPointcut: JDK 정규 표현식을 기반으로 포인트컷을 매칭
3. TruePointcu: 항상 참을 반환
4. AnnotationMatchingPointcut: 애노테티션으로 매칭
5. AspectJExpressionPointcut: aspectJ 표현식으로 매칭
정말 다양한 포인트컷이 있지만, AspectJ 표현식을 사용하는 것이 일반적이다.
또한 하나의 프록시 객체에 여러개의 어드바이저를 적용할 수 있다.
원하는 만큼 등록할 수 있으며 여러개의 프록시 객체가 생성되는 것이 아닌, 하나의 프록시 객체에 여러개의 어드바이저가 생기는 것이다.
생성할 때 어드바이저에 등록한 순서대로 실행된다.
하지만 프록시 팩토리로 생성을 해도 문제가 여전히 존재한다.
슾프링 빈이 100개 있다고 가정할 때 여기에 프록시를 통해 부가 기능을 적용하려면 100개의 동적 프록시 생성 코드를 만들어야한다.
자동으로 컴포넌트 스캔이 된다고 해도 지금까지 학습한 방법으로는 적용할 수 없다. 이 때 사용하는 것이 빈 후처리기이다.
실제 객체를 스프링 컨테이너에 빈으로 등록하는 것이 아니라 부가 기능이 있는 프록시를 빈으로 등록해야한다.
빈후처리기
@Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부에 빈 저장소에 등록한다.
그 이후에 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용한다.
빈 후처리기 - BeanPostProcessor
스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 전에 조작하고 싶을 때 사용한다.
우리의 일반 객체를 프록시 객체로 바꾸어 등록하는 용도로 사용한다.
빈 후처리기의 기능은 막강하다.
객체를 조작할 수도 있고 완벽히 다른 객체로 바꿔치기 하는 것도 가능하다.
빈 후처리기 과정
빈 등록 과정을 빈 후처리기와 함께 살펴보자
1. 생성: 스프링 빈 대상이 되는 객체를 생성 (@Bean, 컴포넌트 스캔 모두 포함)
2. 전달: 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달
3. 후 처리 작업: 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 바꿔치기할 수 있다.
4. 등록: 빈 후처리기는 빈을 반환한다. 전달 된 빈을 그대로 반환하면 해당 빈이 등록되고 바꿔치기하면 바꾼 것이 등록된다.
직접 등록하는 과정도 있지만, 사실 너무 복잡해 생략하고, 자동 프록시 생성기를 알아보겠다.
자동 프록시 생성기 - AUtoProxyCreater
스프링 부트 자동 설정으로 AnnotationAwareAspectJAutoProxyCreator 라는 빈 후처리기가 스프링 빈에 자동으로 등록된다.
이 빈 후처리기는 스프링 빈으로 등록된 Advisor들을 자동으로 찾아서 프록시가 필요한 곳에 자동으로 프록시를 적용해준다.
Advisor안에 Pointcut과 Advice 모두 포함되어있는데 Advisor만 알고 있다면 Pointcut으로 어떤 스프링 빈에 프록시를 적용해야할지 알 수 있다.
AnnotationAwareAspectJAutoProxyCreator는 AspectJ와 관련된 AOP기능도 자동으로 찾아서 처리해준다.
또한, @Aspect 라는 애노테이션이 붙은 클래스에서 어드바이저가 있다는 것을 캐치하고, 포인트컷을 통해 프록시 객체로 만들어야할 객체 대상을 판단하여 프록시 객체를 자동으로 생성해준다.
그렇다면 우리는 @Aspect 를 사용하여 어드바이저를 생성한 후 프록시 객체가 될 대상인 포인트 컷과, 어떠한 역할을 할지 즉 어드바이스가 무엇을 할지만 정해주면 프록시를 쉽게 사용할 수 있는 것이다.
'Spring > Spring AOP' 카테고리의 다른 글
Spring AOP 5. ProxyFactory (0) | 2024.03.18 |
---|---|
Spring AOP 4. 동적 프록시: JDK 동적프록시와 CGLIB (0) | 2024.03.08 |
Spring AOP 3. 디자인 패턴: 데코레이터 패턴 (0) | 2024.03.06 |
Spring AOP 2. 디자인 패턴: 프록시패턴 (0) | 2024.03.06 |
Spring AOP 1. 디자인 패턴: 전략 패턴 - 템플릿 메서드 패턴 (0) | 2024.03.01 |