📒 애노테이션은 상속이 없고 조합만 제공한다.
앞선 글에서 @Qualifier("mainDiscountPolicy")를 사용해서 중복 빈 등록 문제를 해결하는 걸 배웠다.
그러나 이 문제에는 문제점이 하나 있다.
⚠️ 오탈자를 잡아줄 수 없다.
타입으로 지정할 수 없기 때문에 잘못쓰더라도 컴파일 오류를 내지 않는다.
➡️ 변수 int name을 등록하고 내가 naam 이렇게 하면 컴파일 오류가 나는데 위의 경우는 그러지 못함
따라서 @Qualifier("mainDiscountPolicy")보다는 타입을 지정할 수 있는 애노테이션을 직접만드는 것이 더 안전하다.
👤 나는 @Qualifier
의 기능을 하는 애노테이션을 만들고자 한다.
@Qualifier
애노테이션 코드👉 @Qualifier
기능을 가능하게 해주는 애노테이션 확인
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";
}
➕ @Qualifier
기능을 가능하게 해주는 애노테이션 ➕ @Qualifier
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolich")
public @interface MainDiscountPolich {
}
👉 지정 명의 애노테이션이 생김
➡️ 하나의 타입으로 지정할 수 있어 컴파일 단계에서 오탈자 오류를 막을 수 있다.
@MainDiscountPolich
👉 @Qualifier("mainDiscountPolicy")
역할을 하게하는 애노테이션
🤔 @Qualifier
에 다른 애노테이션들이 포함되니까 @Qualifier
만 있으면 되는거 아닌가? 🙅 애노테이션은 상속의 개념이 없고, 조합으로 기능을 지원한다.
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository,
@MainDiscountPolich DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
애노테이션은 조합이 가능하다~
애노테이션을 직접 만드는게 적절할 때는 언제일까?