본문 바로가기
스프링/만들면서 배우는 실무 백엔드 개발

12. SpringBoot 에서 AOP 적용하기 (Kotlin)

by kdohyeon (김대니) 2023. 5. 4.
반응형

AOP (Aspect Oriented Programming) 은 관점 지향 프로그래밍의 약자로 관심사의 분리를 하기 위한 방법으로 주로 사용합니다. 간단하게 여기서 한번 알아본 적이 있었는데, 이번 시간에는 코드로 한번 작성해보려고 합니다.


Pull Request: https://github.com/kdohyeon/crypto-labs/pull/40

의존성 추가

SpringAOP 의존성을 추가해준다.

implementation("org.springframework.boot:spring-boot-starter-aop")

AOP 시작하기

  • @EnableAspectJAutoProxy 어노테이션을 어플리케이션 레벨에 추가해주어야 한다.
@SpringBootApplication
@EnableAspectJAutoProxy <-- 추가
class CryptoLabsApplication

fun main(args: Array<String>) {
    runApplication<CryptoLabsApplication>(*args)
}

Aspect 작성하기

  • 각 API 가 수행되는 시간을 체크하기 위해 실행 시간을 탐지하는 Aspect 를 만든다.
  • @Aspect 어노테이션을 부여한다.
  • 실행 시간은 API 실행 시작 전 시간과 종료 후 시간이 모두 필요하기 때문에 @Around 어노테이션을 활용한다.
  • 특정 API 에 대해서만 실행 시간을 탐지하기 위해 어노테이션 기반으로 Aspect 를 만든다.
  • LoggerFactory 를 활용하여 로그를 남긴다.
@Aspect
@Component
class ExecutionTimeAspect {

    private val log = LoggerFactory.getLogger("EXECUTION_TIME_LOGGER")

    @Around("@annotation(LogExecutionTime)")
    fun executionTime(joinPoint: ProceedingJoinPoint): Any? {
        val start = System.currentTimeMillis()

        val proceed = joinPoint.proceed()

        val executionTime = System.currentTimeMillis() - start

        log.info("${joinPoint.signature} executed in ${executionTime}ms")

        return proceed
    }
}

어노테이션 만들기

  • LogExecutionTime 이라는 어노테이션을 만들기 위해 아래와 같이 코드를 작성한다.
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class LogExecutionTime

AOP 적용하기 (어노테이션 부여)

  • LogExecutionTime 이라는 어노테이션을 만들었고, 이걸 원하는 메소드 위에 부여해주면 된다.
@RestController
class SampleController {
    @LogExecutionTime
    @GetMapping("/api/v1/sample")
    fun sample(): String {
        return "Hello World";
    }
}

결과 확인

  • EXECUTION_TIME_LOGGER 이름으로 로그가 남는걸 확인할 수 있다.

반응형

댓글