본문 바로가기

Spring

어노테이션과 커스텀 어노테이션 만들기

728x90

 

어노테이션

  • 사전적으로는 '주석'이라는 의미를 가짐
  • 소스 코드에 추가해서 사용할 수 있는 메타 데이터의 일종
  • 앞에 @기호를 붙여 사용하고 JDK 1.5버전 이상에서 사용 가능

 

어노테이션의 용도

  • 컴파일러에게 토드 작성 문법 에러를 체크하도록 정보 제공
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 런타임 시 특정 기능을 실행하도록 정보 제공

 

어노테이션 사용 순서

  • 어노테이션 정의
  • 클래스에 어노테이션 배치
  • 코드가 실행되는 중에 Reflection을 이용해 추가 정보를 획득해 기능 실시

 

어노테이션 사용 효과

  • 코드 가독성 향상
    • 코드에 추가 정보를 제공해 코드를 이해하기 쉽게 만듦
    • 메소드, 변수, 클래스에 대한 설명을 포함해 다른 사람들이 코드를 이해하는 데 도움을 줌
  • 코드 문서화
    • 자바와 같은 정적 타입 언어에서 메소드의 매개변수, 반환 유형, 예외 등에 대한 정보를 제공해 자동 문서화를 할 수 있음
  • 컴파일 타임 체크
    • @Nullable과 같은 몇 어노테이션은 컴파일러에게 특정 규칙을 적용하도록 지시함
    • 코드의 안정성을 향상시킬 수 있음
  • 코드 검증 및 분석
    • @Valid를 이용해 파라미터를 검증할 수 있는 것처럼 코드를 검증해줄 수 있음

 

 

 

어노테이션 관련해서는 작년에 관련 책 내용 정리해둔 글이 있어서 해당 링크를 아래에 걸어둘테니까 글이 궁금하신 분들은 아래 링크로,,😉

https://yestruly.tistory.com/60

 

[스프링 프레임워크] 3. 스프링 프레임워크의 핵심 기능 알아보기

1. 스프링 프레임워크의 핵심 기능 1) 의존성 주입(Dependency Injection) 의존하는 부분을 외부에서 주입하는 것 2) 관점 지향 프로그래밍(Aspect Oriented Programming) 중심적 관심사 : 실현해야 하는 기능을

yestruly.tistory.com

 

 


 

커스텀 어노테이션 만드는 방법

  • @interface, @Target, @Retention 를 사용해 어노테이션 선언
    • @interface로 어노테이션 선 
    • @Target : 대상타임 설정
    • @Retention : 유효 시간 설정
  • 어노테이션에 포함될 요소 정의. 메소드와 유사하고 기본값을 가질 수 있음
  • 필요시 어노테이션에 대한 옵션을 추가로 지정해줄 수 있음
  • 어노테이션 적용
    • 커스텀 어노테이션을 이용해 프로그램 요소에 메타 데이터 제공
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME) // 어노테이션을 런타임까지 유지, 런타임 시 검사 이뤄짐
@Target(ElementType.METHOD) // 어노테이션을 METHOD에 적용할 수 있음
public @interface CustomAnnotation {
	String value() default " ";
    int priority() default 0;
    boolean isTrue() default false; //추가요소 정의

}

class MyClass {

    @MyCustomAnnotation(value="HelloWorld", priority=2, isTrue=true)
    public void myMethod() {
       //메소드 내용 입력해서 사용
    }
}


class AnnotationProcessor {
    public static void main(String[] args) throws Exception {
        MyClass obj = new MyClass();
        for (var method : obj.getClass().getDeclaredMethods()) {
            if (method.isAnnotationPresent(MyCustomAnnotation.class)) {
                MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
                System.out.println("Value: " + annotation.value());
                System.out.println("Priority: " + annotation.priority());
            }
        }
    }
}

 

728x90