본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

어노테이션 직접 만들기 - @Qualifier 재정의

by jint 2026. 4. 29.

@Qualifier("mainDiscountPolicy") 처럼 문자를 적으면 컴파일시 타입 체크가 안된다. (오타가 발생해도 컴파일 오류가 나지 않음)
어노테이션을 만들어 문제를 해결한다.

- src/main/java/hello/core/annotataion/MainDiscountPolicy.java

package hello.core.annotataion;

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)
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}


- src/main/java/hello/core/discount/RateDiscountPolicy.java

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {
    ...
}


- src/main/java/hello/core/order/OrderServiceImpl.java

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


어노테이션은 상속 개념이 없다. 여러 어노테이션을 모아서 사용하는 기능은 스프링이 지원해주기 때문에, @Qualifier 뿐만 아니라 다른 어노테이션들도 함께 조합해서 사용할 수 있다.

@Autowired 어노테이션도 재정의 할 수 있지만, 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하면 유지보수에 혼란을 가중한다.

* 참고
메타 어노테이션 (Meta-Annotation) : 어노테이션에 붙이는 어노테이션

- 메타 어노테이션 / 역할
- @Target / 어노테이션을 어디에 붙일 수 있는지 제한한다.
ElementType : 적용 위치)
TYPE : 클래스, 인터페이스, enum
FIELD : 필드(멤버 변수)
METHOD : 메서드
PARAMETER : 메서드 매개변수
CONSTRUCTOR : 생성자
LOCAL_VARIABLE : 지역 변수
ANNOTATION_TYPE : 어노테이션
PACKAGE : 패키지
TYPE_USE : 타입 사용 위치 (Java 8+)
- @Retention / 어노테이션 정보를 언제까지 유지할지 결정한다.
RetentionPolicy / 유지 범위 / 주요 사용처)
SOURCE / 소스코드까지만 (.java) / @Override, @SuppressWarnings
CLASS / .class 파일까지 (기본값) / 바이트코드 분석 도구
RUNTIME / 런타임까지 (JVM 실행 중) / Spring @Component, @Autowired
- @Documented / 어노테이션을 Javadoc 문서에 포함시킨다.
- @Inherited / 부모 클래스의 어노테이션을 자식 클래스가 상속받을 수 있게 한다.
- @Repeatable / 동일한 어노테이션을 같은 위치에 여러 번 붙일 수 있게 한다.


참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?cid=325969

 

스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의

현재 평점 5.0점 수강생 49,572명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프

www.inflearn.com

댓글