Post

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.