[Spring] 07-4. 조회한 빈이 모두 필요한 경우

지찬우·2023년 1월 15일
0

Spring

목록 보기
24/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)

GitHub Repository : https://github.com/jcw1031/spring-core-study


특정 타입의 모든 빈을 주입받는 방법

의도적으로 해당 타입의 스프링 빈이 모두 필요한 경우가 있을 수 있다. 예를 들어 클라이언트가 할인의 종류를 변경할 수 있다고 하면, FixDiscountPolicyRateDiscountPolicy가 모두 필요한 것이다. 스프링을 사용하면 전략 패턴을 간단하게 구현이 가능하다.

코드 ⌨️

스프링에서 특정 타입의 모든 스프링 빈을 주입받으려면 Map<>이나 List<>를 사용해 주입받을 수 있다. 코드로 알아보자.

테스트를 만들어서 확인해 보자.


DiscountPolicy의 모든 구체 클래스를 필요로 하는 DiscountService를 임의로 만든다. 이때 필드에 Map<> 또는 List<>를 사용한다. Map<>의 경우에는 key가 String으로 스프링 빈의 이름이고, value는 DiscountPolicy로 스프링 빈이 할당된다. 잘 주입되었는지 확인하는 용도로 생성자 내부에 출력 코드를 추가한다.


그리고 테스트 메서드에 스프링 컨테이너를 생성하는데, DiscountService와 함께 AutoAppConfig도 매개변수로 넘겨주어야 한다. 그래야 FixDiscountPolicyRateDiscountPolicy가 스프링 빈으로 등록되어 주입받을 수 있기 때문이다.


테스트를 실행해 보면, 로그가 찍히고 Map<>List<>에 모두 잘 주입된 것을 확인 가능하다.


Map<>을 사용하면 좋은 점은 아래와 같이 DiscountService에 할인 정책을 선택하여 할인율을 반환하는 로직의 메서드를 만들 수 있다. discountCode가 할인 정책을 선택하는 key이다.


fixDiscountPolicy를 넘겨주면 FixDiscountPolicy가 선택되어야 한다. 이 경우에는 할인율이 1000원이어야 한다. rateDiscountPolicy를 넘겨주면 RateDiscountPolicy가 선택되고, 이 경우의 할인율은 10%인 2000원이어야 한다. 테스트가 성공한다.


정리 📝

Map<String, Object> : 키에 스프링 빈의 이름이 들어가고, 그 값으로 개발자가 선택한 타입으로 조회한 모든 스프링 빈이 저장된다.

List<Object> : 개발자가 선택한 타입으로 조회한 모든 스프링 빈이 저장된다.

만약 해당 타입의 스프링 빈이 존재하지 않으면 빈 컬렉션 또는 Map을 주입한다.

profile
좋은 개발자가 되자.

0개의 댓글