24.09.10 Today I Learned

2024. 9. 10. 20:26

오늘은 Firebase에 대해 공부하려고 Firebase에 프로젝트를 만드는 방법을 알아봤음.

 

1. 처음 사이트를 가입하고 해당 창에서 프로젝트 만들기를 누름.(나는 공부하려고 만든 Mystudy가 이미 있음)

2. 이렇게 프로젝트 이름을 정해주고 계속버튼을 눌러서 쭈욱 넘겨주면됨.

3. 기다리다보면 해당 창에 오게 되는데 우측에 빌드 부분에 Authentication은 로그인 인증, Firesotre Database는 firestore인데 회원가입같은거를 했을 때 그 유저의 정보를 담는 기능을 하는 것 같음. 그리고 storage는 이미지등을 저장하는 곳임(아래 내리다보면 있음)

 

일단은 연습이니까 저 세개를 만들어서 공부를 해보겠음.


우선 Firebase를 공부하기위해 프로젝트를 생성함. MVVM패턴으로 연습을 해볼 것임.

 

Model 파일

import Foundation

struct User {
    
    let email: String
    let password: String
}

 

View 파일

import UIKit

import SnapKit

class SignUpViewController: UIViewController {
    
    private let emailTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Email"
        textField.borderStyle = .roundedRect
        return textField
    }()
    
    private let passwordTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Password"
        textField.borderStyle = .roundedRect
        textField.isSecureTextEntry = true
        return textField
    }()
    
    private let signUpButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Sign Up", for: .normal)
        button.backgroundColor = .blue
        button.setTitleColor(.white, for: .normal)
        button.layer.cornerRadius = 8
        return button
    }()
    
    private let viewModel = SignUpViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        setupUI()
        buttonAction()
    }
    
    private func setupUI() {
        [emailTextField, passwordTextField, signUpButton].forEach { view.addSubview($0) }
        
        emailTextField.snp.makeConstraints {
            $0.top.equalTo(view.safeAreaLayoutGuide).offset(50)
            $0.leading.trailing.equalToSuperview().inset(20)
            $0.height.equalTo(40)
        }
        
        passwordTextField.snp.makeConstraints {
            $0.top.equalTo(emailTextField.snp.bottom).offset(20)
            $0.leading.trailing.equalToSuperview().inset(20)
            $0.height.equalTo(40)
        }
        
        signUpButton.snp.makeConstraints {
            $0.top.equalTo(passwordTextField.snp.bottom).offset(30)
            $0.centerX.equalToSuperview()
            $0.width.equalTo(150)
            $0.height.equalTo(50)
        }
    }
    
    @objc private func buttonAction() {
        viewModel.email = emailTextField.text ?? ""
        viewModel.password = passwordTextField.text ?? ""
        
        viewModel.signUP()
        viewModel.isSignUpSuccessful = { [weak self] isSuccess in
            if isSuccess {
                let alert = UIAlertController(title: "성공", message: "회원 가입이 완료되었습니다.", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self?.present(alert, animated: true, completion: nil)
            } else {
                let alert = UIAlertController(title: "실패", message: "회원 가입이 실패하였습니다. \(self?.viewModel.errorMessage ?? "")", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                self?.present(alert, animated: true, completion: nil)
            }
        }
    }
}

 

ViewModel 파일

import Foundation

import FirebaseAuth
import FirebaseFirestore

class SignUpViewModel {
    var email: String = ""
    var password: String = ""
    var errorMessage: String?
    var isSignUpSuccessful: ((Bool) -> Void)?
    
    func signUP() {
        Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in
            if let error = error {
                self?.errorMessage = error.localizedDescription
                self?.isSignUpSuccessful?(false)
            } else if let result = result {
                self?.isSignUpSuccessful?(true)
                
                // Firestore에 사용자 정보 저장
                   let db = Firestore.firestore()
                   db.collection("users").document(result.user.uid).setData([
                       "email": self?.email ?? "",
                       "createdAt": Timestamp()
                   ]) { error in
                       if let error = error {
                           print("Error saving user data: \(error)")
                       } else {
                           print("User data saved successfully.")
                       }
                   }
               }
           }
       }
   }

이렇게 작성했는데 왜 파이어 베이스에 데이터가 저장이 안될까.. 흠.. 내일 더 공부해봐야겠다.

'Today I Learned > 2024' 카테고리의 다른 글

24.09.13 Today I Learned  (0) 2024.09.13
24.09.12 Today I Learned  (0) 2024.09.12
24.09.05 Today I Learned  (0) 2024.09.05
2024.09.03 Today I Learned  (1) 2024.09.03
24.09.02 Today I Learned  (0) 2024.09.02

BELATED ARTICLES

more