TIL 어노테이션

UihyunLee·2025년 4월 14일

스프링 개인 프로젝트를 하며 수많은 어노테이션에 대해서 조금씩 알아가고 있습니다. 그런데 어노테이션 그 자체에 대한 고민을 안해본 것 같아 이에 대해 기록하며 머리에 제대로 집어넣고 부트캠프에서 강의들은 자바의 클래스, 객체 등 오늘 배웠던 내용을 기록해보려 합니다.

Annotation

Annotation 이란 무엇일까? 사전적의미
는 주석이다. 물론 사람이 읽는 주석은 아니다.어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. @ 기호를 앞에 붙여서 사용하며 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다. 한마디로 컴파일러를 위한 주석 표시인 것이다.

어노테이션의 종류는 정말 다양한데 몇가지 정리를 해보려 한다.

@SpringBootApplication
기본적으로 Spring 이니셜라이저를 사용해 만든다면 메인클래스에 설정되어있는 어노테이션이다.
가장 기본적인 어노테이션이다. @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
       @Filter(type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}), 
       @Filter(type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})
    }
)
public @interface SpringBootApplication {
    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class<?>[] exclude() default {};

    @AliasFor(annotation = EnableAutoConfiguration.class)
    String[] excludeName() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(annotation = Configuration.class)
    boolean proxyBeanMethods() default true;
}

코드를 까보며 한번 알아보자.

@Target
@Target은 컴파일러가 어노테이션이 어디에서 사용할지를 결정하기 위해 사용한다.

ElememtType.PACKAGE         : 패키지 선언
ElememtType.TYPE            : 타입 선언
ElememtType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElememtType.CONSTRUCTOR     : 생성자 선언
ElememtType.FIELD           : 멤버 변수 선언
ElememtType.LOCAL_VARIABLE  : 지역 변수 선언
ElememtType.METHOD          : 메서드 선언
ElememtType.PARAMETER       : 전달인자 선언
ElememtType.TYPE_PARAMETER  : 전달인자 타입 선언
ElememtType.TYPE_USE        : 타입 선언

ElememtType만을 매개변수로 설정 가능하다.

@Retention
Retention은 어노테이션의 라이프 사이클을 결정한다. retention 어노테이션이 설정되어 있지 않다면 기본적으로(RetentionPolicy.CLASS)으로 설정이 된다. Retention 어노테이션은 직접 사용된 경우에만 적용된다.

@Documented
@Documented는 javadoc으로 작성한 문서에 포함되도록 하는 어노테이션 설정입니다.

@Inherited
@Inherited을 사용한 클래스를 상속받게되면 자식 클래스에도 어노테이션이 적용된다.

@SpringBootConfiguration
@SpringBootConfiguration은 기본적으로 스프링의 @Configuration을 상속받아 사용한다. 이 애노테이션이 붙은 클래스는 스프링의 애플리케이션 컨텍스트에 빈 정의를 등록하는 역할을 합니다.

@EnableAutoConfiguration
@EnableAutoConfiguration을 사용하면 애플리케이션에서 @ConfigurationProperties 애노테이션이 적용된 클래스를 지원한다.

@ComponentScan
@ComponentScan을 사용하면 @Component를 명시한 클래스들을 Scan하여 Bean을 생성한다. 위 코드와 같이 지정한 범위를 설정할 수 있다.

간단히 정리하자면 @SpringBootApplication은 설정 클래스 등록, 자동 bean 구성 활성화하여 컴포넌트 자동 스캔을 한꺼번에 해주는 Spring Boot 앱의 진입점 어노테이션이라고 정리할 수 있을 것 같다.

profile
공부 기록

1개의 댓글

comment-user-thumbnail
2025년 4월 15일

체크~

답글 달기