Spring - 3 스프링 AOP,PSA(강의 끝)
해당 자료는 인프런 백기선님의 예제로 배우는 스프링 입문(개정판) 강의노트입니다..
1. 스프링 AOP
- AOP가 필요한 이유는 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
method a () {
AAAA -> AAA
오늘은 7월 4일 미국 독립 기념일이래요.
BBBB -> BB
}
method b () {
AAAA -> AAA
저는 아침에 운동을 다녀와서 밥먹고 빨래를 했습니다.
BBBB -> BB
}
}
class B {
method c() {
AAAA -> AAA
점심은 이거 찍느라 못먹었는데 저녁엔 제육볶음을 먹고 싶네요.
BBBB -> BB
}
}
만약 코드를 AAAA에서 AAA를 고쳐야한다하면 메소드를 다 찾아서 고쳐야하는 것은 고된 작업입니다.
때문에 위의 AAAA와 BBBB를 따로 클래스로 빼놓은개념을 AOP라 할 수 있습니다.
- 예제는 1월2일에 작성한 스프링 포스트와 비슷하니 따로 작성하지 않겠습니다. (메소드 수행시간 출력 예제)
구현 방법에는 3가지가 있습니다.
- 컴파일 A.java —- (AOP) —-> A.class (컴파일한 코드에는 조작을 한것처럼 AspectJ가 제공)
- 바이트코드 조작 -> Class Loader가 class를 읽어오고 메모리에 올릴 때 조작함 (AspectJ가 제공)
- 프록시 패턴 -> Spring AOP
프록시 패턴 예제는 애노테이션을 먼저 달아두고 단축키를 이용해 애노테이션을 제작하였습니다.
- @Target을 통해 메소드에 사용할 것이라고 알려주고, @Retention을 통해 Runtime까지 유지할 것이라고 알려줍니다.
1
2
3
4
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
여기까지는 주석과 비슷하게 달려있는 것입니다. 애노테이션을 읽어서 처리하는 Aspect를 만들어야합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
@Aspect
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = joinPoint.proceed();
stopWatch.stop();
logger.info(stopWatch.prettyPrint());
return proceed;
}
}
- joinPoint는 실행할 메소드가 들어옵니다.
- 나머지 내용은 수행시간을 읽어서 다시 리턴하는 것입니다.
후에 PSA와 스프링 캐시, 트랜잭션 등에 대한 설명을 하십니다. 제가 글로 잘 녹여낼 수 없어서 듣는 것을 추천합니다.
This post is licensed under CC BY 4.0 by the author.