본문 바로가기

Spring

Spring - bean factory pattern (injecting Collections)

반응형

Spring 프레임워크의 서비스를 개발할때,

interface 를 통해 공통적인 기능을 명시하고 이를 참조하는클래스를 여러개 생성하여 개발을 하게 되는 경우가 있는데,

 

클래스에 enum 으로 별칭을 정해주고 factory class 를 구현하여 필요한 beanget 할 수 있도록 개발하곤합니다.

문제는 원하는 클래스를 enum 값으로 얻기위해 bean 숫자만큼 항상 길어지고 보기싫은 코드가 생성되어야합니다.

어딘가 불--편

이에 대한 개선을 한 후 내용을 정리합니다.

 

간단한 예제 Rest API 를 구현 후 설명하려고합니다.

※ 지극히 개인적인 코드 스타일을 공유하는 목적의 포스팅입니다 ※

 

공통적으로 동물의 타입을 리턴하며 소리를 지를 수 있는 기능을 명세한 interface 를 생성합니다.

쏘리질러~

 

해당 interface 를 참조하여 기능을 구현합니다.

scream method 는 소리 문자열을 리턴하는 기능이고, getAnimalType method 는 자신의 enum type 을 리턴합니다.

😸
🐶
🐮

 

위와 같은 다양한 동물의 bean class 를 생성한 후 controller 를 생성했습니다.

간단하게 GET 방식으로 동물 type 을 문자열 형식의 파라미터로 요청하면 울음소리를 응답하려고합니다.

먼저 요청받은 type 을 enum type 으로 변경해줍니다.

AnimalType enum

 

다음 service (animalService.makeSomeNoise) 로직으로 enum 값을 전달합니다.

 

 

Animal service 에는 Sound interface 를 상속한 bean 을 타입에 따라 가져와야하기 때문에 AnimalFactory 를 구현해봅니다.

오늘 글의 핵심입니다!

Service 로직, 소리를 가져오는 factory 중 먼저 v1 을 사용해보자

먼저 개선하고 싶었던 코드(V1) 입니다.

어딘가 불--편

같은 interface 를 참조하는 class 를 final + lombok 을 통해 생성자 기반 DI 방식으로 주입을 해주며 switch ~ case 문으로 타입에 따라 해당하는 bean 을 리턴해주었습니다.

 

그렇지만...환경부에 따르면 동물의 개체수는 총 18,052 개 입니다... 🤔 

 

개선해봅시다.

이럴경우 아래와 같은 Collection 타입을 생성자 형식으로 주입받아 관리하면 매우 편리하고 코드도 간결해집니다.

Sound interface 를 참조하는 bean List 로 의존성주입 후 map collectiontypekey 로, bean 객체를 value 로 put 합니다.

그 후 type 으로 hashmap 을 get하여 bean 객체를 얻습니다.

V2

그 이후 로직은 위 코드를 봐주시면됩니다!

이렇게 구현한 API 를 테스트를 해보면 아주 잘 작동합니다.

 

Collection 으로 의존성을 주입할때 @Order annotation 을 통해서 주입 순서를 정해 줄 수도 있습니다.

 

이상입니다😀

반응형