개념
AOP(Aspect Oriented Programming)
언제 왜 쓰는지 알면 된다
공통 관심 사항 vs 핵심 관심 사항
공통 관심사항과 핵심 관심 사항이 섞여있으면 유지보수가 어렵다
또한 공통의 관심사항을 만들기 어렵고 변경시 모두 변경해야 함
AOP는 공통 관심 사항(cross-cutting concern) 과 핵심 관심 사항(core concern) 을 분리하는 것


적용
- 클래스 범위에 @Aspect 어노테이션
- 빈으로 등록 해야함 ⇒@component로 등록 혹은 configuration파일에 @Bean 으로 등록 (보통 후자를 사용한다. 이유는 config 파일에 올리면 특별하니까)
- 메서드 범위에서 AOP 어노테이션 사용함
AOP 어노테이션
- Before(”$pointcut}”)이 어노테이션이 붙은 메소드의 반환값은 void
- 지정한 패턴에 해당되는 메서드 실행 전 동작
- After(”$pointcut}”)이 어노테이션이 붙은 메소드의 반환값은 void
- 지정된 패턴에 해당하는 메서드 실행한 뒤 동작
- Around(”$pointcut}”)반환값은 Object여야 한다(지정된 패턴에 해당하는 메서드의 실행 결과를 반환해야 하므로)
- 지정된 패턴에 해당하는 메서드 실행 전, 후 모두 동작
pointcut
와일드 카드
*: 모든 것
…:0개 이상
excution
특정 메서드를 지정하는 패턴
아래 나오는 표현식 일부 제외하고 execution 으로 대체 가능하다.
execution([접근제어자] 반환타입 패키지.패키지…클래스.메소드(인자))
@Around("execution(public * com.daz_tlog.test.controller.**.**(..)")
within
클래스 안 메서드 모두 지정
클래스명까지 지정할 수 있음을 유의
@Around(”within(com.daz_tlog.test.controller.*)”)
@within
특정 어노테이션 타입을 갖는 객체에 대해서 aop 지정
aop를 적용할 메서드가 있는 클래스 타입을 지정
단, 그 어노테이션의 retention은 class여야함
@withn(org.springframework.stereotype.Controller)
this, target
클래스를 상속 받는 하위객체를 지정
하지만 둘은 하위객체가 어떻게 생성에 따라 달라진다. this는 CGLB 기반 프록시로 생성되는 객체를 지정할 때 사용arget는 JDK 기반 프록시를 사용
this(상위 객체 타입) / target(상위 객체 타입)
this(com.pamyferret.impl.TestImpl)
target(com.pamyferret.impl.TestImpl)
@target
특정 타입의 어노테이션이 붙어있는 객체를 지정할 수 있는 점에서 @within이랑 똑같이 동작한다.
실제 이 둘의 차이점은 잘 느껴지지 않는다고 하는데, @target은 런타임 때 객체가 일치하는지 확인하므로 해당 어노테이션의 retention이 Runtime이어야 한다.
@target(어노테이션 타입)
@target(org.springframework.stereotype.Repository)
@annotation
특정 어노테이션이 붙은 객체에 대해 aop를 적용시킨다.
@annotation(어노테이션 타입)
@annotation(com.daz_tlog.test.AnnotationTest)
출처:
https://jung-story.tistory.com/129
'개발공부 > 개념' 카테고리의 다른 글
| [용어정리] 오버헤드(overhead) 란? (0) | 2022.06.24 |
|---|---|
| [개념 정리] 트랜잭션 (transaction) (0) | 2022.05.10 |
| http request 구조 (0) | 2022.05.09 |
| [0317] 디버깅 (0) | 2022.03.17 |
| [0315] 공부 (0) | 2022.03.15 |