해결된 질문
작성
·
46
0
공식문서에서 일반적으로 프로토타입 빈에서 사용하고, 싱글톤 빈의 경우 대상 빈의 직접 세터 또는 생성자 주입이 더 좋다고 되어있습니다.
만약 아래코드처럼 로그인방식이 여러가지고 추가로 늘어날 경우 NaverLoginStrategy, GoogleLoginStrategy등 새로운 클래스만 생성하면 된다고 생각하는데 이때도 ServiceLocatorFactoryBean을 사용하는게 좋지않는걸까요?
provider나 ObjectFactory를 이용하는게 좋은지 아니면 공식문서처럼 setter나 constructor를 주입하는게 좋을지 궁금합니다.
public interface LoginStrategy {
String login(String id, String pw);
}
@RequiredArgsConstructor
@Service("kakao")
public class KakaoLoginStrategy implements LoginStrategy {
private final LoginRepository loginRepository;
@Override
public String login(String id, String pw) {
// 로그인 로직
return "kakao Login";
}
}
public interface LoginFactory {
LoginStrategy getLoginStrategy(String type);
}
@Configuration
public class LoginConfig {
@Bean
public ServiceLocatorFactoryBean loginStrategyFactory() {
ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
factoryBean.setServiceLocatorInterface(LoginFactory.class);
return factoryBean;
}
}
답변 1
0
로그인 전략을 구현한 빈이 매번 새로 만들어질 게 아니라면 미리 정의해두고, 필요한 타입과 주입 정보를 이용해서 가져다 생성자, 세터 등으로 주입 받아 사용하는게 맞습니다.
의존성 주입이 가능한데 의존성 룩업을 사용할 이유는 없습니다. 매번 새로운 빈을 만드는 프로토타입이 아닌 경우라면요. 당연히 그것도 Provider<T> 방식을 이용하면 되는데, 지금 말씀하신 로그인 전략은 그럴 필요가 없어보입니다.
다만, 이 경우 LoginStrategy를 구현한 빈이 여러개라면 주입 받을 때
컬렉션으로 모두 가져와서 필요한 걸 선택해서 사용하거나
사용할 로그인 방식에 따라서 bean name이나 qualifier 등으로 특정 strategy 빈을 가져와 사용하는
방식이 필요할 겁니다.
강의의 어느 부분을 보시다가 이 내용이 알고 싶으셨는지 궁금하군요. 제가 답변을 드릴 수 있는 건 얼마든지 답을 해드리겠습니다만, 가능하면 강의 내용과 관련된 질문을 해주시면 감사하겠습니다.
알려주셔서 감사합니다.
섹션3의 오브젝트와 의존관계에서 관계설정 책임의 분리와 오브젝트 팩토리를 보고 PaymentService가 SimpleExRateProvider와 WebApiExRateProvider를 클라이언트나 오브젝트 팩토리에서 생성할때 유동적으로 생성을 하려면 if나 switch, 컬렉션에 담아서 꺼내쓰는 방법말고 다른방법 없는지 찾아보았습니다.
그래서 위의 ServiceLocatorFactoryBean에 대해 알게되어 알아보다가 궁금증을 해결하고싶어서 질문을 드리게 되었습니다.
강의를 벗어난 질문이지만 답변주셔서 다시한번 감사합니다.