반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- sqld
- assertThrows
- assertThat
- 생성자 주입
- 스프링 컨테이너
- JPA
- db
- DI
- thymeleaf
- mybatis
- springboot
- Effective Java
- 스프링 프레임워크
- @Configuration
- DIP
- 스프링부트
- resultMap
- 스프링
- java
- spring
- 스프링 빈
- 스프링 부트
- jdbc
- 싱글톤
- Javascript
- SQL
- kafka
- 스프링 부트 기본
- 필드 주입
- 스프링 부트 입문
Archives
- Today
- Total
선 조치 후 분석
[Spring] Spring Framework - 핵심 원리 (38) -어노테이션(@) 만드는 방법 + 스프링이 어노테이션을 읽어오는 원리 본문
Framework/Spring Framework
[Spring] Spring Framework - 핵심 원리 (38) -어노테이션(@) 만드는 방법 + 스프링이 어노테이션을 읽어오는 원리
JB1104 2022. 3. 18. 22:59728x90
반응형
SMALL
어노테이션(@) 만드는 방법 + 스프링이 어노테이션을 읽어오는 원리
어노테이션 직접 만들기
@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일 시 타입 체크가 안된다.
예를 들어, "mainnDiscountPolicy"으로 써도 동작 은하지만, 오류가 발생한다.
그래서 다음과 같은 어노테이션을 만들어서 문제를 해결할 수 있다.
1. 필요한 어노테이션들을 얻어오자.
Qualifier의 어노테이션들을 그대로 따와서 적용해주자.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";
}
2. 인터페이스 생성 (사용하고자 하는 어노테이션과 이름을 동일하게 해 주는 게 좋다.)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy") -> 사용하고자 하는 어노테이션 명 부여
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
3. 생성한 어노테이션 적용
기존 코드를 보면 아래처럼 @Primary 혹은 @Qualifier를 사용하였다.
@Component
@Primary or @Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy
하지만 직접 어노테이션을 부여함으로써 더 정확하게 사용할 수 있게 되었다.
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy
그리고 이걸 사용하는 생성자에도 똑같이 적용을 해주어야 한다.
@MainDiscountPolicy가 타입명 앞에 붙는다.
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
테스트를 돌려서 확인해보면 결과는 성공한다. 그리고 사용되는 Bean도 @MainDisocuntPolicy를 부여한 rateDiscountPolicy인 것을 확인할 수 있다.
물론 @Primary를 잘 사용해서 사용해도 괜찮다. 다양한 상황에서 적용해보자.
정리
어노테이션에는 상속이라는 개념이 없다. 이렇게 여러 어노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다. 자바의 기능이 아니다. @Qualifier 뿐만 아니라, 다른 어노테이션들도 함께 조합해서 사용할 수 있다. 단적으로 @Autowired도 재정의 할 수 있다. 물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다.
728x90
반응형
LIST