어노테이션이란
Annotation의 사전적 의미는 주석이다.
그럼 원래 알고 있는 주석과 어노테이션은 무엇이 다를까?
Java에서 우리가 말하는 주석은 영어로 Comment이다.
주석은 코드 실행에 영향을 안 끼치면서 코드를 설명하기 위한 보조 설명이고,
어노테이션은 소스 코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.
주석 | 어노테이션 | |
목적 | 코드에 대한 설명이나 문서화 목적으로 사용. 주로 개발자가 코드를 이해하기 쉽도록 코드에 메모를 남기는 용도로 사용. |
코드에 부가적인 정보를 제공하고 특정 작업을 지시하는데 사용. 주로 프레임워크나 라이브러리가 코드를 자동으로 처리하거나 특정 동작을 수행하도록 지시하는데 사용. |
구문 | 일반적으로 '//' 또는 '/* */' 와 같은 구문을 사용하여 코드에 메모를 추가함. | '@' 기호를 사용하여 어노테이션을 나타냄 어노테이션은 자바의 특별한 형태의 인터페이스로, 클래스, 메서드, 변수 등에 메타데이터를 부여. |
처리방식 | 컴파일러가 주석을 무시하며, 주석은 컴파일된 코드에 포함되지 않음. 주로 소스코드의 가독성을 높이기 위해 사용. |
컴파일러가 어노테이션을 인식하고 처리. |
어노테이션을 사용하는 이유
1. 부가적인 메타 데이터 제공 : 어노테이션은 코드에 부가적인 정보를 제공하여 다른 프로세스나 라이브러리에 특정 작업을 수행하도록 지시.
2. 코드의 문서화 및 가독성 향상 : 어노테이션을 사용하여 코드에 주석을 추가하거나 특정 동작을 설명함으로써 가독성을 향상 가능.
3. 컴파일 타임에 검증 및 코드 생성 : 어노테이션 프로세서를 사용하여 컴파일 타임에 어노테이션을 처리하고 검증하며, 필요한 경우 코드를 생성하거나 수정 가능, 이를 통해 런타임 오류를 방지하고 코드를 자동화할 수 있다.
사용자 정의 어노테이션 만들기
사용자 정의 어노테이션을 만들기 위해서는 Java가 제공하는 meta 어노테이션을 알아야한다.
meta 어노테이션
- 다른 어노테이션에 적용되기 위한 어노테이션
- @Retention, @Document, @Target, @Inherited, @Repeatable 등이 존재
@Retention : 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 결정
- @RetentionPolicy.SOURCE : 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
- @RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
- @RetentionPolicy.RUNTIME : Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
@Document : Java Doc 생성 시 Document에 포함되도록 함
@Target : 해당 어노테이션이 사용되는 위치를 결정
- ElementType.PACKAGE : 패키지 선언 시
- ElementType.TYPE : 타입 선언시
- ElementType.CONSTRUCTOR : 생성자 선언시
- ElementType.FIELD : 멤버 변수 선언시
- ElementType.METHOD : 메서드 선언시
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
- ElementType.LOCAL_VARIABLE : 지역 변수 선언시
- ElementType.TYPE_PARAMETER : 매개 변수 타 선언시
@Inherited : 해당 어노테이션을 하위 클래스에 적용
@Repeatable : 연속적으로 어노테이션을 선언하는 것을 허용
1. 어노테이션 생성
public @interface TestAnnotation{ // @interface를 사용하여 인터페이스를 정의
}
2. 메타 어노테이션 추가
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 JVM에 의해 계속 참조 가능
@Target(ElementType.TYPE) // 타입 선언시 어노테이션 적용 가능, 여러 개를 인자로 줄 떄 {} 안에 값을 넣어준다.
@Document // javadoc에 의해 문서화
public @interface TestAnnotatoin{
}
3. 적용하기
@RestController
@TestAnnotation
public class CalculatorController {
// @TestAnnotation TestAnnotation의 @Target의 ElementType이 TYPE이라서 메서드 레벨에서 어노테이션 사용 불가
@GetMapping("/add") // GET/add
public int addTwoNumbers(CalculatorAddRequest request) {
return request.getNumber1() + request.getNumber2();
}
}
참조
https://woo-chang.tistory.com/73
[Spring] 스프링을 어노테이션 기반으로 만든 이유
스프링은 어노테이션을 기반으로 구성되어 있습니다. 어노테이션이란 무엇이고 스프링에서는 왜 어노테이션을 기반으로 구성하게 되었는지 정리해 보고자 글을 작성하게 되었습니다. 어노테
woo-chang.tistory.com
https://mangkyu.tistory.com/130
[Java] Custom Annotation(커스텀 어노테이션) 만들기
코드를 작성하다보니 동일한 어노테이션을 여러 클래스에 반복적으로 작성해야 하는 상황이 발생하였다. 이러한 작업이 상당히 번거롭게 느껴졌고, 이러한 반복 작업을 줄이고자 커스텀 어노
mangkyu.tistory.com
틀린 내용이나 부족한 부분 댓글로 알려주시면 추가로 공부해서 수정하겠습니다 감사합니다.