[Java] 어노테이션(Annotation)

류넹·2023년 11월 29일
1

Java

목록 보기
19/20

# 목적

: Java의 Annotation에 대한 학습




Annotation 이란?

: 자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타데이터(부가적인 정보)의 일종
* 메타데이터 : 컴파일 과정이나 실행과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가적인 정보




Annotation의 용도

1. 문법 에러 체크

- 컴파일러에게 코드의 문법 에러를 체크하기 위한 정보를 제공
ex)

public interface Handler {
	void handle(Event event);
}

public class MyHandler implements Handler {
	@Override
	public void handle(Event event) {
    
    }
}
// @Override : 해당 메소드가 부모의 메소드를 재정의한 메소드임을 표기하는 어노테이션
//            -> @Override 어노테이션이 부착된 메소드에 대해서
//              부모 메소드의 구조와 동일한 구조를 가지고 있는지 체크함

2. 코드 자동 생성

- 애플리케이션 배포 시 코드를 자동으로 생성할 수 있도록 정보를 제공
ex)

@Getter
@Setter
public class User {
	private int no;
    private String id;
    private String pwd;
}
// @Getter, @Setter : 롬복(Lombok)의 어노테이션으로, Getter, Setter 메소드를 실행파일에 추가함

3. 특정 기능 실행

- 실행시점에 특정 기능을 실행하도록 제공
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객체에 저장된 값에 대해서 유효성 체크를 수행하도록 하는 어노테이션




4. JAVA의 Built-in 어노테이션

1) @Override
- 해당 메소드가 재정의된 메소드임을 나타내는 Annotation

2) @Deprecated
- 해당 메소드가 비추천 메소드(추후 사라질 메소드)임을 나타내는 Annotation

3) @SuppressWarnings
- 컴파일 경고를 출력하지 않도록 하는 Annotation

4) FunctionalInterface
- 함수형 인터페이스임을 나타내는 Annotation

* 함수형 인터페이스 : 추상 메소드를 딱 하나만 가지고 있는 인터페이스(java8부터 등장)
				   람다식(람다함수)에서 활용 가능
                   
* 함수 : 객체와 별개인 기능 구현체 / 메소드 : 객체에 포함된 기능 구현체`




5. 메타 어노테이션

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
- 자식 클래스가 어노테이션을 상속받을 수 있음




6. 사용자정의 어노테이션 작성하기

- 사용자정의 어노테이션을 지정한 경우,
해당 어노테이션은 분석하고 애플리케이션에 적용하는 어노테이션프로세서(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;
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글