아무거나

Annotation 설명 및 실습 본문

Java/Java

Annotation 설명 및 실습

전봉근 2021. 5. 5. 16:56
반응형

애노테이션(Annotation)

  • 정의: 코드 사이에 주석처럼 쓰이면서 특별한 의미, 기능을 수행하도록 하는 기술로 프로그램에게 추가적인 정보를 제공해주는 메타 데이터
  • 용도
    • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
    • 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
    • 런타임 시 특정 기능을 실행하도록 정보를 제공한다. (보통 스프링에선 해당 용도로 많이 쓰인다.)
    • 파일정의
      @Target({ElementType.[적용대상]})
      @Retention(RetentionPolicy.[정보유지되는 대상])
      public @interface [어노테이션 이름] {
          ... 
      }
      
  • 예제
    • 애노테이션 생성 [LogExecutionTime.java]
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface LogExecutionTime {
      
      }
      
    • @LogExecutionTime 어노테이션을 달아둔 메서드가 실행된 시간을 로그로 남기는 Aspect 파일을 작성 [LogExecutionTimeAspect.java]
      import lombok.extern.slf4j.Slf4j;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.Around;
      import org.aspectj.lang.annotation.Aspect;
      import org.springframework.stereotype.Component;
      import org.springframework.util.StopWatch;
      
      @Slf4j
      @Component
      @Aspect
      public class LogExecutionTimeAspect {
      
          // LogExecutionTime가 다른 경로에 존재할 때 @annotation 안에 경로를 풀 경로로 안하면 java.lang.IllegalArgumentException: error Type referred to is not an annotation type 에러가 난다
          @Around("@annotation(LogExecutionTime)")
          public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
              StopWatch stopWatch = new StopWatch();
              stopWatch.start();
              Object result = joinPoint.proceed();
              stopWatch.stop();
              log.info("================ LogExecutionTime: {}", stopWatch.prettyPrint());
              return result;
          }
      
      }
      
    • 원하는 메서드에 @LogExecutionTime 어노테이션 적용
      @LogExecutionTime
      @ApiOperation("Annotation TEST API")
      @GetMapping("examples")
      public void getCallMethod() throws InterruptedException {
          ThreadUtil.threadSleep(5);
      }
      
    • 결과
      ---------------------------------------------
      ns         %     Task name
      ---------------------------------------------
      082840000  100%       
      
반응형
Comments