firebase에서 제공하는 database에는 Firestore database와 Realtime database가 존재한다. 각자의 장단점이 존재하지만 이 글은 Firestore를 활용해 데이터를 저장하는 방법에 대해서 쓰도록 하겠다.
현재 작업중인 프로젝트에서는 사용자별로 사용자가 추가한 택배송장번호와 택배회사를 firebase에 저장을 해야했다. 우선 회원가입을 하면 다음과 같이 users collection에 user.uid document를 설정하고, 사용자의 이메일을 넣는다. 초기에는 송장번호를 입력하지 않았으므로 nil값을 넣어주었다.
EmailAuthVM.swift
class EmailAuthVM: ObservableObject { // 사용자 Create 완료
@AppStorage("log_status") var logStatus = false
@Published var currentUser: Firebase.User?
init() {
currentUser = Auth.auth().currentUser
}
func registerUser(email: String, password: String) {
Auth.auth().createUser(withEmail: email, password: password) { result, error in
if let error = error {
print("Error : \(error.localizedDescription)")
return
}
guard let user = result?.user else { return } // 파이어베이스 유저 객체를 가져옴
let trackInfo = TrackInfo(email: email, userTracksInfo: nil)
if error == nil { //firebase db에 저장하는 방법
self.currentUser = result?.user
let db = Firestore.firestore()
db.collection("users").document(user.uid).setData(trackInfo.setEmail)
}
}
}
}
그리고 setData 부분에 setEmail함수는
"Cannot convert value of type 'TrackInfo' to expected argument type '[String : Any]'" 오류를 해결하기 위해 넣어주었다. trackInfo모델은 다음과 같다.
public struct TrackInfo: Codable {
let email: String?
let userTracksInfo: [Packages]?
var setEmail: [String:Any] {
return [
"email": self.email
]
}
}
public struct Packages: Codable {
let trackNumber: String?
let trackCompany: String?
var setTrackNumber: [String:Any] {
return [
"trackNumber": self.trackNumber,
"trackCompany": self.trackCompany
]
}
}
사용자 데이터에 이메일만 들어간 상태이고, 이제 사용자가 송장번호와 택배회사를 입력하면 해당 데이터를 Firestore에 넣는 작업은 다음과 같다.
func addTrackNumber(trackNumber: String, trackCompany: String) { // 택배 create
let db = Firestore.firestore()
let packages = Packages(trackNumber: trackNumber, trackCompany: "대한통운")
do {
try db.collection("users").document(currentUser?.uid ?? "").updateData([
"userTracksInfo": FieldValue.arrayUnion([packages.setTrackNumber])
])
} catch let error {
print("\(error)")
}
}
다음과 같은 함수를 emailAuthvm.swift에 입력해주면 된다. (trackCompany는 임시로 넣어둔 상태)
다음 함수를 button action부분에 넣어주고 사용하면 된다. updateData를 사용한 이유는 setData를 활용해 데이터를 저장할 경우 기존에 존재하던 송장번호와 택배회사 데이터가 없어지고 새롭게 데이터를 저장하기 때문이다. updataData를 사용하면 기존 데이터에 추가로 데이터를 저장할 수 있다.
이렇게 한 후 firebase를 확인해보면

다음고 같은 데이터들이 들어가 있게 된다.
'iOS 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] - firebase 회원가입, 로그인 시 에러 처리 View에 적용하기 (0) | 2023.01.31 |
---|---|
[SwiftUI] firebase firstore 데이터 CRUD (0) | 2023.01.31 |
[SwiftUI] - custom list item 만들기 (0) | 2023.01.17 |
[SwiftUI] - 설정 화면(View) 구현하기 (2) | 2023.01.07 |
[SwiftUI] - TabView, Progress bar를 활용한 메인 화면 구성 (0) | 2023.01.06 |
firebase에서 제공하는 database에는 Firestore database와 Realtime database가 존재한다. 각자의 장단점이 존재하지만 이 글은 Firestore를 활용해 데이터를 저장하는 방법에 대해서 쓰도록 하겠다.
현재 작업중인 프로젝트에서는 사용자별로 사용자가 추가한 택배송장번호와 택배회사를 firebase에 저장을 해야했다. 우선 회원가입을 하면 다음과 같이 users collection에 user.uid document를 설정하고, 사용자의 이메일을 넣는다. 초기에는 송장번호를 입력하지 않았으므로 nil값을 넣어주었다.
EmailAuthVM.swift
class EmailAuthVM: ObservableObject { // 사용자 Create 완료
@AppStorage("log_status") var logStatus = false
@Published var currentUser: Firebase.User?
init() {
currentUser = Auth.auth().currentUser
}
func registerUser(email: String, password: String) {
Auth.auth().createUser(withEmail: email, password: password) { result, error in
if let error = error {
print("Error : \(error.localizedDescription)")
return
}
guard let user = result?.user else { return } // 파이어베이스 유저 객체를 가져옴
let trackInfo = TrackInfo(email: email, userTracksInfo: nil)
if error == nil { //firebase db에 저장하는 방법
self.currentUser = result?.user
let db = Firestore.firestore()
db.collection("users").document(user.uid).setData(trackInfo.setEmail)
}
}
}
}
그리고 setData 부분에 setEmail함수는
"Cannot convert value of type 'TrackInfo' to expected argument type '[String : Any]'" 오류를 해결하기 위해 넣어주었다. trackInfo모델은 다음과 같다.
public struct TrackInfo: Codable {
let email: String?
let userTracksInfo: [Packages]?
var setEmail: [String:Any] {
return [
"email": self.email
]
}
}
public struct Packages: Codable {
let trackNumber: String?
let trackCompany: String?
var setTrackNumber: [String:Any] {
return [
"trackNumber": self.trackNumber,
"trackCompany": self.trackCompany
]
}
}
사용자 데이터에 이메일만 들어간 상태이고, 이제 사용자가 송장번호와 택배회사를 입력하면 해당 데이터를 Firestore에 넣는 작업은 다음과 같다.
func addTrackNumber(trackNumber: String, trackCompany: String) { // 택배 create
let db = Firestore.firestore()
let packages = Packages(trackNumber: trackNumber, trackCompany: "대한통운")
do {
try db.collection("users").document(currentUser?.uid ?? "").updateData([
"userTracksInfo": FieldValue.arrayUnion([packages.setTrackNumber])
])
} catch let error {
print("\(error)")
}
}
다음과 같은 함수를 emailAuthvm.swift에 입력해주면 된다. (trackCompany는 임시로 넣어둔 상태)
다음 함수를 button action부분에 넣어주고 사용하면 된다. updateData를 사용한 이유는 setData를 활용해 데이터를 저장할 경우 기존에 존재하던 송장번호와 택배회사 데이터가 없어지고 새롭게 데이터를 저장하기 때문이다. updataData를 사용하면 기존 데이터에 추가로 데이터를 저장할 수 있다.
이렇게 한 후 firebase를 확인해보면

다음고 같은 데이터들이 들어가 있게 된다.
'iOS 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] - firebase 회원가입, 로그인 시 에러 처리 View에 적용하기 (0) | 2023.01.31 |
---|---|
[SwiftUI] firebase firstore 데이터 CRUD (0) | 2023.01.31 |
[SwiftUI] - custom list item 만들기 (0) | 2023.01.17 |
[SwiftUI] - 설정 화면(View) 구현하기 (2) | 2023.01.07 |
[SwiftUI] - TabView, Progress bar를 활용한 메인 화면 구성 (0) | 2023.01.06 |