AOP의 적용 간단 플로우 (간단한 예제)
by mignon251. 패키지 & AOP 클래스 생성
- AOP 관련 클래스들을 모아둘 패키지 생성
- AOP 로직을 가지는 클래스 생성

2. @Aspect 애너테이션 적용
- TimeTraceAop 클래스에 @Aspect 애너테이션을 적용해준다.
@Aspect // 1. AOP 적용
public class TimeTraceAop {
// aop 로직 메서드 작성
}
3. Advice(AOP 로직) 작성 및 Advice 를 사용할 위치 지정(애너테이션 사용)
각 비즈니스 로직이 수행되는 시간을 측정할 TimeTraceAop 만의 로직 작성(메서드)
이러한 부가기능 로직 코드를 어드바이스(Advice)라고 한다.
@Around("execution(* hello.hellospring..*(..))") // Advice 적용 위치 및 범위 지정
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { // AOP 메서드의 시그니처
// AOP 로직
}
각 어드바이스에 대한 자세한 내용은 따로 정리할 것이다.
일단 어떤 종류의 어드바이스 애너테이션들을 적용할 수 있고, 해당 어드바이스들이 어느 시점에 적용되는지만 확인해보자.
- @Before : 조인 포인트 실행 이전에 실행
- @AfterReturning : 조인 포인트가 정상 완료 후 실행
- @AfterThrowing : 메서드가 예외를 던지는 경우에 실행
- @After(finally) : 조인 포인트의 동작(정상 또는 예외) 과는 상관없이 무조건 실행
- @Around : 메서드 호출 전후에 수행하며, 옵션을 통해 위의 모든 애너테이션들을 대체할 수 있다.
(참고) @Around 만 있어도 모든 기능 수행이 가능하지만, 제약을 두어 좀 더 역할을 명확하게 하는 것이 좋다.
현재 @Around 적용
- Around 의 파라미터 : 해당 AOP 를 적용할 범위 지정
- "excution(* hello.hellospring..*(..))" : hello.hellospring 의 하위 패키지에 모두 적용하겠다는 의미
4. Advice 실제 코드 작성
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
- joinPoint.proceed() : 다음 어드바이스나 타겟을 호출
- 비즈니스 메서드에 대한 정보를 ProceedingJoinPoint 객체로 리턴받을 수 있다.
- @Around 애너테이션을 사용할 경우에 필요한 메서드
- around 어드바이스의 경우 클라이언트의 호출을 가로챈다.
- 만일 around 어드바이스 메서드에서 막바로 return 을 해버리면 비즈니스 메서드 자체가 실행되지 않는다.
- 그러므로, around Advice 메서드에서 비즈니스 메서드 호출에 대한 책임을 감당해야 한다.
- 그러려면 비즈니스 메서드에 대한 정보를 around Advice 메서드가 가지고 있어야 한다.
- 그 정보를 Spring 컨테이너가 around Advice 메서드로 넘겨주는데, 그것이 ProceedingJoinPoint 객체이댜.
- Object 로 반환하는데, 여기에는 비즈니스 메서드가 실행한 후의 결과 값들이 담겨 있게 된다.
5. 스프링 빈으로 등록 => 설정 파일에 추가
컴포넌트스캔을 사용하고, TimeTraceAop 클래스에 @Component 를 적용하는 것도 가능하다.
그러나 AOP 의 경우 어떤 AOP 가 적용되고 있는지 알아볼 수 있도록 직접 설정 파일을 만들어 관리해주는 것이 좋다.
@Configuration
public class SpringConfig {
// ...
@Bean
public TimeTraceAop timeTraceAop() {
return new TimeTraceAop();
}
}'Spring' 카테고리의 다른 글
| 컴포넌트 스캔 - @ComponentScan (0) | 2023.04.07 |
|---|---|
| 싱글톤 패턴 & 싱글톤 컨테이너 (0) | 2023.04.06 |
| 스프링 컨테이너 (0) | 2023.04.05 |
| [Spring 특징] PSA (Portable Service Abstraction) (0) | 2023.04.04 |
| [Spring 특징] AOP (Aspect Oriented Programming) (0) | 2023.04.04 |
블로그의 정보
Mignon'S Dev Log
mignon25