슬픈 야옹이 2024. 5. 26. 21:28

 

@Qualifier를 이용한 구분자 추가 방법은 오타 등 타입 체크가 되지 않는다는 문제가 있었다.

 

@Qualifier를 포함한 어노테이션을 직접 만들어 사용하면 이러한 문제를 해결할 수 있다.

 

 

주로 사용할 빈에 붙여줄 @MainDiscountPolicy를 만든다.

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {

}

 

@Target, @Retention, @Inherited, @Documented 등은 여기서 자세히 다루지는 않는다.

 

기존 @Qualifier 위에 붙어있던 것들을 그대로 가져다 놓았다.

Qualifier.java

 

+)

자바 문법에서, 어노테이션에는 상속이라는 개념이 없다.

여러 어노테이션을 모아서 사용하는 것은 스프링이 제공하는 기능이다.

 

 

이렇게 생성해놓은 @MainDiscountPolicy를 클래스에 붙인다.

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {

    ...

}

 

 

@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;

    private final DiscountPolicy discountPolicy;

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

}

 

이렇게 설정하면 @Qualifier로 구분자를 지정해 사용하면서, MainDiscountPolicy라는 이름의 클래스를 선언해 사용하므로 타입 체크가 가능하다.