: Java의 Annotation에 대한 학습
: 자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타데이터(부가적인 정보)의 일종
* 메타데이터 : 컴파일 과정이나 실행과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가적인 정보
- 컴파일러에게 코드의 문법 에러를 체크하기 위한 정보를 제공
ex)
public interface Handler {
void handle(Event event);
}
public class MyHandler implements Handler {
@Override
public void handle(Event event) {
}
}
// @Override : 해당 메소드가 부모의 메소드를 재정의한 메소드임을 표기하는 어노테이션
// -> @Override 어노테이션이 부착된 메소드에 대해서
// 부모 메소드의 구조와 동일한 구조를 가지고 있는지 체크함
- 애플리케이션 배포 시 코드를 자동으로 생성할 수 있도록 정보를 제공
ex)
@Getter
@Setter
public class User {
private int no;
private String id;
private String pwd;
}
// @Getter, @Setter : 롬복(Lombok)의 어노테이션으로, Getter, Setter 메소드를 실행파일에 추가함
- 실행시점에 특정 기능을 실행하도록 제공
ex)
// 회원가입폼에서 입력한 이름, 이메일, 생일 정보를 저장하는 VO 클래스
public class UserForm {
@NotBlank // 해당 변수에 값이 꼭 있어야 함
private String name;
@NotBlank
@Email // 유효한 이메일 형식이 아니면 오류 발생
private String email;
@Past // 변수 안에 들어있는 Date값이 현재보다 과거여야 함
private Date birthday;
}
// hibernate의 bean validator가 제공하는 어노테이션은 폼 입력값 유효성 체크를 위한 정보를 제공함
// 위의 어노테이션은 해당 변수가 가져야 하는 유효한 값의 형태를 표시함
// 이 객체에 저장된 값에 대한 유효성 여부를 체크할 때 어노테이션과 변수의 값을 비교해서 유효성을 체크함
// ex) public String register(@Valid UserForm userForm, ...) { }
// @Valid : 전달받은 UserForm객체에 저장된 값에 대해서 유효성 체크를 수행하도록 하는 어노테이션
1) @Override
- 해당 메소드가 재정의된 메소드임을 나타내는 Annotation
2) @Deprecated
- 해당 메소드가 비추천 메소드(추후 사라질 메소드)임을 나타내는 Annotation
3) @SuppressWarnings
- 컴파일 경고를 출력하지 않도록 하는 Annotation
4) FunctionalInterface
- 함수형 인터페이스임을 나타내는 Annotation
* 함수형 인터페이스 : 추상 메소드를 딱 하나만 가지고 있는 인터페이스(java8부터 등장)
람다식(람다함수)에서 활용 가능
* 함수 : 객체와 별개인 기능 구현체 / 메소드 : 객체에 포함된 기능 구현체`
1) @Retention
- 어노테이션의 보유 기간을 지정하는 Annotation
- 종류
① RetentionPolicy.SOURCE
> 컴파일 이후에는 삭제됨
② RetentionPolicy.CLASS
> 바이트 코드 파일까지 어노테이션 정보가 유지됨
> 프로그램 실행시점에 사용 불가
> 자바의 리플렉션 API를 이용한 어노테이션 정보 획득 불가
③ RetentionPolicy.RUNTIME
> 애플리케이션 실행시점에 어노테이션 정보 획득 가능
> 자바의 리플렉션 API를 이용한 어노테이션 정보 획득 가능
2) @Target
- 어노테이션이 적용될 위치를 나열함
- 종류
① Target.TYPE
> 클래스, 인터페이스, 열거 타입에 적용 가능
② Target.FIELD
> 필드(멤버변수, 정적변수)에 적용 가능
③ Target.CONSTRUCTOR
> 생성자에 적용 가능
④ Target.METHOD
> 메소드에 적용 가능
⑤ Target.PARAMETER
> 메소드의 매개변수에 적용 가능
3) @Documented
- 자바 API 문서에 어노테이션 정보가 표현됨
4) @Inherited
- 자식 클래스가 어노테이션을 상속받을 수 있음
- 사용자정의 어노테이션을 지정한 경우,
해당 어노테이션은 분석하고 애플리케이션에 적용하는 어노테이션프로세서(AnnotationProcessor)도 개발되어야 함
ex)
// 1. 정의하기
// > 사용자정의 어노테이션을 정의할 때, 반드시 @Retention, @target 메타 어노테이션을 지정해야 함
@Retention(RUNTIME)
@Target(FIELD)
public @interface Min {
int length() default 0;
String message() default "";
}
// 2. 사용하기
public class UserForm {
@Min(length = 5, message = "아이디는 최소 5글자 이상이어야 합니다.")
private String id;
}