Swift 일기장 개발 일기 6 (Firebase Auth로 로그인)

송민준·2023년 1월 12일
0

일기장 개발 일기

목록 보기
6/11

어떤 플랫폼에서든 유저의 진행상황이 공유되는 일기장을 만들고 싶어 내부 저장소보다는 외부 저장소를 만들고자 했습니다.

그래서 iOS의 장점을 살리고자 iCloud를 사용해보고 싶었으나 이를 사용하기 위해서는 cloudKit이라는 애플의 API가 필요한데 이를 사용하기 위해서는 Apple Development Program 계약이 필요합니다. 이 계약의 가격은 무려 12만원 상당입니다.;;

물론 비영리 단체 또는 교육기관은 수익을 창출하지 않는다는 전재 하에 무료라지만 교육기관으로 등록하는건 찾아봐도 없고 개인 개발자이므로 택도 없었습니다.

때문에 Firebase를 사용하기로 했습니다. Firebase는 일부 서비스에 한해 무료입니다.
(가격 정책: https://firebase.google.com/pricing/?gclid=CjwKCAiA-_L9BRBQEiwA-bm5fpCPMi2xOC-UgxPZ8BAU09l9k5LGv-lWaaVKufL-ncqs6FhpH94RwBoCRngQAvD_BwE)


어떤 플렛폼에서나 가능하도록 하기 위해서는 사용자마다 식별이 가능해야합니다. 때문에 로그인/회원가입이 필요하고 Firebase는 Firebase Auth라는 서비스가 있습니다.

Firebase 설치

https://console.firebase.google.com/u/0/
위 링크를 통해 Firebase 프로젝트를 생성할 수 있습니다.

저는 앱추가를 통해 iOS 프로젝트에 Firebase를 설치했습니다.
단계별로 알려주는데 상당히 친절하게 묘사가 되어있었습니다.

iOS 앱에 firebase 추가 단계에서 저는 pod로 설치했는데
터미널에서 (프로젝트 파일 위치) pod init을 하면 podfile이 생성됩니다.

내가 원하는 서비스를 pod <서비스 이름>으로 작성하고 터미널에서 pod install 명령을 하면 이 서비스와 관련된 종속성까지 전부 설치됩니다.

하라는 대로 하니까 에러없이 설치되었습니다.

Firebase Auth

이제 firebase를 이용할 시간입니다.

AuthViewModel

로그인 관련 ViewModel인 AuthViewModel을 작성했습니다. 로그인 또는 회원가입 관련 메커니즘은 이 파일에서 작성할 것입니다.

import FirebaseAuth
class AuthViewModel : NSObject {
    var currentUser: String?
    func logIn(email:String, password:String) -> Bool {
        Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
            if user != nil {
                self.currentUser = user?.description
                print("Log In Success!")
            }
            else{
                print("Log In Failed. \(error.debugDescription)")
            }
        }
        
        return true
    }
}
  • Auth.auth().signIn(withEmail: email, password: password) { (user, error) in ...
    : Firebase 서버에 로그인 요청을 보내는 명령입니다. 후행 클로저를 통해 성공했을 때와 실패했을 때 작업을 지정했습니다.
    • 여기서 클로저를 왜 사용하는지에 대해 궁금했습니다.
      -> 그 이유는 비동기 작업을 위함이었습니다.
    • 동기? 비동기?
      제가 이해한 것으로 설명하자면
      • 동기: 끝날 때까지 기다려주는 것입니다. 예로 함수를 실행했을 때 위에서 아래로 읽습니다. 보통이면 위 코드의 작업이 끝나고 나서 아래 코드가 실행되는 것으로 알고 있죠. 그 결과로 총 경과 시간은 느려집니다.
      • 비동기: 끝날 때까지 기다려주지 않고 실행하는 것입니다. 그 결과로 빠르겠죠.
    • 따라서 클로저를 사용하는 이유는 서버에 로그인을 요청하는건 꽤나 오래걸리는 작업이기 때문이고 클로저를 작성하고 이를 인자로 넘겨줌으로써 서버에 요청이 완료되었을 때의 작업을 지정하는 것입니다.
    • 또다른 이점은 클로저를 작성하고 넘겨준다는 것은 Auth 입장에서 그 클로저가 자세하게 뭔지 몰라도 된다. 즉 투명성이 확보됩니다.

LogInViewController

VC 또한 작성했습니다. LogInVC는 AuthViewModel을 구성하고 있습니다.

import UIKit

class LogInViewController : UIViewController {
    
    @IBOutlet weak var emailTextBar: UITextField!
    @IBOutlet weak var passwordTextBar: UITextField!
    @IBOutlet weak var statusBar: UILabel!
    
    let authViewModel = AuthViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func logInButtonClicked(_ sender: Any) {
        let email:String = emailTextBar.text!
        let password:String = passwordTextBar.text!
        authViewModel.logIn(email:email, password:password)
    }
}

테스트

아직 회원가입 기능이 없으므로 firebase console에서 아이디 정보를 직접 입력했습니다.

그리고 시뮬레이터에서 로그인.

콘솔.

다음 글은 당연하게도 회원가입입니다.

profile
개발자

0개의 댓글