Annotation 직접 만들기

@Qualifier에 대해

 

의존성 주입 애노테이션

@Autowired 스프링 프레임워크에서 제공하는 애노테이션이다. @Autowired는 타입 매칭을 시도 하고 , 여러 빈이 있으면 필드 이름(파라미터 이름)으로 빈 이름을 추가 매칭한다. ac.getBean(클래스.class)

write-read.tistory.com

@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일 시 타입 체크가 안된다.

다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있다.

 

@Target({ElementType.FIELD,
        ElementType.METHOD,
        ElementType.PARAMETER,
        ElementType.TYPE,
        ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
// @MainDiscountPolicy을 사용하면 위에 해당하는 어노테이션이 다 실행된다.
public @interface MainDiscountPolicy {
}

 

인터페이스 - DiscountPolicy

구현체 - RateDiscountPolicy , FixDiscountPolicy

이 중 RateDiscountPolicy를 MainDiscountPolicy라고 지정할려고 한다.

OrderServiceImpl

public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    public OrderServiceImpl(MemberRepository memberRepository, 
                            @MainDiscountPolicy DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

RateDiscountPolicy

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy{
	...
}
  • @MainDiscountPolicy가 실행 되면. @Qualifier가 실행 되므로 @MainDiscountPolicy가 작성된 것 끼리 서로 연결된다.
  • 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.
  • 물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별 하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다.

 

 

+

  • @Target
    • 해당 애노테이션이 어디에 사용 될 수 있는가를 명시한다.
  • @Retention(RetentionPolicy.RUNTIME)
    • 어느 시점까지 애노테이션의 메모리를 가져갈지 설정 
    • 애노테이션을 런타임시에까지 사용할 수 있습니다.
    • JVM이 자바 바이트코드가 담긴 class 파일에서 런타임환경을 구성하고 런타임을 종료할 때까지 메모리는 살아있습니다.

출처

 

스프링 핵심 원리 - 기본편 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온

www.inflearn.com

 

'기록 > Spring' 카테고리의 다른 글

Lombok 사용해보기  (0) 2020.12.30
의존성 주입 애노테이션(@Autowired,@Resource,@Inject)  (0) 2020.12.30