반응형
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 이름으로 로그가 남는걸 확인할 수 있다.
반응형
'스프링 > 만들면서 배우는 실무 백엔드 개발' 카테고리의 다른 글
14. GitHub Action 에서 스프링 배치 실행하기 (0) | 2023.08.08 |
---|---|
13. SpringBatch 5 + Kotlin 적용하기 (0) | 2023.07.16 |
11. Jacoco + Gradle.kts 로 테스트 커버리지 확인하기 (feat. SonarQube) (0) | 2023.04.07 |
10. ArchUnit 으로 아키텍쳐 검사하기 (0) | 2023.04.05 |
9. 단위 테스트 작성하기 (feat. JUnit5 + MockK) (0) | 2023.04.02 |
댓글