[인프런워밍업스터디_BE_0기] 첫 번째 과제!

[질문]

1. 어노테이션을 사용하는 이유 (효과) 는 무엇일까?

2. 나만의 어노테이션은 어떻게 만들 수 있을까?

 

1. 어노테이션을 사용하는 이유 (효과) 는 무엇일까?


지금까지 수 많은 어노테이션을 사용해왔지만 이런 근본적인 질문을 놓치고 있었던 것 같다. 막연히 어노테이션이 제공해주는 다양한 기능을 이용하기 위해서, 편리하기 때문에 사용한다고 생각하고 있었는데 이 질문을 보면서 내가 놓치고 있던게 정말 많았구나 하는 생각이 들었다... 그럼 어노테이션을 사용하는 이유는 무엇일지 한 번 찾아보도록 하자!

 

기존에는 자바 웹 어플리케이션의 구성과 설정들을 외부 XML 설정 파일에 작성하여 사용하였다. 하지만 프로그램의 규모가 커짐에 따라 이러한 설정 파일을 관리하는데 어려움이 있었고, 이를 해결하기 위해 고안된 것이 바로 어노테이션 문법이다. 이러한 어노테이션은 문서화, 컴파일러 체크, 코드 분석 등을 위한 용도로 사용되는데 어노테이션의 본질적인 목적은 소스코드에 메타데이터를 표현하는 것이다.

강의에서 활용한 @RestController라는 어노테이션을 예시로 들면 @RestController라는 어노테이션을 사용함으로써 해당 클래스가 Controller의 역할을 한다는 것을 명시적으로 알리고 실제로 사용자의 요청이 들어왔을 때 이 요청을 컨트롤러가 받아 처리하게 되는 것이다.

출처 : https://kkminseok.github.io/posts/2023-01-26-Annotation_Ad01/

 

이러한 어노테이션을 사용함으로서 얻을 수 있는 장점은 무엇일까?

1. 코드 가독성 : 어노테이션은 코드와 설정을 같은 위치에서 사용하기 때문에 코드를 보다 쉽게 이해할 수 있다.

2. 설정의 간소화 : 별도의 설정 파일을 작성하지 않아도 되어 설정을 간소화할 수 있다.

3. 중복 코드 제거 : 공통적인 코드 패턴이나 설정을 재사용할 수 있기 때문에 코드의 중복을 줄이고 효율적으로 코드를 작성할 수있다.

4. 프로세서를 통한 검증 및 코드 생성 : 컴파일 시점에서 어노테이션을 처리하고 검증할 수 있고, 코드를 자동으로 생성하거나 수정할 수 있기 때문에 효과적으로 기능을 구현할 수 있다.

5. 커스텀 어노테이션 : 직접 커스텀 어노테이션을 정의할 수 있기 때문에 필요한 기능이나 제약 사항을 정의하여 사용할 수도 있다.

출처 : https://woo-chang.tistory.com/73

그럼 어노테이션은 장점만 있는걸까? 당연히 단점도 존재한다.

1. 런타임 오버헤드 : 런타임 시점에 리플렉션을 사용하여 처리하는 어노테이션의 경우 성능상의 오버헤드가 발생할 수 있다.

2. 컴파일 시점 제한 : 어노테이션도 컴파일 시점에 오류를 확인할 수 있으나 어노테이션 로직이 런타임 에러를 발생시키거나 어노테이션에 잘못된 값이 할당되는 등 컴파일 시점에 오류를 확인할 수 없을 수도 있다.

출처 : https://woo-chang.tistory.com/73

하지만 이러한 단점보다도 장점이 가져오는 효과가 더욱 크기 때문에 지금에 와서는 어노테이션을 자연스럽게 사용하고 있다고 생각된다!

 

2. 나만의 어노테이션은 어떻게 만들 수 있을까?


직접 어노테이션을 만드는 방법은 다음과 같다.

 

  1. @interface를 사용하여 인터페이스를 정의한다.

public @interface CustomAnnotation {
}

 

  1. 어노테이션의 범위와 대상을 지정한다.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.Type)
public @interface CustomAnnotation {
}

이 때 @Retention의 인자로는 RetentionPolicy의 값이 올 수 있다.

- RetentionPolicy.SOURCE 
코드 내에서만 해당 어노테이션이 유효하게 적용되며, 클래스 파일에는 존재하지 않아 컴파일 이후 시점부터는 적용되지 않는다.
- RetentionPolicy.CLASS 
컴파일 된 클래스 파일에 포함되어 유효하게 적용되며, 런타임 이후 시점 즉 실행시에는 적용되지 않는다.
- RetentionPolicy.RUNTIME
 런타임 때까지 해당 어노테이션이 유효하게 적용된다. 해당 인자를 줄 경우에 실행시에 리플렉션을 통해 어노테이션 정보를 읽어올 수 있다.

출처 : https://mihee0703.tistory.com/207

그리고 @Target의 인자로는 ElementType이 올 수 있다. 여러 개의 인자를 줄 때는 {} 안에 값을 넣어준다.

- ANNOTATION_TYPE : 어노테이션에 적용
- CONSTRUCTOR : 생성자에 적용
- FIELD : 필드(멤버변수, enum 상수)에 적용
- LOCAL_VARIABLE : 지역 변수에 적용
- METHOD : 메서드에 적용
- PACKAGE : 패키지에 적용
- PARAMETER : 매개변수에 적용
- TYPE : 클래스, 인터페이스, enum에 적용

출처 : https://mihee0703.tistory.com/207

 

  1. 직접 만든 어노테이션을 적절하게 사용한다.

@CustomAnnotation
public class Test {
}

위의 예시에서 만든 CustomAnnotation은 클래스 수준의 어노테이션이므로 클래스 위에 사용해주었다.

 

출처 : https://www.baeldung.com/java-custom-annotation

그런데 현재도 수 많은 어노테이션들이 다양한 기능을 제공하고 있다. 그럼에도 직접 어노테이션을 만들어 사용하는 경우는 어떤 경우일지 궁금해지기도 하였고, 이를 토대로 내가 실제로 사용해볼만한 어노테이션도 만들어보면 좋을 것 같다!

댓글을 작성해보세요.