<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를 사용할 것으로 예상됩니다. 이때 비즈니스 로직 코드를 수정 할 필요 없이 팩토리 클래스에 일본일 경우에만 추가하면 될 것입니다.