
어노테이션
- Java 5부터 추가된 기능으로 소스코드에 추가적인 정보를 제공하는 메타데이터의 기능 수행
- 클래스, 메서드, 변수, 인자 등에 추가할 수 있음
- 메타데이터이기에 비즈니스 로직에 직접적으로 영향을 주진 않지만 메타데이터 정보에 따라 실행 흐름을 변경할 수 있음
종류
- Built-in 어노테이션 : Java 코드에 적용되는 어노테이션
- @Override, @Deprecated, @SuppressWarnings 등
- Meta 어노테이션 : 다른 어노테이션에 적용되기 위한 어노테이션
- 커스텀 어노테이션 만들때 사용해야 함
- @Retention, @Documented, @Target, @Inherited, @Repeatable 등
@Retention
- 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지 설정
- RetentionPolicy.SOURCE : 컴파일 전까지만 유효하며 컴파일 이후 사라짐
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효(default)
- RetentionPolicy.RUNTIME : Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조됨
@Target
- 해당 어노테이션이 사용될 수 있는 위치를 선정
- ElementType.PACKAGE : 패키지 선언시
- ElementType.TYPE : 타입 선언시(class, interface, enum)
- ElementType.CONSTRUCTOR : 생성자 선언시
- ElementType.FIELD : 멤버 변수 선언시
- ElementType.METHOD : 메소드 선언시
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
- ElementType.LOCAL_VARIABLE : 지역 변수 선언시
- ElementType.TYPE_PARAMETER : 매개 변수 타입 선언시(Generic)
...
@Documented
- Java Doc 생성시 Document에 포함되도록 하는 설정
@Inherited
@Repeatable
- Java 8 버전부터 지원하며 연속적으로 어노테이션을 선언하는 것을 허용
실습 코드
실습 1
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldAnnotation {
String name();
String value();
}
- Annotation 선언하기 위해서 @interface 사용
- 어디까지 적용, 어디에 적용할지는 Meta Annotation 설정
- 주로 반복적인 작업들을 줄여주기 위해 커스터마이징 어노테이션 설정
- 이런 경우 주로 Runtime 환경 -> Retention : Runtime으로 설정하는것이 태반
실습 2
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {
String name();
String value() default "I'm Method";
}
실습 3 - Type : 클래스, 인터페이스, enum 타입에서 사용되는 어노테이션
실습 4 - validation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Constraint(validatedBy = ParameterValidator.class)
public @interface ValidationAnnotation {
String message() default "Invalid Value. It should be 'hello'";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ParameterValidator implements
ConstraintValidator<ValidationAnnotation, String> {
@Override
public void initialize(ValidationAnnotation constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.equals("hello");
}
}
- @Constraint : 설정하는 어노테이션이 어떤 Validator를 따르는지 설정