이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)
GitHub Repository : https://github.com/jcw1031/spring-core-study
의도적으로 해당 타입의 스프링 빈이 모두 필요한 경우가 있을 수 있다. 예를 들어 클라이언트가 할인의 종류를 변경할 수 있다고 하면, FixDiscountPolicy
와 RateDiscountPolicy
가 모두 필요한 것이다. 스프링을 사용하면 전략 패턴을 간단하게 구현이 가능하다.
스프링에서 특정 타입의 모든 스프링 빈을 주입받으려면 Map<>
이나 List<>
를 사용해 주입받을 수 있다. 코드로 알아보자.
테스트를 만들어서 확인해 보자.
DiscountPolicy
의 모든 구체 클래스를 필요로 하는 DiscountService
를 임의로 만든다. 이때 필드에 Map<>
또는 List<>
를 사용한다. Map<>
의 경우에는 key가 String
으로 스프링 빈의 이름이고, value는 DiscountPolicy
로 스프링 빈이 할당된다. 잘 주입되었는지 확인하는 용도로 생성자 내부에 출력 코드를 추가한다.
그리고 테스트 메서드에 스프링 컨테이너를 생성하는데, DiscountService
와 함께 AutoAppConfig
도 매개변수로 넘겨주어야 한다. 그래야 FixDiscountPolicy
와 RateDiscountPolicy
가 스프링 빈으로 등록되어 주입받을 수 있기 때문이다.
테스트를 실행해 보면, 로그가 찍히고 Map<>
과 List<>
에 모두 잘 주입된 것을 확인 가능하다.
Map<>
을 사용하면 좋은 점은 아래와 같이 DiscountService
에 할인 정책을 선택하여 할인율을 반환하는 로직의 메서드를 만들 수 있다. discountCode
가 할인 정책을 선택하는 key이다.
fixDiscountPolicy
를 넘겨주면 FixDiscountPolicy
가 선택되어야 한다. 이 경우에는 할인율이 1000원이어야 한다. rateDiscountPolicy
를 넘겨주면 RateDiscountPolicy
가 선택되고, 이 경우의 할인율은 10%인 2000원이어야 한다. 테스트가 성공한다.
Map<String, Object>
: 키에 스프링 빈의 이름이 들어가고, 그 값으로 개발자가 선택한 타입으로 조회한 모든 스프링 빈이 저장된다.
List<Object>
: 개발자가 선택한 타입으로 조회한 모든 스프링 빈이 저장된다.
만약 해당 타입의 스프링 빈이 존재하지 않으면 빈 컬렉션 또는 Map을 주입한다.