Post

Aspect Oriented Programming

✅ AOP

  • Distinguish between cross-cutting concern and core concern
  • 공통 관심 사항핵심 관심 사항을 분리하기

  • 예를 들어 회원가입, 상품 조회, 주문, 구매등 하는 쇼핑몰이 있다고 하자
  • 그런데 성능 측정을 위해 회원가입, 상품 조회, 주문, 구매 메소드 시간을 측정하고 싶다
  • 👎🏻 AOP 적용 전: 회원가입, 상품 조회, 주문, 구매 각 메소드에 getTime하는 함수를 붙여 코드를 바꿔야 한다
  • 👎🏻 비즈니스 로직과 cross-cutting concern이 섞여서 코드 구성, 유지보수 어려움

Image

  • 👍🏻 AOP 적용 후:
  • cross-cutting concern and core concern 분리
  • cross-cutting concern: 시간 재기
  • core concern: 쇼핑몰 메소드
  • getTime하는 클래스TimeTraceApp를 만들고, 이 클래스를 메소드가 실행될 때 적용시킨다
  • 시간을 측정하는 로직을 별도의 공통 로직으로 따로 빼서 만들었다
  • 그리고 @Around를 사용해 원하는 적용 대상을 선택해 적용시켰다.

Image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Aspect //aspect of programming
@Component //component scan
public class TimeTraceApp {

    @Around("execution(* com.example.java_spring..*(..))") //이 공통 관심사를 어디에 적용시킬지
    //이 경우 com.example.java_spring 밑에 있는 모든 파일에 적용
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
        long start = System.currentTimeMillis();
        try{
            Object result = joinPoint.proceed();
            return result;
        }finally{
            long finish = System.currentTimeMillis();
            long timeMs = finish - start; //시간 재는 로직
        }
    }
}

This post is licensed under CC BY 4.0 by the author.