💡 개요
오늘은 Spring에서 자주 사용되는 어노테이션을 커스텀하는 방법을 정리해 보자.
왠지 어노테이션 커스텀하면 멋있어 보임.
📕 어노테이션
일단 어노테이션이 뭔지 정리해 보자.
어노테이션은 Java5부터 추가된 기능으로 코드에 메타데이터를 추가하는 방법이다.
이를 통해 특정 기능을 쉽게 적용할 수 있다.
다음은 커스텀 어노테이션 인터페이스이다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
주요 특징으론 어노테이션이 적용될 대상과 해당 어노테이션의 유지 기간을 설정해야 한다.
위 어노테이션은 메서드 범위에 적용될 어노테이션이고, 유지 기간은 런타임 시작부터 종료까지이다.
뿐만 아니라 interface가 아니라 @interface를 사용한다.
다음은 어노테이션을 사용하는 코드이다.
public class SampleService {
@LogExecutionTime
public void execute() {
System.out.println("메서드 실행");
}
}
위 코드에서 @LogExecutionTime 어노테이션이 execute() 메서드에 적용되었지만, 실제로 실행 시간을 측정하는 기능을 수행하려면 추가적인 구현이 필요하다.
구현 방법은 다음과 같다.
@Aspect
@Component
public class LogExecutionTimeAspect {
@Around("@annotation(com.example.customannotation.LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 실제 메서드 실행
long end = System.currentTimeMillis();
System.out.println(joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");
return result;
}
}
위 코드를 통해 Spring AOP를 활용하여 @LogExecutionTime 어노테이션이 붙은 메서드의 실행 시간을 측정하는 기능을 구현하였다.
@Around("@annotation(com.example.customannotation.LogExecutionTime)") 부분을 보면 AOP 적용 대상이 LogExecutionTime 인터페이스로 선언된 것을 볼 수 있다.
이제 해당 기능을 테스트할 수 있도록 실행 코드를 작성해 보자.
@SpringBootApplication
public class CustomAnnotationApplication {
public static void main(String[] args) {
SpringApplication.run(CustomAnnotationApplication.class, args);
}
}
@Component
class Runner implements CommandLineRunner {
@Autowired
private SampleService sampleService;
@Override
public void run(String... args) throws Exception {
sampleService.execute();
}
}
위의 main 코드를 실행한 결과, 다음과 같은 결과가 출력되었다.
어노테이션 적용도 잘 되었고, AOP도 잘 적용되었다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.29 - deleteAll() vs deleteAllInBatch() (0) | 2025.03.29 |
---|---|
[개발 일기] 2025.03.28 - Auto Increment Long PK vs UUID (0) | 2025.03.28 |
[개발 일기] 2025.03.26 - REDO, UNDO (0) | 2025.03.26 |
[개발 일기] 2025.03.25 - forward 프록시 (Nginx) (0) | 2025.03.25 |
[개발 일기] 2025.03.24 - JIT 컴파일러 (0) | 2025.03.24 |