🤍 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와 스프링 컨테이너에 대해 공부하며 프로젝트를 진행하는 것이 좋겠다.
'Programming > TroubleShooting' 카테고리의 다른 글
회원가입 API 중복 요청 방지: Redis를 활용한 해결법 (0) | 2024.12.09 |
---|---|
[AWS] EC2 퍼블릭 IPv4 DNS에 연결 거부됨, 연결 안됨, 비공개 등 문제발생 (1) | 2024.07.14 |
[AWS] PUTTY ./gradlew: Permission denied (0) | 2024.07.13 |
타임리프 th: fragment 사용시 css 깨지는 문제 (0) | 2024.03.13 |
Post 저장시 Member 엔티티 관련 오류 (0) | 2024.03.12 |