ZOOC 소셜로그인 어뎁터 패턴으로 바꾸기

==========================================

1. 어뎁터 패턴

서로 다른 인터페이스를 가진 객체를 함께 사용할 수 있도록 해주는 디자인 패턴

조금 더 풀어서 말을 해보자면

현재 A기능을 사용중일 때 이와 유사한 B, C의 기능이 계속 생겨나면서 B,C 인터페이스도 A와 동일하게 만드는 것을 목적으로 하는 것이다!

마치 C타입 맥북 단자에 USB를 연결해주는 말 그대로 **어뎁터**와 같은 역할입니다!

Untitled

대표적인 예시로는 AuthService를 만들어 놓았을때,

다양한 소셜로그인을 붙이고 싶을때 아래처럼 추가가 된다면 같은 기능을 하는 코드가 소셜로그인 개수만큼 만들어질겁니다 아래처럼요!

enum AuthError: Error {
}

struct User {
    let id: String
    let name: String
    let age: Int
}

protocol AuthServiceType {
    func login(email: String, password: String, completion: (Result<(User), AuthError>) -> ())
}

final class AuthService: AuthServiceType {
    func login(email: String, password: String, completion: (Result<(User), AuthError>) -> ()) {
        // login 시도
        completion(.success(()))
    }
}
struct NaverUser {
    let naverID: String
    let name: String
    let email: String
}

class NaverAuthService {
    func login(email: String, password: String, naverKey: String, completion: (Result<(NaverUser), AuthError>) -> ()) {
    }
}

struct KakaoUser {
    let kakaoID: String
    let name: String
    let email: String
}

class KakaoAuthService {
    func login(email: String, password: String, kakaoKey: String, completion: (Result<(KakaoUser), AuthError>) -> ()) {
    }
}
class ViewController: UIViewController {
    let authService: AuthServiceType = AuthService()
    
    // new
    let naverAuthService = NaverAuthService()
    let kakaoAuthService = KakaoAuthService()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        authService.login(email: "email", password: "password") {
            print($0)
        }
        
        naverAuthService.login(email: "email", password: "password", naverKey: "naverKey") {
            print($0)
        }
        
        kakaoAuthService.login(email: "email", password: "password", kakaoKey: "kakaoKey") {
            print($0)
        }
    }
}

1-1. 어뎁터 패턴 구성

Untitled