카테고리 없음

[Annotation] Annotation의 이해

hee-ya07 2025. 4. 17. 11:19

0. Annotation

:: 소스코드에 추가적인 정보를 표기하는 메타 데이터로, 주석(라벨)로 생각하면 된다.

 

0.1 분류

분류 어노테이션 설명

1. Built-in Annotations

 

@Override 오버라이드된 메서드임을 명시
@Deprecated 더 이상 사용되지 않음을 표시
@SuppressWarnings 컴파일러 경고 미표기
@FunctionalInterface 함수형 인터페이스임을 명시
@SafeVarargs 제네릭 가변 인자(varargs) 사용 시, 타입 안정성 경고 억제

2. Meta-Annotations

@Target 어노테이션을 어디에 사용할 수 있는지 지정 (예: 클래스, 메서드 등)
@Retention 어노테이션이 언제까지 유지될지 설정 (컴파일 타임 vs 런타임 등)
@Documented Javadoc에 표시 여부
@Inherited 부모 클래스의 어노테이션을 자식 클래스에 상속할지 여부
더보기

추가적인 분류를 하자면,

1. Java 어노테이션 (Built-in Annotations)

어노테이션 설명
@Override 부모 클래스 또는 인터페이스의 메서드를 오버라이딩했음을 명시
@Deprecated 해당 요소(클래스, 메서드 등)는 더 이상 사용되지 않으며, 향후 제거될 수 있음을 표시
@SuppressWarnings 컴파일러의 경고 메시지를 억제할 수 있음
@FunctionalInterface 함수형 인터페이스임을 나타냄 (람다식에 사용 가능)
@SafeVarargs 제네릭 가변 인자(varargs) 사용시 타입 안정성 경고 억제

2. Lombok 어노테이션

:: 보일러플레이트 코드를 대신 해주는 라이브러리의 어노테이션

어노테이션 설명
@Getter, @Setter 모든 필드에 대한 getter/setter 자동 생성
@ToString toString() 자동 생성
@EqualsAndHashCode equals()와 hashCode() 자동 생성
@NoArgsConstructor 파라미터 없는 생성자 생성
@AllArgsConstructor 모든 필드에 대한 생성자 생성
@RequiredArgsConstructor final 필드 또는 @NonNull 필드만을 인자로 받는 생성자 생성
@Data @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 포함
@Builder 빌더 패턴 생성
@Value @Data + final + immutable 객체 생성용

3. Spring AOP 어노테이션 (프록시 기반)

:: 관점 지향 프로그래밍(AOP)를 통해 공통 기능 모듈화

:: 내부적으로는 프록시 기반 작동

어노테이션 설명
@Aspect 해당 클래스가 AOP 관점(Aspect)임을 명시
@Before 타겟 메서드 실행 이전에 수행될 Advice
@After 타겟 메서드 실행 후 수행 (성공/예외 관계없이)
@AfterReturning 타겟 메서드가 정상 종료되면 수행
@AfterThrowing 타겟 메서드에서 예외 발생 시 수행
@Around 타겟 메서드의 전/후 모두 제어 가능 (가장 강력한 Advice)
@Pointcut 공통 포인트컷 분리 선언

4. Spring 어노테이션 (전반적인 분류)

:: 뭔가 많음

4-1. Bean 등록 및 컴포넌트 스캔

어노테이션 설명
@Component Spring Bean으로 등록
@Service 비즈니스 로직 담당 컴포넌트 (실제로는 @Component와 기능 같음)
@Repository DAO 계층에 사용, 예외 변환 기능 포함
@Controller MVC Controller용 컴포넌트
@RestController @Controller + @ResponseBody, JSON 응답에 주로 사용
@Configuration 설정 파일 클래스
@Bean 개발자가 직접 Bean 등록
@ComponentScan Bean 스캔 범위 지정

 4-2 의존성 주입 (DI)

어노테이션 설명
@Autowired 타입 기준 의존성 주입
@Qualifier 이름 기준으로 Bean 주입
@Value properties 값 주입
@Inject @Autowired와 유사
@RequiredArgsConstructor (Lombok) 생성자 기반 의존성 주입에 자주 사용

4-3. Spring Web (MVC)

어노테이션 설명
@RequestMapping URL 매핑, 메서드 단위로 GET/POST 등 설정 가능
@GetMapping, @PostMapping 등 HTTP 메서드 별 단축 어노테이션
@RequestParam URL 쿼리 파라미터 바인딩
@PathVariable URL 경로 변수 바인딩
@RequestBody, @ResponseBody JSON <-> 객체 변환 자동 처리

4-4. Spring Test 관련

어노테이션 설명
@SpringBootTest 통합 테스트용 어노테이션
@WebMvcTest Controller 단위 테스트
@MockBean 테스트 중 특정 Bean을 Mock 처리
@DataJpaTest JPA 관련 테스트에 최적화된 설정

4-5. Spring Boot

어노테이션  설명
@SpringBootApplication @Configuration + @EnableAutoConfiguration + @ComponentScan 포함
@EnableAutoConfiguration 의존성에 따라 자동 설정 수행
@ConfigurationProperties properties/yaml 설정을 POJO에 바인딩

1. Annotation 정의 방법

1.1. @Target

:: WHERE 어디에 부착할 수 있는지 

@Target(ElementType.METHOD) // 해당 어노테이션은 메서드만 적용 가능
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

==> 범위가 옆의 표와 같이 정해짐


 

 

1.2. @Retention

:: WHEN 언제 사용(해당 어노테이션의 생명주기)


1.3. 나머지 설정들

  • @Documented : JAVADOC 에 어노테이션 설정을 표기
  • @Inherited : 어노테이션도 상속을 할 수 있다.
  • @Repeatable : 동일 어노테이션을 여러번 선언할 수 있다.

 


참조

asac 수업자료

 

[SpringDoc] annotation

API docs를 편하게 자동으로 생성해주는 것이 OpenAPI3.0 spec을 이용하여 구현한 SpringDoc이다. API Docs 작성을 도와주는 건 Springfox Swagger와 SpringDoc 두 가지가 있는데, Springfox Swagger는 2020

velog.io