Annotation 이란?
- Meta-Data
데이터를 위한 데이터
구조화 된 정보를 분석, 분류하고 부가적 정보를 추가하기 위해 데이터 뒤에 따라가는 정보
메타 데이터는 설정 정보 저장의 역할을 하고 이전에는 이를 xml에 기재하였는데
설정 정보가 점점 방대해지면서 어노테이션이 등장하게 되었다.
==> 기존의 코드와 설정이 분리 된 방식에서 코드에 설정을 명시하는 방식으로 변화하며
일종의 주석이 의미를 가지게 되어 컴파일과 런타임에 영향을 주는 것
Annotation의 용도
- 컴파일러에게 프로그래밍 문법 에러를 체크하도록 정보 제공
- IDE가 빌드 및 배치 시 코드를 자동 생성하도록 정보 제공
- 런타임 시 특정 기능을 실행하도록 정보 제공 -> 스프링에서 주로 사용
Annotation의 용법
어노테이션 파일을 정의하는 데 필요한 것
- Target - 어노테이션의 적용 대상
- Retention - 어노테이션의 유지 대상
- Annotation Name - @interface로 정의 된 어노테이션명
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션 이름]{ ... }
출처: https://hirlawldo.tistory.com/43 [도비의 블로그]
Target ElementType Enum값
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html
RetentionPolicy Enum값
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html
Controller.class 분석
- @Target({ElementType.TYPE})
Class, interface (including annotation type), or enum declaration
클래스, 인터페이스(어노테이션 타입 포함), 열거형 선언에 적용될 수 있다.
따라서 컨트롤러 클래스 파일을 만들었을 때, 해당 클래스에 @Controller 어노테이션을 붙일 수 있는 것
- @Retention(RetentionPolicy.RUNTIME)
Annotations are to be recorded in the class file by the compiler and retained by the VM at run time, so they may be read reflectively.
어노테이션은 컴파일러에 의해 클래스 파일에 기록되고 런타임에 VM에 의해 유지되어 reflective 하게 읽을 수 있다.
( Reflection : https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC )
어노테이션이 Runtime 시에도 유지되도록함
- @Documented
JavaDoc에 자동으로 Document를 남겨주는 어노테이션
- @Component
스프링 컨테이너에 해당 클래스의 객체를 생성하도록 명시함
모든 컴포넌트에 대한 제너릭 스테레오 타입
Repository, Service, Controller에 해당하지 않는 기타 자원 클래스에 사용
성능 측정을 위한 LogExecutionTime 어노테이션 정의
- Annotation File
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
- LogAspect File
@Around("@annotation(LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
logger.debug("Aspect start service - {} / {}()", pjp.getSignature().getDeclaringTypeName(),
pjp.getSignature().getName());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = pjp.proceed();
stopWatch.stop();
logger.debug(stopWatch.prettyPrint() );
logger.debug("Aspect finished service - {} / {}()", pjp.getSignature().getDeclaringTypeName(),
pjp.getSignature().getName());
return proceed;
}
refer: https://hirlawldo.tistory.com/31
- Method
- Result
'Spring Boot' 카테고리의 다른 글
좋은 객체지향 설계의 5가지 원칙 SOLID & Spring (0) | 2021.06.08 |
---|---|
객체 지향 설계와 Spring boot (0) | 2021.06.07 |
스프링 싱글톤 :: Spring Singleton (0) | 2021.05.11 |
MyBatis Framework 개념, Spring Boot 연동 (0) | 2020.11.16 |
[Java] RestTemplate로 Kakao Local Rest Api 호출해보기 (0) | 2020.09.12 |