1편에 이어 마저 만들어보자. 이것도 순서가 좀 뒤죽박죽 ^^,,, 1편에서 거의 다 만들어서 딱히 할게 없다.
firebase에서 데이터베이스를 만들어준다. 이름은 그냥 default로.
// MARK: User Defaults
@AppStorage("user_profile_url") var profileURL: URL?
@AppStorage("user_name") var userNameStored: String = ""
@AppStorage("user_UID") var userUID: String = ""
@AppStorage("log_status") var logStatus: Bool = false
@AppStorage로 변수들을 선언해두자.
// MARK: 만약 유저를 찾으면 Firestore에서 유저 데이터를 패칭한다.
func fetchUser() async throws{
guard let userID = Auth.auth().currentUser?.uid else {return}
let user = try await Firestore.firestore().collection("Users").document(userID).getDocument(as: User.self)
// MARK: UI Updating Must be Run on Main Thread
await MainActor.run(body: {
// Setting UserDefaults data and Changing App's Auth Status
userUID = userID
userNameStored = user.username
profileURL = user.userProfileURL
logStatus = true
})
}
로그인을 하고, 유저를 찾으면 유저 데이터를 패칭해야한다. 당연히 비동기 함수로 만들어야한다.
Auth.auth().currentUser?로 현재 인증된 사용자를 가져온다. 옵셔널 체이닝을 사용하여 사용자 고유 ID (UID)를 가져온다. guard let을 이용하여 사용자 ID가 없으면 함수를 즉시 종료한다.
.collection("Users") 로 Users 컬렉션을 참조한다. .document(userID)로 특정 사용자 ID에 해당하는 문서를 참조한다. .getDocument(as: User.self) : 문서를 가져와서 'User' 타입으로 디코딩한다.
화면 로딩할 동안 뜰 로딩 뷰도 대충~... 만들어준다.
그리고 loginView()에서 로딩할 때는 @State를 이용해서 바인딩해서, 오버레이로 띄운다.
.overlay(content: {
LoadingView(show: $isLoading)
})
ContentView에서 logStatus에 따라 로그인뷰와 메인뷰가 보이도록 컨트롤한다.
struct ContentView: View {
@AppStorage("log_status") var logStatus: Bool = false
var body: some View {
// MARK: Redirecting User based on Log Status
if logStatus {
Text("Main View")
} else {
LoginView()
}
}
}
이럼 다 했다.
파이어베이스에 잘 뜨는지 확인해보자. 유저 목록이 잘 뜬다. 데이터 베이스에 유저 컬렉션도 잘 뜬다. 
