일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 싱글톤
- Security
- VUE
- Stateless
- Setter
- js
- thymeleaf
- BEAN
- cache
- vue-cli
- Vue.js
- Singleton
- Excel
- Spring
- 프로토타입
- javascript
- JPA
- Java
- Kotlin
- HTTP
- DB
- HTTP 메서드
- 의존성 주입
- dependency injection
- vuex
- Repository
- 라이프 사이클
- 캐시
- 로그인
- di
- Today
- Total
jhhan의 블로그
스프링 코어(번외-1) - 애노테이션 직접 만들기 본문
이번 포스트는 그렇게까지 중요한 포스트는 아닙니다.
직접 애노테이션을 만들고 적용해보는 것을 해보려고 합니다.
이전 시간에 조회한 빈이 여러 개인 경우에 대한 해결책에 대해 살펴봤습니다.
그 중에서 @Qualifier에 대해서 알아봤는데요.
@Qualifier의 단점이 있습니다.
예시를 한 번 보겠습니다.
@Component
@Qualifier("mainnDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy
만약 @Qualifier의 이름을 mainnDiscountPolicy라고 잘못 입력하면 어떻게 될까요?
당연히 에러가 납니다.
하지만 컴파일 시에 에러가 나지 않습니다.
그러면 앱이 구동된 후에 문제가 생겼다는 것을 알게 될 것입니다.
그럼 컴파일 단계에서 에러가 날 수 있게 해보겠습니다.
hello.core 밑에 annotation 패키지를 만들고 MainDiscountPolicy라는 애노테이션 클래스를 만듭니다.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
그리고 MainDiscountPolicy를 다음과 같이 작성합니다.
참고로 @Qualifier를 제외한 다른 애노테이션들은 @Qualifier 애노테이션이 가지는 다른 애노테이션들을 그대로 가져왔습니다.
@Qualifier 애노테이션에 Ctrl + 마우스 클릭을 하시면 보실 수 있습니다.
이렇게 하면 하나의 애노테이을 직접 만들어 봤습니다.
그럼 이제 만든 애노테이션을 적용해봅니다.
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy
RateDiscountPolicy 파일에 만든 애노테이션을 추가합니다.
그리고 OrderServiceImpl 파일에도 다음과 같이 애노테이션을 추가합니다.
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
System.out.println("Constructor: memberRepository = " + memberRepository);
System.out.println("Constructor: discountPolicy = " + discountPolicy);
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
그리고 테스트 파일을 Run 해본다면...
멀쩡히 잘 돌아가는 것을 볼 수 있습니다.
이렇게 애노테이션을 직접 만들어서 적용해보는 것을 해봤습니다.
참고.
애노테이션 간의 상속관계는 없습니다. (예전에도 한 번 올린 것 같습니다.)
그럼에도 애노테이션을 저런식으로 사용할 수 있는 것은 스프링에서 지원해주기 때문입니다.
실제 순수 자바 코드로만 되어있는 곳에서는 애노테이션을 저렇게 붙이면 작동하지 않습니다.
애노테이션은 스프링에서 잘 정의해놨기 때문에
가능한 스프링에서 제공해주는 애노테이션을 사용하고
정말 필요할 때만 사용자 정의 애노테이션을 만들어서 이용하면 될 것 같습니다.
그럼 이렇게 해서 애노테이션 정의 및 사용에 대한 포스트를 마치겠습니다.
출처: 인프런 - 스프링 핵심원리(기본편) by 김영한
'Spring' 카테고리의 다른 글
스프링 코어(번외-2) - 스프링 빈의 자동 & 수동 등록 (0) | 2021.08.15 |
---|---|
스프링 코어(13) - 조회 빈이 모두 필요한 경우 (0) | 2021.08.15 |
스프링 코어(12) - 조회 빈이 여러 개인 경우 (0) | 2021.07.28 |
스프링 코어(11) - 옵션 처리 (0) | 2021.07.25 |
스프링 코어(10) - 의존관계 주입 (0) | 2021.07.14 |