카테고리 없음

Spring 성능 측정해보기 -Spring AOP 적용하기

_hanbxx_ 2024. 4. 2. 01:41
728x90

문제점

팝콘작 추천하기 기능에서 TMDB API를 사용하는 데 OKHTTP를 Feign Client로 바꾸어 API 성능을 개선을 했었다

https://hanbxx.tistory.com/56

 

TMDB OPEN API 연결 OKHTTP -> FeignClient로 변경해서 구현하기 +Test 코드 작성하기

팝콘메이트에서 외부 API와 통신하는 기능이 적지 않다. 카카오와 애플은 이미 FeignClient를 이용하여 구현을 하였는데, 영화 관련 Open Api (영진위,TMDB)는 OKHTTP를 이용하여 사용하고 있다. 이미 FeignC

hanbxx.tistory.com

이 포스팅에서 다루어보았다

우선 실제로 API 성능 테스트나 모니터링을 직접 해본 적이 없어서 개선했던 API의 성능을 측정해보려고 한다

 

AOP

- 모든 메소드의 호출 시간을 측정하고 싶다면?

- 공통 관심 사항(cross-cutting concern) vs 핵심관련 사항(core concern)

- 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

 

  public void execute(RecommendedPopcornRequest request) throws IOException {

        long start = System.currentTimeMillis();

        try {
            validateMovieId(request.getMovieId());

            JsonParser parser = new JsonParser();
            JsonElement jsonObject = parser.parse(request.getMovieId());
            String movieTypeWithoutQuotes = request.getMovieType().replaceAll("\"", "");

            //TODO
            String responseString = tmdbClient.getMovieData(movieTypeWithoutQuotes,request.getMovieId(),"Y",tmdb);
            changeToObject(responseString,request);

        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join = " + timeMs + "ms");
        }

        //RecommendedPopcorn.of(request.getMovieId(),request.getReason())
    }

 

 

이렇게 원하는 메서드에 하나씩 다 넣어야 된다

-> 복잡하고 귀찮은 작업이다!!

그리고 시간 측정 로직은 핵심 비즈니스 로직이 아니라 공통 로직 사항이다! 

그래서 AOP가 필요한 상황이 발생

 

AOP 적용해보기

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* com.example.domains.recommendedPopcorn..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws  Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: "+ joinPoint.toString());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: "+joinPoint.toString()+" "+timeMs+"ms");
        }
    }
}

 

@Around 어노테이션 안에 AOP를 적용할 패키지 경로를 적어주면 끝

@Component를 적용해줘야지 build할 때 AOP 클래스를 스캔해서 빈으로 알아서 주입해준다

 

결과

 

다음 포스팅에서는 이 측정한 시간을 어떻게 개선해야 할 지 더 다루어 보려고 한다

728x90