Notice
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
01-09 18:44
Today
Total
관리 메뉴

그날그날 공부기록

Qualifier을 대체할 수 있는 커스텀 애노테이션 만들기 본문

Spring 공부

Qualifier을 대체할 수 있는 커스텀 애노테이션 만들기

given_dragon 2022. 8. 9. 15:23

@Qualifier(”빈 이름")을 통해 필드와 빈을 매칭 할 수 있다.

하지만 컴파일시 타입이 체크되지 않는다.

이 경우 직접 @Qualifier(”빈 이름")을 포함하는 애노테이션을 직접 만들어 사용하면 해결할 수 있다.

 

자바 인터페이스 파일을 생성하여 @를 붙여주거나

클래스 파일을 하나 생성하여 public classpublic @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

 

Comments