작성
·
188
0
https://www.inflearn.com/questions/658825
여기서 질문 해주신 부분 추가적으로 질문이 있습니다.
해당 파일에서
@Service
public class SocialLoginApiServiceFactory {
private static Map<String, SocialLoginApiService> socialLoginApiServices;
public SocialLoginApiServiceFactory(Map<String, SocialLoginApiService> socialLoginApiServices) {
this.socialLoginApiServices = socialLoginApiServices;
}
public static SocialLoginApiService getSocialLoginApiService(MemberType memberType) {
String socialLoginApiServiceBeanName = "";
if(MemberType.KAKAO.equals(memberType)) {
socialLoginApiServiceBeanName = "kakaoLoginApiServiceImpl";
}
return socialLoginApiServices.get(socialLoginApiServiceBeanName);
}
}
socialLoginApiServices 객체 자동으로 주입 시켜준다고 했는데요
즉 SocialLoginApiService 구현체들을 Map 으로 자동으로 주입 시켜준다고 배웠습니다.
그런데 Map Key 값을 보면 String 이라서
어떻게 보면 Key 값을 철자라도 틀리면 반환값을 얻을수 없는 문제점이 있을꺼같아서요
그래서
public enum MemberType {
KAKAO;
public static MemberType from(String type) {
return MemberType.valueOf(type.toUpperCase());
}
public static boolean isMemberType(String type) {
List<MemberType> memberTypes = Arrays.stream(MemberType.values())
.filter(memberType -> memberType.name().equals(type))
.collect(Collectors.toList());
return memberTypes.size() != 0;
}
}
private static Map<MemberType, SocialLoginApiService> socialLoginApiServices;
Key 값을 MemberType 으로 규정하고 하는것이 편리하게 쓸수 있을꺼같은데요
이렇게 사용할려면 자동으로 빈 등록은 안되고 어쩔수 없이 @Bean 이용해서 직접 커스텀 빈 등록 해야 하나요??
답변 1
0
안녕하세요 리나님. 먼저 key값의 경우 스프링이 빈의 이름으로 key값을 지정해주기 때문에 카카오 로그인 같은경우는 kakaoLoginApiServiceImpl 빈을 가지고 오도록 지정해주었습니다. 만약 enum을 사용하고 싶으시다면 enum을 하나 정의하고 소셜 로그인 api 구현체의 빈이름을 관리를하고 해당 enum을 이용해서 빈의 이름을 지정해줄 수 있을것으로 보입니다. 그러면 SocialLoginApiServiceFactory에서 해당 enum을 통해서 key값을 선택할 수 있구요