본문으로 바로가기

 

 

 

어노테이션(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

백기선님의 예제로 배우는 스프링 (개정판)