✨ 어노테이션을 사용하는 이유 (효과)는 무엇일까?
- Annotation은 무엇인가?
1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
2. 빌드 또는 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
3. 실행 시 특정 기능을 실행하도록 정보 제공
- Annotation의 뜻은?
사전상으로는 주석의 의미이지만 Java에서는 주석 이상의 기능을 가지고 있습니다.
Anootation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다. 소스 코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있습니다.
- Annotation 사용하는 이유
기존의 자바 웹 어플리케이션들은 대부분 설정값을 XML파일에 명시하여 관리했습니다. 변경될 수 있는 데이터들은 코드가 아닌 외부 설정 파일(XML)에 분리하기 때문에 재컴파일 없이도 쉽게 변경사항을 저장할 수 있었습니다.
하지만, 프로그램 작성을 위해 매번 많은 설정을 해야 하며 수많은 설정 파일들을 관리해야 했습니다.
이러한 문제점을 해결하기 위해 고안된 문법이 Annotation 입니다.
어노테이션을 사용하면 데이터에 대한 유효성 검사조건을 보다 쉽게 파악할 수 있게 되며 코드가 깔끔해집니다.
단순히 부가적인 표현뿐만 아니라 리플렉션을 이용하면 어노테이션 지정만으로 원하는 클래스를 주입할 수 있습니다.
- Annotation 용도
1. @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도
2. 스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플렉션을 이용해서 특수 기능을 추가하기 위한 용도
3. 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도
🎨 나만의 어노테이션은 어떻게 만들 수 있을까?
- 사용자 정의 어노테이션 (Custom Annotation)
1. 어노테이션 생성
사용자 정의 어노테이션을 사용하기 위해 @interface를 통해 어노테이션 클래스를 작성할 수 있습니다.
public @interface CustomAnnotationClass {
}
위와 같이 생성된 어노테이션은 다른 곳에서 참조되지만 아무런 기능을 하지 않는다.
2. 메타 어노테이션 추가
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface CustomAnnotationClass {
}
- 메타 어노테이션 종류
- Retention: 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정함
- RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
- RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
- RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
- Documented: JavaDoc 생성 시 Document에 포함되도록 함
- Target: 해당 어노테이션이 사용되는 위치를 결정함
- ElementType.PACKAGE : 패키지 선언 시
- ElementType.TYPE : 타입 선언 시
- ElementType.CONSTRUCTOR : 생성자 선언 시
- ElementType.FIELD : 멤버 변수 선언 시
- ElementType.METHOD : 메서드 선언 시
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시
- ElementType.LOCAL_VARIABLE : 지역 변수 선언 시
- ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시
- Inherited: 해당 어노테이션을 하위 클래스에 적용함
- Repeatable: Java8부터 지원하며, 연속적으로 어노테이션을 선언하는 것을 허용함
3. 변수 추가
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface CustomAnnotationClass {
String name() default "dafault name";
int number() default 0;
}
어노테이션에 값을 부여하기를 원한다면 변수를 다음과 같이 선언해 줄 수 있습니다.
강의 링크
참고 링크
https://dev-musa.tistory.com/54
'스터디 > 워밍업-클럽' 카테고리의 다른 글
| [인프런 워밍업 클럽] 5일차 - 클린 코드 (0) | 2024.02.23 |
|---|---|
| [인프런 워밍업 클럽] 4일차 - 추가적인 API 만들기 (0) | 2024.02.22 |
| [인프런 워밍업 클럽] 3일차 - 익명 클래스와 람다식 (0) | 2024.02.21 |
| [인프런 워밍업 클럽] 2일차 - GET, POST API 만들기 (0) | 2024.02.20 |