INFLEARN

[스프링 핵심 원리 - 기본편] 14. 애노태이션 직접 생성하기

ch010104 2026. 3. 21. 00:00

애노테이션 직접 만들기

  • @Qualifier("mainDiscountPolicy")처럼 문자를 직접 적으면 컴파일 시 타입 체크가 안 된다는 단점이 있음(오타가 나도 실행 전까지 모름).
  • 이를 해결하기 위해 애노테이션을 직접 만들어 사용하면 컴파일 타임에 오류를 잡을 수 있고 코드도 훨씬 깔끔해짐

1. 커스텀 애노테이션 생성

@Qualifier를 포함한 새로운 애노테이션을 정의

package hello.core.annotation;

import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, 
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy") // Qualifier 기능을 포함시킴
public @interface MainDiscountPolicy {
}

2. 빈 등록 및 주입에 적용

빈 등록 시

@Component
@MainDiscountPolicy // 직접 만든 애노테이션 적용
public class RateDiscountPolicy implements DiscountPolicy {}

주입 시 (생성자/수정자)

// 생성자 자동 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
                        @MainDiscountPolicy DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

// 수정자 자동 주입
@Autowired
public void setDiscountPolicy(@MainDiscountPolicy DiscountPolicy discountPolicy) {
    this.discountPolicy = discountPolicy;
}

3. 주요 특징 및 주의사항

  • 스프링의 지원: 원래 애노테이션에는 상속이라는 개념이 없습니다. 여러 애노테이션을 모아서 사용하는 이 기능은 스프링이 지원하는 기능입니다.
  • 조합 가능: @Qualifier뿐만 아니라 @Autowired 등 다른 애노테이션들도 조합해서 재정의할 수 있습니다.
  • 주의점: 무분별한 재정의는 유지보수에 혼란을 줄 수 있으므로, **뚜렷한 목적(예: 타입 안정성 확보)**이 있을 때만 사용하는 것이 좋습니다.

💡 Lombok 사용 시 팁

Lombok의 @RequiredArgsConstructor를 사용할 때는 lombok.config에 해당 애노테이션을 추가해야 생성자 파라미터로 정상 복사

# lombok.config
lombok.copyableAnnotations += hello.core.annotation.MainDiscountPolicy