[Spring] Annotation의 원리와 Custom Annotation 만들기

2022. 9. 5. 15:20Web/spring-boot

1.  Spring @Component 어노테이션

  • 스프링에서 Bean을 등록하는 방법은 다양하지만, 그중 @Component 어노테이션을 이용하는 방법이 있습니다.
  • @Component 어노테이션을 참조해서 들어가보면 4개의 어노테이션을 갖고있는걸 볼 수 있습니다.

  • J2SE 5.0 부터 어노테이션을 작성할 때 주로 java.lang.annotation 패키지에 있는 4가지 어노테이션을                                            이용하여 작성합니다.
    • @Target : 어노테이션을 작성 할 곳입니다. default 값은 모든 대상
      • ElementType.TYPE ( class, interface, enum) : 클래스, 인터페이스, 열거타임
      • ElementType.FIELD (instance variable) : 필드
      • ElementType.METHOD : 메소드
      • ElementType.PARAMETER : 파라미터
      • ElementType.CONSTRUCTOR : 생성자
      • ElementType.LOCAL_VARIABLE : 지역(로컬) 변수
      • ElementType.PACKAGE : 패키지
    • @Retention : 어노테이션의 지속 시간을 정합니다.
      • RetentionPolicy.RUNTIME : 이 어노테이션은 런타임시에도 .class 파일에 존재합니다.                                                                                                 커스텀 어노테이션을 만들 때 주로 사용, Reflection 사용 가능
      • RetentionPolicy.CLASS : default 값, 컴파일 타임때만 .class 파일에 존재하며, 런타임 때는 없어집니다.
      • RetentionPolicy.SOURCE : 컴파일 후에 정보들이 사라집니다. 이 어노테이션은 컴파일이 완료 된 후에는 없으므로                                                        바이트 코드에 기록되지 않습니다. @Override와 @SuppressWarnings 가 있습니다.
    • @Documented : Java doc에 문서화 여부를 결정합니다.

2.  Custom 어노테이션 만들기

  • 어노테이션 타입은 @interface로 정의해야하며, 모든 어노테이션은 자동적으로 java.lang.Annotation을                                        상속 받기 때문에 다른 클래스나 인터페이스를 상속 받으면 안됩니다.
  • 파라미터 멤버들의 접근자는 public 이거나 default 여야만 합니다.
  • 파라미터 멤버들은 String, byte, int, long, boolean 등 의 기본타입과 Enum, Class 만 사용 가능합니다.
  • 클래스 메소드와 필드에 관한 어노테이션 정보를 얻고 싶으면, 리플렉션만 이용해서 얻을수 있습니다.

대략적인 리플렉션 사용방법

3. 스프링은 @Componet 어노테이션을 어떻게 사용하고 있을까?

  • 스프링에서 애플리케이션을 실행 시 @Service나, @Component가 붙은 클래스들은 스캔해서 IoC컨테이너에                                자동으로 등록해주는 과정이 있습니다.

ClassPathBeanDefinitionScanner.java

  • doScan 메서드가 ClassPath에 있는 패키지의 모든 클래스를 읽어, 어노테이션이 분은 클래스를 처리해주는 클래스

   

 다음은 Spring AOP와 커스텀 어노테이션을 이용해서 Logging 하는 방법을 해보겠습니다.