1.
spring-context 기본 모듈에 AOP 기능은 있으나,
어노테이션 추가기능 사용 위해 aspectjweaver 디펜던시 추가
2.
delegate 패턴
- interface Calculator
- class implements Calculater : field + 세터 + @Override(앞뒤로 추가기능)
-
3.
프록시 : 실행은 다른 객체에 위임하고 부가 기능을 제공하는 객체
4.
대상 객체 : 실제 핵심 기능을 실행하는 객체
* 프록시보다 데코레이터
-
5.
AOP (관점보다는 기능으로 해석)
핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적용하는 것
6.
3가지 시점
AspectJ : 컴파일 시점
AspectJ : 클래스 로딩 시점 : 바이트코드에 삽입
스프링 제공 : 런타임에 프록시 객체 생성
7.
스프링 AOP는 프록시 객체를 자동으로 만들어주며, 직접 구현할 필요 없다.
8.
주로 Around Advice 사용
(실무에서 캐시, 성능 모니터링 역시 around사용)
-
9.
사용할 3개 페이지 = "설정 + 사용할 Aspect 클래스 + 메인에서 사용"
@Configuration
@EnableAspectJAutoProxy
public Appctx class { @Bean - Aspect구현 클래스}
@Aspect -> @PointCut(targetclass) -> @Around("publicTarget")
메인 : ctx 만들기 -> getBean(일반 cal 객체만 만든다) -> 사용 -> ctx.close
-
10.
어라운드 내부에서
try -> jointPoint.proceed(); (실제 대상객체 호출)
앞에 시간측정 준비 +finally에 시간측정
11.
@Enable : 복잡한 스프링 설정을 대신 함
(인에이블 웹 MVC)
-
12. 프록시 생성 방식
컨테이너에서 cal 빈 받아올때 인터페이스 원본 Calculator 로 받아와야 프록시가 만들어진다. 프록시 역시 원본 인터페이스를 상속하기 때문
@EnableAspectJAutoProxy(proxyTargetClass=true) -> 실제 클래스 이용해서 빈 객체 구현
-
13.
캐시 기능 추가하여 여러 프록시의 작동순서
@Aspect
@Order(1)
-
14. 포인트컷 다른 사용
@Around에 excution 명시자 직접 사용
-
15. 공통 Pointcut 사용
캐시에서 @PointCut 경로 설정 삭제
캐시에서
@Around("aspect.ExeTimeAspect.publicTarget()")
public Object execute(ProceedingJointPoint jointPoint) throws Throwable {}
16.
CommonPointCut 클래스 별도 작성
@Pointcut("execution)(public-경로)")
public void commonTarget() {}
'학습 기록 > 스프링 복습' 카테고리의 다른 글
DispatcherServelet (0) | 2024.05.20 |
---|---|
JDBC Template / 트랜잭션 (0) | 2024.05.07 |
빈 라이프사이클 (0) | 2024.05.07 |
스프링 DI 복습 (0) | 2024.05.07 |