<aside> 팩토리 패턴은 객체 생성을 담당하는 팩토리 클래스를 사용하여 객체를 생성하는 디자인 패턴입니다. 주로 서비스가 객체를 직접 생성하는 대신 팩토리 클래스에게 객체 생성을 요청하여 객체를 반환받습니다.
</aside>
이렇게 함으로써 관련된 로직을 분리 시켜 코드의 가독성과 유지 보수 향상 시킬 수 있습니다. OAuth는 스프링을 사용하였습니다.
OAuth2UserInfo oAuth2UserInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(authProvider, oAuth2User.getAttributes());
public class OAuth2UserInfoFactory {
public static OAuth2UserInfo getOAuth2UserInfo(AuthProvider authProvider, Map<String, Object> attributes) {
switch (authProvider) {
case GOOGLE:
return new GoogleOAuth2User(attributes);
case NAVER:
return new NaverOAuth2User(attributes);
case KAKAO:
return new KakaoOAuth2User(attributes);
default:
throw new IllegalArgumentException("Invalid Provider Type.");
}
}
}
OAuth인증 정보를 저장할 Google, Naver, Kakao 객체를 서비스 코드에서 인스턴스를 생성하는 것이 아닌 팩토리 클래스를 통해 사용을 할 수 있도록 하여 단일 책임 원칙을 준수합니다.
또 SNS 발송을 국가 코드에 따라 다른 API에 적용하기 위해서 팩토리 패턴을 사용하였습니다. SNS 발송은 Laravel을 사용하였습니다.
$client = SmsClientFactory::create($countryCode);
$smsService = new SmsService($client, $countryCode);
$smsService->sendMessage($replace_phone, $message);
class SmsClientFactory
{
public static function create($countryCode)
{
if ($countryCode === 'CN') {
return new \\CMText\\TextClient('key');
} else {
return new SnsClient([
'version' => 'latest',
'region' => 'eu-west-1',
'credentials' => [
'key' => 'key',
'secret' => 'secret',
]
]);
}
}
}
중국일 때만 CM.com API를 사용하고 그 이외에는 AWS SNS API를 사용합니다. 아마 일본일 때도 다른 API를 사용할 것으로 예상됩니다. 이때 비즈니스 로직 코드를 수정 할 필요 없이 팩토리 클래스에 일본일 경우에만 추가하면 될 것입니다.