어노테이션이란?
스프링을 쓸 때 많이 쓰는 어노테이션들이 있다.
@PostMapping이라던가 @RequestBody라던가
어느샌가 당연하게 기능 위주로 생각하며 어노테이션을 쓰고 있었다.
그렇다면 어노테이션은 무엇이고 왜 쓰는걸까?
어노테이션이란 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다.
소스 코드에 대한 데이터를 제공하는 것이다.
메타데이터란?
데이터에 대한 데이터.
데이터의 상태를 표현하는 데이터이다.
어노테이션의 용도
- 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
- 런타임 시 특정 기능을 실행하도록 정보를 제공한다.
어노테이션의 종류
- 내장 어노테이션
- @Override
- 선언한 메서드가 오버라이드 되었다는 것을 나타낸다.
- 부모 클래스/인터페이스에서 해당 메서드를 찾지 못하면 컴파일 에러를 발생시킨다.
- 메서드명 오타를 찾아내는데 유용하다.
- @Deprecated
- 해당 메서드를 더 이상 사용하지 않을 것을 권장할 때 붙인다.
- 하위 호환성 때문에 메서드 유지는 하지만 추후 사용하지 않을 메서드에 사용한다.
- @SuppressWarnings
- 컴파일러의 경고 메시지를 나타나지 않게 하고싶을 때 붙인다.
- @FucntionalInterface
- 컴파일러에게 이 인터페이스는 함수형 인터페이스라는 것을 알린다.
- 실수를 방지하기 위해 사용한다.
- @Override
- 메타 어노테이션
- 어노테이션에 사용되는 어노테이션
- 새로운 어노테이션을 정의할 때 @interface 상단에 작성한다.
- @Target
- 어노테이션을 적용가능한 대상을 지정하는데에 사용한다.
- 여러개의 값을 지정할 때는 배열처럼 중괄호{ }를 사용해야 한다.
- ElementType.PACKAGE : 패키지 선언
- ElementType.TYPE : 타입 선언
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
- ElementType.CONSTRUCTOR : 생성자 선언
- ElementType.FIELD : 멤버 변수 선언
- ElementType.LOCAL_VARIABLE : 지역 변수 선언
- ElementType.METHOD : 메서드 선언
- ElementType.PARAMETER : 전달인자 선언
- ElementType.TYPE_PARAMETER : 전달인자 타입 선언
- ElementType.TYPE_USE : 타입 선언
- @Retention
- 어노테이션이 유지되는 기간을 지정한다.
- 3가지 유지정책(retention policy)을 사용한다.
- SOURCE
- 소스 파일에만 존재하며 클래스 파일에는 존재하지 않는다.
- @Override 같이 컴파일러에 의해 사용되는 어노테이션 유지 정책이다.
- CLASS
- 클래스 파일에는 존재하지만 런타임 시에는 사용이 불가능하다.
- Retention 어노테이션의 디폴트 값이다.
- 잘 사용되지 않는다.
- RUNTIME
- 클래스 파일에 존재하며 런타임 시에도 사용 가능하다.
- 런타임 시에 리플렉션(Reflection)을 통해 클래스 파일에 저장된 어노테이션 정보를 읽어서 처리할 수 있게 한다.
- @FunctionalInterface는 컴파일러가 체크하는 어노테이션이지만, 런타임 시에도 사용되므로 RUNTIME의 유지 정책을 가진다.
- @RequestMapping이나 @Transactional과 같이 스프링에서 자주 사용되는 어노테이션들도 RUNTIME의 유지 정책을 가진다.
- SOURCE
- @Documented
- 어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 할 때 사용한다.
- built-in-annotation 중 @Override, @SuppressWarnings를 제외하고는 모두 이 어노테이션이 붙어있다.
- @Inherited
- 어노테이션이 자손 클래스에도 상속되도록 하는 어노테이션이다.
- 이 어노테이션을 부모 클래스에 붙이면 자식 클래스도 이 어노테이션이 붙은 것과 같이 인식된다.
- (한 번 붙여둔 어노테이션을 상속하면 계속 안 붙여도 된다는 얘기)
- @Native
- 네이티브 메서드에 의해 참조되는 상수필드에 붙인다.
- 네이티브 메서드: JVM이 설치된 OS의 메서드
- 보통 C언어로 작성되어 있고 자바에서는 메서드의 선언부만 정의하고 구현은 하지 않는다.
- Object 클래스의 메서드들은 대부분 네이티브 메서드이다.
- 우리는 자바를 통해 OS의 메서드를 호출하고 있다.
- 네이티브 메서드와 자바에 정의된 메서드를 연결하는 것을 JNI(Java Native Interface)라고 한다.
- 커스텀 어노테이션
해당 커스텀 어노테이션은 타입 앞, 메소드 앞에 @RequestMapping을 붙여서 사용가능하다.
어노테이션의 요소 개수에 따른 분류
- Maker Annotation
- 요소가 한개도 없으며 단순히 표식으로서 사용되는 어노테이션이다.
- 이 어노테이션은 컴파일러에게 어떤 의미를 전달하는데 사용된다.
- Single-value Annotation
- 요소로 단일 변수만을 갖는 요소이다.
- 단일변수 밖에 없기 때문에 값만을 명시해 데이터를 전달할 수 있다. -> @RequestBody(true)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
/**
* Whether body content is required.
* <p>Default is {@code true}, leading to an exception thrown in case
* there is no body content. Switch this to {@code false} if you prefer
* {@code null} to be passed when the body content is {@code null}.
* @since 3.2
*/
boolean required() default true;
}
- Full Annotation
- 요소로 둘 이상을 갖는다.
- 데이터를 배열 안에 key-value 형태로 전달한다.
- 요소의 타입은 기본형, String, enum, annotation, Class만 허용한다.
- 요소의 ()안에 매개변수를 선언할 수 없다.
- 예외를 선언할 수 없다.
'Language > Java' 카테고리의 다른 글
Java 기본 - final 키워드 (0) | 2023.06.29 |
---|---|
Java 기본 - 제네릭 Generic (0) | 2023.06.27 |
Java 기본 - Collection (0) | 2023.06.23 |
Java 기본 - JVM이란 무엇일까? (0) | 2023.06.22 |
GC란 무엇일까? Garbage Collector? (0) | 2023.06.22 |