Qualifier을 대체할 수 있는 커스텀 애노테이션 만들기
@Qualifier(”빈 이름")
을 통해 필드와 빈을 매칭 할 수 있다.
하지만 컴파일시 타입이 체크되지 않는다.
이 경우 직접 @Qualifier(”빈 이름")
을 포함하는 애노테이션을 직접 만들어 사용하면 해결할 수 있다.
자바 인터페이스 파일을 생성하여 @를 붙여주거나
클래스 파일을 하나 생성하여 public class
→ public @interface
로 바꿔준다.
@Qualifier
를 대체할 애노테이션을 만들어야 하므로 ⌘ + O 단축키로 @Qualifier
를 검색하여 원래 있던 애노테이션을 복사하여 추가한다.
그 후 기존에 @Qualifier(”빈 이름")
으로 매칭해주었던 애노테이션을 추가해준다.
최종 코드는 다음과 같다.
//@Qualifier에 있던 애노테이션 시작
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
//@Qualifier에 있던 애노테이션 끝
@Qualifier("rate")
public @interface MainDiscountPolicy {}
이렇게 @MainDiscountPolicy
라는 애노테이션을 만들었다.
이제 기존에 사용하였던 @Qualifier
를 대신해 사용하면 된다.
//할인 정책을 결정하는 빈
@Component
@MainDiscountPolicy //기존 @Qualifier("rate")
public class RateDiscountPolicy implements DiscountPolicy{
//할인 정책을 주입받아 사용하는 서비스
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
//기존 @Qualifier("rate")
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy){
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
이렇게 사용한다면 만약 매칭 하는 부분의 철자가 틀렸을 경우 컴파일 시점에 에러가 발생하기 때문에 오류를 찾기 수월해진다.
얼핏 보면 애노테이션을 상속받아 사용하는 것 같지만 애노테이션에는 상속이라는 개념이 없다고 한다.
단지 스프링이 여러 애노테이션을 묶어서 사용하는 기능을 제공해주는 것이다.
적절하게 사용하면 코드의 가독성도 올라가고 해당 애노테이션을 통해 검색을 하는 등 여러 장점이 있을 것 같지만
막 사용한다면 직접 정의한 파일이 많아지고 서로 공유하며 작업하는데 혼란을 가져올것 같다.
출처
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com