[inflearn] 스프링 핵심 원리 - 기본편/섹션 7 - 의존관계 자동 주입
7-5-1. 어노테이션을 만들어 지정
슬픈 야옹이
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 위에 붙어있던 것들을 그대로 가져다 놓았다.
+)
자바 문법에서, 어노테이션에는 상속이라는 개념이 없다.
여러 어노테이션을 모아서 사용하는 것은 스프링이 제공하는 기능이다.
이렇게 생성해놓은 @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라는 이름의 클래스를 선언해 사용하므로 타입 체크가 가능하다.