Skip to content
This repository has been archived by the owner on Nov 18, 2024. It is now read-only.

[Refactor] 로그인화면 Usecase Layer적용을 위한 기본 코드 구성 #55

Open
dlrjswns opened this issue Jul 11, 2024 · 2 comments
Assignees
Labels
♻️ Refactor 리팩토링

Comments

@dlrjswns
Copy link
Contributor

dlrjswns commented Jul 11, 2024

Describe

  • 소셜로그인화면에는 Google Apple Kakao각각에 대한 로직이 반드시 필요
  • Usecase Layer를 적용하여 각각의 최소 요청단위로 나누어 ViewModel에서 가져와 사용
  • ViewModel과 Usecase와의 관계가 1:1이 아닌 N:N으로서 구현

Existing

private func loginWithGoogle() {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let rootViewController = windowScene.windows.first?.rootViewController as? UINavigationController,
              let presentingViewController = rootViewController.topViewController as? LoginViewController else {
            return
        }
        GIDSignIn.sharedInstance.signIn(withPresenting: presentingViewController) { result, error in
            guard error == nil else {
                LogHelper.error("Google SocialLogin Failed: \(error!)")
                return
            }
            
        }
}
    
private func loginWithKakao() {
        let loginClosure: (OAuthToken?, Error?) -> Void = { oauthToken, error in
            guard error == nil else {
                // TODO: 건준 - 카카오톡 로그인 실패 Alert 띄우기
                LogHelper.error("Kakao SocialLogin Failed: \(error!)")
                return
            }
            
         }
        
        if UserApi.isKakaoTalkLoginAvailable() {
            // 카카오톡 로그인 api 호출 결과를 클로저로 전달
            UserApi.shared.loginWithKakaoTalk(completion: loginClosure)
        } else { // 웹으로 로그인 호출
            UserApi.shared.loginWithKakaoAccount(completion: loginClosure)
        }
}
    
private func loginWithApple() {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let rootViewController = windowScene.windows.first?.rootViewController as? UINavigationController,
              let presentingViewController = rootViewController.topViewController as? LoginViewController else {
            return
        }
    
        let provider = ASAuthorizationAppleIDProvider()
        let request = provider.createRequest()
        request.requestedScopes = [.fullName, .email]
        
        let controller = ASAuthorizationController(authorizationRequests: [request])
        controller.delegate = presentingViewController
        controller.presentationContextProvider = presentingViewController
        controller.performRequests()
}
  • 기존 LoginViewModel에 구글, 카카오, 애플에 관련된 로그인을 통해 받아온 정보를 APIService를 통해 구성해야하기에 무거운 ViewModel을 가짐

Benefits

  • 소셜로그인관련 로직은 LoginViewModel에서만 사용하지만 서로 다른 ViewModel에서 비슷한 작업을 하는 경우 Usecase만을 이용해 구현하면 이해하기 수월

Reference

@dlrjswns dlrjswns added the ♻️ Refactor 리팩토링 label Jul 11, 2024
@dlrjswns dlrjswns self-assigned this Jul 11, 2024
@ChoiysApple
Copy link
Member

@dlrjswns
건준님~ 이슈 생성하실때 오른쪽 탭에서 Project에 추가해주세요

@dlrjswns
Copy link
Contributor Author

@dlrjswns 건준님~ 이슈 생성하실때 오른쪽 탭에서 Project에 추가해주세요

아 지금 바로 제가 생성했던 이슈들에 Project추가하겠습니다 !!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
♻️ Refactor 리팩토링
Projects
None yet
Development

No branches or pull requests

2 participants