AOP(관점 지향 프로그래밍)란?
- 부가기능을 모듈화
- AOP (Aspect Oriented Programming) 를 통해 부가기능을 모듈화
- **'부가기능'**은 '핵심기능'과는 관점(Aspect), 관심이 다름
- 따라서 '핵심기능'과 또옥~!! 분리해서 '부가기능' 중심으로 설계, 구현 가능
- AOP (Aspect Oriented Programming) 를 통해 부가기능을 모듈화
- 스프링이 제공하는 AOP
- Aspect: Advice + PointCut
- Advice: 어떤 부가기능을 언제?
- PointCut: 부가기능 적용 위치. 어느 패키지/메서드에?
부가기능을 핵심기능에서 필요로 할 때만 불러다 실행하고 다시 호출됐던 그 명령을 핵심 기능에 넘겨주는 역활
개념적으로는 수행전 수행후 혹은 두 모두에서 실행되는 매서드로 볼 수 있다.
실제 스프링 내부에서는 AOP 프록시라는 요소에 의해 사용자의 요청을 컨트롤러에 닿기 전 먼저 가로채 필요한 부가기능을 실행한 후에 다시 컨트롤러로 보내준다.
- 스프링 AOP 어노테이션
- @Aspect - 스프링 빈 (Bean) 클래스에만 적용 가능
- 어드바이스 종류
- @Around: '핵심기능' 수행 전과 후 (@Before + @After)
- @Before: '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)
- @After: '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
- @AfterReturning: '핵심기능' 호출 성공 시 (함수의 Return 값 사용 가능)
- @AfterThrowing: '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우만 동작 (ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
- 포인트컷
- 포인트컷 Expression Language
- 포인트컷 Expression 형태
- ? 는 생략 가능
- execution(modifiers-pattern? return-type-pattern declaring-type-pattern? **method-name-pattern(param-pattern)** throws-pattern?)
- 포인트컷 Expression 형태
- 포인트컷 Expression Language
포인트컷
- 포인트컷 Expression Language
- 포인트컷 Expression 형태
- ? 는 생략 가능
- execution(modifiers-pattern? return-type-pattern declaring-type-pattern? **method-name-pattern(param-pattern)** throws-pattern?)
- 포인트컷 Expression 예제
- @Around("execution(public * com.sparta.springcore.controller..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... }
- modifiers-pattern, 제어자
- public, private, *
- return-type-pattern, 반환타입
- void, String, List<String>, *****
- declaring-type-pattern, 클래스
- 클래스명 (패키지명 필요)
- com.sparta.springcore.controller.* - controller 패키지의 모든 클래스에 적용
- com.sparta.springcore.controller.. - controller 패키지 및 하위 패키지의 모든 클래스
- method-name-pattern(param-pattern)
- 함수명
- addFolders : addFolders() 함수에만 적용
- add* : add 로 시작하는 모든 함수에 적용
- 파라미터 패턴 (param-pattern)
- (com.sparta.springcore.dto.FolderRequestDto) - FolderRequestDto 인수 (arguments) 만 적용
- () - 인수 없음
- (*) - 인수 1개 (타입 상관없음)
- (..) - 인수 0~N개 (타입 상관없음)
- 함수명
- @Pointcut
- 포인트컷 재사용 가능
- 포인트컷 결합 (combine) 가능
- 포인트컷 Expression 형태
@Component
@Aspect
public class Aspect {
@Pointcut("execution(* com.sparta.springcore.controller.*.*(..))")
private void forAllController() {}
@Pointcut("execution(String com.sparta.springcore.controller.*.*())")
private void forAllViewController() {}
@Around("forAllContorller() && !forAllViewController")
public void saveRestApiLog() { ... }
@Around("forAllContorller()")
public void saveAllApiLog() { ... } }
'항해 99(9기) > 항해 일일' 카테고리의 다른 글
항해 99 25일차 (0) | 2022.10.13 |
---|---|
항해 99 23일차 (0) | 2022.10.11 |
항해 99 19일차 (1) | 2022.10.07 |
항해 99 18일차 (0) | 2022.10.06 |
항해 99 17일차 (0) | 2022.10.05 |