어노테이션

taetae_k·2025년 2월 18일

어노테이션을 사용하는 이유는 무엇일까?

어노테이션이란?
어노테이션(Annotation)은 자바 언어에서 코드에 대한 메타데이터를 제공하는 표기법

  • 어노테이션은 코드의 메타데이터를 제공하고, 다양한 프레임워크와 도구에서 코드의 행동을 제어하거나 확장하는 데 널리 사용된다.

메타 데이터란

  • 애플리케이션이 처리해야할 데이터가 아니라 컴파일 및 런타임 과정에서 코드를 어떻게 처리해야 할지 알려주기 위한 추가 정보이다.

1. 코드 가독성 및 유지보수성 향상

  • 의미 명확화 : 코드의 의도를 명확하게 표현할 수 있다.
  • 코드 분리 : 반복적인 코드나 부가적인 로직을 어노테이션으로 분리함으로써, 비즈니스 로직과 보일러플레이트 코드를 분리 -> 코드의 가독성과 유지보수성을 향상시킴

2. 자동화 및 코드 생성

  • 코드 자동생성 : 어노테이션 처리기를 통해 반복적인 코드 생성작업을 자동화할 수 있다. 예) @Entity를 사용하여 데이터베이스의 테이블과 매핑되는 엔티티 클래스를 자동 생성할 수 있다.
  • 컴파일 타임 체크 : 컴파일 시점에 어노테이션을 분석하여 코드를 검증하거나 특정 작업을 수행할 수 있다. 예) @Override 어노테이션을 통해 메서드가 정확히 오버라이드되는지 검증할 수 있다.

3. 런타임 로직 제어

  • 의존성 주입: @Autowired, @Inject 같은 어노테이션을 사용하여 의존성 주입 프레임워크가 객체 간의 의존성을 자동으로 설정할 수 있다.
  • 애스펙트 지향 프로그래밍: @Transactional, @LogExecutionTime 같은 어노테이션을 사용하여 특정 로직을 공통으로 적용할 수 있다. 이는 코드의 횡단 관심사를 효과적으로 관리할 수 있게 한다.

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

어노테이션을 정의할 때는 @interface 키워드를 사용한다. 여기서는 어노테이션의 타겟, 보존 정책등을 설정할 수 있다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) // 런타임에 어노테이션을 사용할 수 있도록 설정
@Target(ElementType.FIELD) // 어노테이션을 필드에 적용하도록 설정
public @interface MaskedValue {
    // 어노테이션 요소 정의 가능
}

@Target

이 어노테이션은 선언한 어노테이션이 적용될 수 있는 위치를 결정한다

@Target(ElementType.TYPE)

ElementType Enum에 선언된 값

  • TYPE : class, interface, enum에 적용된다.

  • FIELD : 클래스 필드 변수

  • METHOD : 메서드

  • PARAMETER : 메서드 인자

  • CONSTRUCTOR : 생성자

  • LOCAL_VARIABLE : 로컬 변수

  • ANNOTATION_TYPE : 어노테이션 타입에만 적용된다

  • PACKAGE : 패키지

  • TYPE_PARAMETER : 자바8부터 추가된 값으로 제네릭 타입 변수에 적용된다. (ex. MyClass)

  • TYPE_USE : 자바8부터 추가된 값으로 어떤 타입에도 적용된다 (ex. extends, implements, 객체 생성시등등)

@Retention

@Retention(RetentionPolicy.RUNTIME)

어노테이션이 어느레벨까지 유지되는지를 결정짓는다.

RetentionPolicy Enum에 선언된 값

  • SOURCE : 자바 컴파일에 의해서 어노테이션은 삭제된다
  • CLASS : 어노테이션은 .class 파일에 남아 있지만, runtime에는 제공되지 않는 어노테이션으로 Retention policy의 기본 값이다
  • RUNTIME : runtime에도 어노테이션이 제공되어 자바 reflection으로 선언한 어노테이션에 접근할 수 있다

@Inherited

  • 이 어노테이션을 선언하면 자식클래스가 어노테이션을 상속 받는다

@Documented

  • 이 어노테이션을 선언하면 새로 생성한 어노테이션이 자바 문서 생성시 자바 문서에도 포함시키는 어노테이션이다.

@Repeatable

  • 자바8에 추가된 어노테이션으로 반복 선언을 할 수 있게 해준다.
profile
소소하게 써보는 개발기록

0개의 댓글