어노테이션(Annotation)이란 소스 코드 안의 요소(클래스나 메소드 등)에 대해 정보(메타 데이터)를 설명하는 메커니즘입니다.
클래스나 메서드에 특정 역할 및 의미를 갖게 하는데 사용할 수 있습니다.
자바에서 제공하는 표준 API에서는 다음과 같은 어노테이션이 있습니다.
1) 메소드의 오버라이드를 나타내는 @Override
2) 비추천을 나타내는 @Deprecated
3) 경고를 출력하지 않도록 하는 @SuppressWarnings
위에서 제공하는 자바 표준 API 말고도 자바, 스프링에서는 사용자가 커스텀 어노테이션을 만들 수 있습니다.
아래글에서부터는 커스텀 어노테이션을 만드는 방법에 대하여 알아보도록 하겠습니다.
1. Anotation 생성
public @interface LogExecutionTime {
}
위의 방법으로 간단하게 어노테이션을 생성해보았습니다. 눈에 띄는 부분은 interface 키워드 앞에 @가 있네요.
이번에 만들 어노테이션은 LogExecutionTime인데, 메소드가 진행되는 시간을 콘솔에 출력해보겠습니다.
그러기 위해서는 아래 코드처럼 어노테이션을 2개 더 추가해주어야합니다.
@Target(ElementType.METHOD) // Target을 메소드로 선언
@Retention(RetenTionPolicy.RUNTIME) // RUNTIME으르 지정할 시 컴파일 이후에도 JVM에 의해서 참조가 가능
@LogExecutionTime {
}
2. 어노테이션을 적용할 클래스에 부여
@LogExecutionTime
public class DemoApplication {
...
}
DemoAplication 클래스에서 LogExecutionTime 어노테이션을 입혀보았습니다. 이제 DemoAplication 클래스가 실행되면, LogExecutionTime 어노테이션이 실행될 것입니다. 하지만, 지금 실행시킨다면 현재는 LogExecutionTime에 아무 코드가 없으므로 빈 껍데기일뿐입니다.
3. LogExecutionTime 기능 추가
@Component // 빈 생성 (아래에 @Aspect를 한다고 해서 빈이 생성되는 것은 아니므로 빈 생성이 따로 필요함.)
@Aspect // 설명하기 어렵지만, 흩어진 기능을 모을 때 사용
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("@annotation(LogExecutionTime)") // 실패여부와 상관없이 전후로 실행되도록 하는 Active
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throable { // joinpoint는 logExecutionTime이 붙어있는 메소드들 타겟
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object procced = joinPoint.proceed();
stopWatch.stop();
logger.info(stopWatch.prettyPrint());
return proceed;
}
}
@LogExecutionTime을 읽어서 실행시간을 측정하는 부분이 LogAspect 클래스 안에 담겨있습니다. 혹시라도 소스가 이해가 잘 안되시는 분들은 주석을 참고해주시기 바랍니다.
이상으로 어노테이션 만들기에 대한 포스팅이었습니다. 감사합니다.
Reference
'1. 웹개발 > 1_2_2 Spring Framework' 카테고리의 다른 글
[Spring] AOP 총정리 및 예제 (0) | 2020.11.29 |
---|---|
[Spring] Filter, Interceptor, AOP 개념과 차이점 (2) | 2020.03.09 |