Programming/TroubleShooting

[Spring] 스프링의 Collection Injection

LazyCat 2024. 12. 6. 15:47
반응형

 

 

🤍 Collection Injection

스프링은 자동으로 타입에 맞는 Bean을 찾아서 주입해주는 기능이 있다.

 

Map<String, AbstractTemplate>와 같이 Map으로 선언하면 AbstractTemplate의 구현체들을 모두 찾아서 key값으로 구현체의 빈 이름을, value 값으로 구현 객체를 담아 주입해준다.

 

List<AbstractTemplate>도 마찬가지다. AbstractTemplate의 구현체들을 List에 담아 주입해준다. 이것을 Collection Injection 이라고 한다.

 

 

🤍 트러블 슈팅

  • 문제상황

 

AbstractOAuthTemplate의 구현체들을스프링 빈으로 등록 후 Map에 추가하여

"naver"와 "kakao"라는 문자열을 받으면 구현객체를 반환하고자 함

 

그러나 Service코드에서 "naver"를 받으면 null 값을 반환함.

 

 

  • 원인

 

스프링은 빈으로 등록한 메소드의 이름 '빈 이름'으로 사용함.

기존 코드에서 나는 naverOAuthStrategy와 kakaoOAuthStrategy를 빈 이름으로 저장했기 때문에

naver와 kakao로 구현체 객체를 구할 수 없는 것이었음.

 

Config 내부에서 AbstractOAuthTemplate 구현체를 받는 Map타입의 메소드를 정의한다고 해도 

우선적으로 빈으로 등록한 naverOAuthStrategy와 kakaoOAuthStrategy의 이름이

Collection Injection을 통해 key값으로 저장되어 Map으로 사용할 수 밖에 없던것이였음.

 

따라서 위의 사진처럼 map 타입의 메소드를 삭제하고, 빈으로 등록할 떄 플랫폼 이름을 명시해주는 것으로 코드를 수정하며 오류를 해결했음.

 

 

 

🤍 결론

Spring 기본을 잊고 프로젝트 기능추가에만 몰입했던 것 같다. 다시 초심으로 돌아가 Spring의 IoC, DI, AOP와 스프링 컨테이너에 대해 공부하며 프로젝트를 진행하는 것이 좋겠다.

 

 

 

 

반응형