24.09.12 Today I Learned
2024. 9. 12. 16:55
2일전에 공부하던 Firebase를 이어서 공부했음.
데이터가 안넘어갔었는데 코드를 수정하니 Firebase에 데이터가 저장이 됐음.
이유는 Auth에서 로그인 방식을 지정하지 않았는데, Auth방식을 사용하고 있던 것임.
일단은 CRUD를 공부하기 위한 것이니 Auth방식을 사용하지 않고 데이터를 생성해서 저장하는 것으로 바꿈.
ViewController
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 lazy var 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
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
return button
}()
private let viewModel = SignUpViewModel()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupUI()
}
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() {
// email, password가 비어있을 때 비어있다고 알림.
guard let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty else {
print("비어있음")
return
}
// ViewModel에 정의해둔 signUp()메서드를 사용함.
viewModel.signUp(email: email, password: password)
}
}
// viewModel.email = emailTextField.text ?? "" // ??쓰는이유 : 옵셔널 타입에 데이터가 nil일 때 default값을 정의해주기 위해서 사용하는 것
ViewModel
import Foundation
import FirebaseAuth
import FirebaseFirestore
class SignUpViewModel {
var errorMessage: String?
var isSignUpSuccessful: ((Bool) -> Void)?
let db = Firestore.firestore()
func signUp(email: String, password: String) {
db.collection("Users").document(email).setData([
"email": email,
"password": password // 왼쪽의 key값은 필드의 이름 오른쪽이 실제 저장이 될 값 value
]) { error in
if let error = error {
print("Error saving user data: \(error)")
} else {
print("User data saved successfully.")
}
}
// db에있는 "Users"라는 컬렉션에 접근, document는 각자의 객체로 회원가입 할떄마다 새로운 document가 생성되며 그 안에 정보가 들어감.
// 예를들어 test@gmail.com 으로 가입하면 문서 부분에 test@gmail.com이라는 문서가 생기고 컬렉션에 그사람의 정보가 들어감.
}
}
// Think.
// 1. textField에서 받은 이메일과 비밀번호를 우선 받아오기
// 2. ViewModel에서 정의한 signUP이라는 메서드를 사용할 때 거기에 필요한 파라미터 값으로 사용자가 입력한 이메일과 비번를 넣어줌
// 3. 그러면 함수의 email과 password에는 사용자가 입력한 이메일과 비번이 들어옴.
// 4. 그 후 파이어 스토어에 접근을 해서 사용자가 입력한 이메을의 이름을 가진 문서를 생성한 후 그 안에 데이터에다가 이메일과 비번을 저장하는 것임.
github에 정리중!
https://github.com/Leedoseo/firebaseStudy
'Today I Learned > 2024' 카테고리의 다른 글
24.09.27 Today I Learned (3) | 2024.09.27 |
---|---|
24.09.13 Today I Learned (0) | 2024.09.13 |
24.09.10 Today I Learned (0) | 2024.09.10 |
24.09.05 Today I Learned (0) | 2024.09.05 |
2024.09.03 Today I Learned (1) | 2024.09.03 |