자바에는 막강한 기능 중 하나인 어노테이션이 있다. 어노테이션을 통해 클래스, 메소드, 변수 등 프로그램에 관한 데이터를 제공하거나 코드에 정보를 추가할 때 사용한다.
Spring 프레임워크에서는 다양한 어노테이션을 기본적으로 제공한다. ( Controller, Service 등등 )
이 밖에도 사용자는 코드에 데이터를 제공하거나 정보를 추가할 때 사용할 어노테이션을 커스터마이즈할 수 있다. 간단하게 예를 들면, 공통 관심 사항 처리를 위한 AOP가 있다.
어노테이션을 커스텀 할 때, 사용하는 두 종류의 어노테이션이 있다.
@Target
해당 어노테이션이 생성될 수 있는 위치를 지정하는 어노테이션이다.
@Target(ElementType.PARAMETER) // 파라미터 타입 선언 시
@Target(ElementType.TYPE) // 타입 선언 시
@Target(ElementType.CONSTRUCTOR) // 생성자 선언 시
@Target(ElementType.FIELD) // 멤버 변수 선언 시
@Target(ElementType.METHOD) // 메소드 선언 시
@Target(ElementType.ANNOTATION_TYPE) // 어노테이션 타입 선언 시
@Target(ElementType.LOCAL_VARIABLE) // 지역변수 선언 시
@Target(ElementType.TYPE_PARAMETER) // 파라미터 타입 선언 시
@Target(ElementType.PACKAGE) // 패키지 선언 시
@Retention
어노테이션의 유효범위를 정하는 어노테이션이다. ( 시점을 얘기한다 )
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후 런타임까지
@Retention(RetentionPolicy.CLASS) //
@Retention(RetentionPolicy.SOURCE) // 컴파일 시점까지
어노테이션의 의도는 숨겨지기 때문에 어떤 동작을 하게 되는 지, 명확하지 않다면 로직을 이해하기 어렵게 된다. 이는 커스텀 어노테이션에서 부담이 더 가중된다.
어노테이션 사용은 코드를 간결하게 만들지만, 유지보수 및 코드 명확성을 올리기 위해서 꼭 필요한 어노테이션인지 점검하는 일이 중요하다.