본문 바로가기

프로젝트/Twitter Clone App (w∕Firebase)

11. 기능 구현하기 #3

기능 구현하기 #3
UserInformation


UserInformation
| UserModel

struct User: Identifiable, Codable {
    @DocumentID var id: String?
    let username: String
    let fullname: String
    let profileImageUrl: String
    let email: String
}

Firebase에서 받아와 사용할 수 있도록 User 데이터에 대한 모델을 구성한다.

UserInformation
| UserService

import Firebase
import FirebaseFirestoreSwift

Firebase에서 사용자의 정보를 받아오기 위한 함수를 작성한다.
이를 위해 Firebase와 FirebaseFirestoreSwift를 import 했다.

Firestore에 저장된 Document를 가져오는 방식은 다음과 같다.

Firestore.firestore().collection("users")

여기까지는 Firestore의 users까지의 접근이다.

 Firestore.firestore().collection("users").document(uid).getDocument

여기까지는 users 내의 데이터 중 전달된 uid와 일치하는 데이터의 Document를 가져오는 부분이다.

import Firebase
import FirebaseFirestoreSwift

struct UserService {
    func fetchUser(withUid uid: String) {
        Firestore.firestore().collection("users").document(uid).getDocument { snapshot, _ in
            guard let snapshot = snapshot else {
                return
            }

            guard let user = try? snapshot.data(as: User.self) else {
                return
            }
        }
    }
}

이렇게 가져온 데이터와 결과는 completionHandler로 전달된다.
데이터는 snapshot으로, error는 wildcard로 전달된 모습니다.

guard문을 사용해 snapshot에 대해 유효성 검사를 진행하고, 앞서 선언한 User 구조체로 이를 변환한다.

UserInformation
| AuthViewModel

class AuthViewModel: ObservableObject {
	@Published var userSession: FirebaseAuth.User?
	@Published var didAuthenticateUser = false
	
	private var tempUserSession: FirebaseAuth.User?
	private let service = UserService()

정의한 UserService를 사용할 수 있도록 service 인스턴스를 선언한다.

class AuthViewModel: ObservableObject {
	@Published var userSession: FirebaseAuth.User?
	@Published var didAuthenticateUser = false
	
	private var tempUserSession: FirebaseAuth.User?
	private let service = UserService()
	
	.
    .
    .
    
	func fetchUser() {
		guard let uid = self.userSession?.uid else {
			return
		}
		
		service.fetchUser(withUid: uid)
	}
}

fetchUser 함수를 선언하고, UserService에서 정의한 함수를 현재 userSession의 uid를 사용해 호출한다.

class AuthViewModel: ObservableObject {
    @Published var userSession: FirebaseAuth.User?
    @Published var didAuthenticateUser = false

    private var tempUserSession: FirebaseAuth.User?
    private let service = UserService()

    init() {
        self.userSession = Auth.auth().currentUser
        fetchUser()
    }
    
    .
    .
    .

정의한 함수는 AuthViewModel이 초기화되는 시점에 호출해 현재 로그인된 사용자의 데이터를 불러올 수 있도록 구현한다.

 

'프로젝트 > Twitter Clone App (w∕Firebase)' 카테고리의 다른 글

13. DB와 연결하기 #2  (0) 2023.01.10
12. DB와 연결하기 #1  (0) 2023.01.05
10. 기능 구현하기 #2  (0) 2022.12.20
09. 기능 구현하기 #1  (0) 2022.12.13
08. 기본 UI 구현하기 #8  (0) 2022.12.02