Spring AOP 로드맵
AOP를 학습하기 위해 김영한 강사님의 Spring 고급 편 강의를 듣고 있는데, AOP를 보다 더 완벽하게 이해하기 위해서는 아래의 단계를 따라야 한다.
학습해야 할 내용이 방대하지만 차근차근 나아가보자.
이번 글에서는 저번 글에 이어 Spring이 사용하는 디자인 패턴 중 전략 패턴 그중에서도 데코레티어 패턴을 다룬다.
1. 동시성 문제 - 쓰레드 로컬
2. 전략 패턴 - 템플릿 메서드 패턴과 콜백 패턴
3. 프록시 - 프록시 패턴과 데코레티어 패턴
4. 동적 프록시
5. Spring 지원 동적 프록시
6. 빈 후처리기
7. @Aspect AOP
8. Spring AOP
프록시 패턴과 디코레이터 패턴은 저번 글에서 언급했지만, 의도에 따라 구분된다.
프록시 패터은 캐싱, 로그, 접근 제어(실제 객체로 접근을 제어)가 주 의도이고, 디코레이터 패턴은 추가 기능 수행이 주 의도이다.
데코레이터 패턴의 이해와 예제 프로젝트 만들기
/* test */
@Slf4j
public class DecoratorPatternTest {
@Test
void noDecoration() {
RealComponent realComponent = new RealComponent();
DecoratorPatternClient client = new DecoratorPatternClient(realComponent);
client.execute();
client.execute();
client.execute();
}
}
/* component */
public interface Component {
String operation();
}
@Slf4j
public class RealComponent implements Component {
@Override
public String operation() {
log.info("RealComponent 실행");
return "data";
}
}
/* client */
@Slf4j
public class DecoratorPatternClient {
private Component component;
public DecoratorPatternClient(final Component component) {
this.component = component;
}
public void execute() {
String operation = component.operation();
log.info("result = {}", operation);
}
}
데코레이터 패턴 적용 전 - 클래스 의존 관계
데코레이터 패턴 적용 전 - 실제 런타임 객체 의존 관계
이제 서버가 제공하는 기능에 더해서 부가 기능을 추가해보자.
데코레이터 패턴 적용 후 - 클래스 의존 관계
데코레이터 패턴 적용 후 - 런타임 객체 의존 관계
이제 messageDecorator를 생성해 test에서 조립해보자.
/* MessageDecorator */
@Slf4j
public class MessageDecorator implements Component {
private Component component;
public MessageDecorator(final Component component) {
this.component = component;
}
@Override
public String operation() {
log.info("MessageDecorator 실행");
// data -> ***** data *****
String result = component.operation();
String decoResult = "*****" + result + "*****";
log.info("MessageDecorator 꾸미기 적용 전={}", result);
log.info("MessageDecorator 꾸미기 적용 후={}", decoResult);
return decoResult;
}
}
/* DecoratorPatternTest */
@Test
void decorator1() {
RealComponent realComponent = new RealComponent();
MessageDecorator messageDecorator = new MessageDecorator(realComponent);
DecoratorPatternClient client = new DecoratorPatternClient(messageDecorator);
client.execute();
}
/*
실행 결과
MessageDecorator - MessageDecorator 실행
RealComponent - RealComponent 실행
MessageDecorator - MessageDecorator 꾸미기 적용 전=data, 적용 후=*****data***** DecoratorPatternClient - result=*****data*****
*/
지금까지 나온 기느이 GOF의 데코레이터 패턴이다.
이렇게 꾸며주는 기능 등 어떠한 목적에 맞게 생성하는 패턴을 데코레이터 패턴이라고한다.
하지만 중복이 있다. 꾸며주는 역할을 하는 Decorator들은 스스로 존재할 수 없으며 내부에 호출 대상인 Component를 항상 호출해야한다.
이러한 중복을 제거하기 위해 나중에 동적 프록시의 기술을 배운다.
'Spring > Spring AOP' 카테고리의 다른 글
Spring AOP 6. 포인트컷, 어드바이스, 어드바이저 (0) | 2024.03.20 |
---|---|
Spring AOP 5. ProxyFactory (0) | 2024.03.18 |
Spring AOP 4. 동적 프록시: JDK 동적프록시와 CGLIB (0) | 2024.03.08 |
Spring AOP 2. 디자인 패턴: 프록시패턴 (0) | 2024.03.06 |
Spring AOP 1. 디자인 패턴: 전략 패턴 - 템플릿 메서드 패턴 (0) | 2024.03.01 |