728x90
반응형
SMALL
Spring in Action (5판)
- 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
- Walls, Craig 지음
- 제어펍 출판사
- 2020.05.14
스프링 인 액션 개인 스터디 내용을 정리하자.
Spring AOP
Spring AOP는 프록시 패턴으로 AOP 기능을 한다. 프록시 패턴을 사용하면 기능 추가 시 기존 코드를 변경하지 않는 장점이 있다.
어떤 클래스가 Spring AOP의 대상이라면 기존 클래스의 빈이 생성될 때 Spring AOP가 프록시를 자동으로 만들고 원본 클래스 대신 프록시를 빈으로 등록한다.
그리고 원본 클래스가 사용되는 지점에서 프록시를 대신 사용한다.
Spring AOP에 대한 자세한 내용을 아래를 참조하자.
hoooon-s.tistory.com/54?category=961471
상황
기존 메서드에 성능 측정을 해달라는 요구 사항이 발생했다.
모든 메서드에 성능 측정 로직을 추가하는 것은 비효율적이다.
@RestController
public class AopSample {
@GetMapping("/sample01")
public String sample01() {
int no = 0;
for (int a = 0; a < 1; a++) {
no++;
}
return "sample01";
}
@GetMapping("/sample02")
public String sample02() {
int no = 0;
for (int a = 0; a < 1000000000; a++) {
no++;
}
return "sample02";
}
}
Pointcut 커스텀 애노테이션 추가
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
Aspect 클래스 생성
@Slf4j
@Component
@Aspect
public class LogAspect {
@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = proceedingJoinPoint.proceed();
stopWatch.stop();
log.info(stopWatch.prettyPrint());
return proceed;
}
}
@Aspect
- 클래스가 횡단 관심사 클래스(Aspect)임을 알려주는 애노테이션
- 자동으로 빈에 등록되는 것이 아니므로 @Component 애노테이션을 통해 빈으로 등록해줘야 한다.
@Around({Pointcut})
- Advice의 한 종류로 Aspect의 실패 여부와 상관 없이 전, 후로 실행되도록 하는 Advice이다.
- 파라미터로 Pointcut을 전달해주어야 한다.
@Pointcut
- Aspect가 적용될 Joinpoint를 정의한 것이다.
기존 메서드에 Pointcut 추가
@RestController
public class AopSample {
@LogExecutionTime
@GetMapping("/sample01")
public String sample01() {
int no = 0;
for (int a = 0; a < 1; a++) {
no++;
}
return "sample01";
}
@LogExecutionTime
@GetMapping("/sample02")
public String sample02() {
int no = 0;
for (int a = 0; a < 1000000000; a++) {
no++;
}
return "sample02";
}
}
결과
728x90
반응형
LIST
'Study > Spring in Action' 카테고리의 다른 글
[Spring in Action] Spring Security & LDAP & CSRF (0) | 2021.01.24 |
---|---|
[Spring in Action] JDBC & JPA 데이터로 작업하기 (0) | 2021.01.24 |
[Spring in Action] Spring Filter & Interceptor & AOP (0) | 2021.01.23 |
[Spring in Action] Spring AOP & AspectJ (0) | 2021.01.23 |
[Spring in Action] Spring 이란? 구성요소 정리 (0) | 2021.01.20 |