[spring] AOP를 활용하여 API 성능 측정하기 - 1

KIM Jongwan·2024년 1월 22일
0

SPRING

목록 보기
4/5
post-thumbnail

spring aop를 활용하여 API 성능을 측정하고 개선이 필요한 로직의 성능을 개선해봅시다.

API 성능 측정하기

API 서버를 개발하다 보면 method 실행 시간 확인이 필요할 때가 있습니다.

public void doSomething(HttpServletRequest request){
	long startTime = System.nanoTime();

	//do something

	long finishTime = System.nanoTime();
	System.out.print("메소드 실행 시간(ns): " + (finishTime - startTime));
}

위와 같이 method의 실행 직후, 종료 직전 System.nanoTime(); 호출하여 각 시간의 차로 간단하게 성능 측정할 수 있지만 이와 같은 작성은 몇 가지 문제점이 있습니다.

  1. 핵심 기능과 부가 기능이 공존한다.
    - 프로그래머가 작성한 비지니스 로직의 목적(사용자 조회, 아이템 등록 등)이 되는 기능을 핵심 기능이라고 합니다. 이와 반대로 핵심 기능에 관여하지 않지만 method실행 시 함께 실행되는 기능을 부가 기능(로깅, 성능 측정 등)이라고 합니다.
    위와 같이 작성하였을 때의 문제는 핵심 기능(do something 부분)과 부가 기능 부분이 공존한다는 점입니다.
    비지니스 로직이 복잡할 경우 이는 코드의 가독성을 떨어트리고, 유지 보수에 복잡도를 가중시키리 수 있습니다.

  2. Class 단위 성능 측정이 어렵다.

    • 만약 클라이언트가 특정 컨트롤러 클래스 하위 모든 method의 성능 측정을 원할 때, 위와 같이 작성한다면 모든 method의 시작부와 종료부에 시간 측정 로직을 작성해주어야 합니다.

Spring 에서 제공하는 APO는 이러한 핵심 기능과 부가 기능을 분리하고, Target을 설정하여 대상이 되는 method의 지정 부분(실행 직후, 종료 직전, 실행 종료)에 부가 기능을 수행할 수 있도록 합니다.

AOP 적용하기

의존 추가

AOP사용을 위해 build.gradle에 spring-boot-starter-aop 의존을 추가한다.

dependencies {
	// ...
	implementation 'org.springframework.boot:spring-boot-starter-aop'
	// ...
}

spring-boot-starter-aop의존을 추가하면 org.aspectj // org.springframework.spring-aop 패키지를 사용할 수 있다.

spring-boot-starter-aop 의존은 org.aspectj 와 같은 패키지를 포함하고 있다.
profile
2년차 백앤드 개발자입니다.

0개의 댓글