Kim-Baek 개발자 이야기

[백기선 - 예제로 배우는 스프링 입문] 스프링 AOP 본문

개발/Spring

[백기선 - 예제로 배우는 스프링 입문] 스프링 AOP

김백개발자 2020. 9. 20. 10:51
인프런에서 백기선 님의 [예제로 배우는 스프링 입문] 을 듣고 정리한 내용입니다

AOP 소개

흩어진 코드를 한 곳으로 모아

흩어진 AAAA 와 BBBB

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 와 BBBB

class A {

   method a () {

           오늘은 7월 4일 미국 독립 기념일이래요.

   }

 

   method b () {

           저는 아침에 운동을 다녀와서 밥먹고 빨래를 했습니다.

   }

}



class B {

  method c() {

          점심은 이거 찍느라 못먹었는데 저녁엔 제육볶음을 먹고 싶네요.

  }

}



class AAAABBBB {

    method aaaabbb(JoinPoint point) {

         AAAA

  point.execute()

         BBBB

    }

}

다양한 AOP 구현 방법

  • 컴파일  A.java ----(AOP)---> A.class (AspectJ)

  • 바이트코드 조작 A.java -> A.class ---(AOP)---> 메모리 (AspectJ)

  • 프록시 패턴 (스프링 AOP)

프록시 패턴

 

Proxy

There are dozens of ways to utilize the Proxy pattern. Let’s go over the most popular uses. Access control (protection proxy). This is when you want only specific clients to be able to use the service object; for instance, when your objects are crucial par

refactoring.guru

- Cash , CashPerf 예제가 있는데, 기존에 결제를 하는 Cash 클래스는 변화하지 않았다. 하지만 CashPerf 안에서 Cash를 가져다 쓰면서 앞 뒤로 성능을 측정하는 코드가 들어갔다. 그렇게 되면 CashPerf 를 사용함으로 써, 기존의 Cash 코드의 변화 없이 앞 뒤에 새로운 기능이 추가된다.

- @Transactional 을 붙이면 해당 클래스 앞 뒤로 트랜잭션을 설정하는 코드가 들어가게 된다.

 

AOP 적용 예제

@LogExecutionTime 으로 메소드 처리 시간 로깅하기

@LogExecutionTime 애노테이션 (어디에 적용할지 표시 해두는 용도)

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface LogExecutionTime {

}

 

실제 Aspect (@LogExecutionTime 애노테이션 달린곳에 적용)

@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;

   }


}

 

반응형
Comments