ํ”„๋กœ์ ํŠธ ๐Ÿ› ๏ธ/iOS

์•ฑ์ด ์งฑ์ปค์„œ ์—…๋ฐ์ดํŠธ ํ• ๊ฑฐ ๋ฐฑ๋งŒ๊ฐœ!

WonderPark 2023. 6. 10. 02:26

 

๊ณ ๋ฏผ๊ณ ๋ฏผ ... 

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ์งฑํฌ๋‹ค .. ์งฑํฌ๋‹ˆ๊นŒ ๋ญ๊ฐ€ ์งฑ๋งŽ๋‹ค..๐Ÿ˜ซ

์ข‹์•„์š”๊ธฐ๋Šฅ, ์ €์žฅ๊ธฐ๋Šฅ, ํŒ”๋กœ์ž‰๊ธฐ๋Šฅ, ๊ฒŒ์‹œ๋ฌผ ์˜ฌ๋ฆฌ๊ธฐ, ์ˆ˜์ •ํ•˜๊ธฐ …

์ด ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ•„์ˆ˜์ ์œผ๋กœ update ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ์ €๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋ €์„๋•Œ ์œ ์ €๊ฐ€ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŠธ์—

๋ฐฉ๊ธˆ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๋ฌผ๋„ ์—…๋ฐ์ดํŠธ (append) ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์œ ์ €์ •๋ณด์—์„œ ์ข‹์•„์š” ์—…๋ฐ์ดํŠธ, ์ €์žฅ ์—…๋ฐ์ดํŠธ ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผํ• ๊นŒ?

์•ฝ๊ฐ„ updateUserLikeMagazine , updateUserBookmarkedMagazine … ์ด๋ ‡๊ฒŒ

 

์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋‚ด๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์„๋•Œ ํŒ€์›๋“ค์ด ์‰ฝ๊ฒŒ ๋ทฐ๋‹จ์—์„œ ์•Œ์ž˜๋”ฑ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค. ๐Ÿค”

 

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ ์ด๋Ÿฌํ•˜๋‹ค.

    var likedMagazineID: UserArrayKey
    var id: UserStringValue
    var myLens, myFilm, postedCommunityID: UserArrayKey
    var nickName: UserStringValue
    var introduce: UserStringValue
    var following: UserArrayKey
    var profileImage: UserStringValue
    var recentSearch, bookmarkedCommunityID, follower, lastSearched: UserArrayKey
    var email: UserStringValue
    var postedMagazineID, myCamera, bookmarkedMagazineID, fcmToken: UserArrayKey
    var name: UserStringValue
    var blocking, blocked: UserArrayKey

์ผ๋‹จ ์šฐ๋ฆฌ์˜ UserDTO ๋ฅผ ๋ณด๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด String ์•„๋‹ˆ๋ฉด Array ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ String ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ• ๋•Œ (์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ €์˜ id , ํ˜น์€ ๋‹‰๋„ค์ž„ .. )

String ํƒ€์ž…์„ ์œ„ํ•œ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ 

 

Array ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ• ๋•Œ (ex. ์œ ์ €๊ฐ€ ์˜ฌ๋ฆฐ ๋ฉ”๊ฑฐ์ง„ ID, ์ €์žฅํ•œ ๋ฉ”๊ฑฐ์ง„ ID … )

Array ํƒ€์ž…์„ ์œ„ํ•œ ์—…๋ฐ์ดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•˜๋ƒ๋ฉด ?

 

UserRouter ์—์„œ

 

[endPoint]

case let .patchArr(_,_, docID):
     return "/" + "\(queryItemString)" + "/" + "\(docID)"
case let .patchString(_,_, docID):
     return "/" + "\(queryItemString)" + "/" + "\(docID)"

 

[parameter]

case let .patchArr(type, _, _):
    let params: [URLQueryItem] = [URLQueryItem(name: "updateMask.fieldPaths", value: type)]
    return params
case let .patchString(type, _, _):
    let params: [URLQueryItem] = [URLQueryItem(name: "updateMask.fieldPaths", value: type)]
    return params

 

[data]

case let .patchArr(type, arr, _):
     return UserQuery.updateUserArray(type: type, arr: arr)
case let .patchString(type, string, _):
     return UserQuery.updateUserString(type: type, string: string)

 

structuredQuery ์—์„œ 

static func updateUserString(type: String, string: String) -> Data? {
        let query = """
                    {
                      "fields": {
                           "\(type)": {
                                "stringValue": "\(string)"
                    }
                }
            }
            """.data(using: .utf8)
        
        return query
    }

์ด๋Ÿฐ์‹์œผ๋กœ type ๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด,

๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋ฅผ type์œผ๋กœ ๋ถ„๋ฅ˜ํ•ด์„œ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ง„์งœ ๋งŽ์€ ์ผ€์ด์Šค์— ๋Œ€ํ•œ Update ๋ฉ”์„œ๋“œ๋ฅผ ๋‹จ 2๊ฐœ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

    // MARK: - ์œ ์ €์ •๋ณด ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ (string ๋ฐฐ์—ด ํƒ€์ž…๊ฐ’ ์—…๋ฐ์ดํŠธํ• ๋•Œ ์‚ฌ์šฉ )
    /// ์ข‹์•„์š”๋ˆ„๋ฅธ ๊ฒŒ์‹œ๊ธ€ , ์ €์žฅํ•œ ๊ฒŒ์‹œ๊ธ€, ์ €์žฅํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ธ€, ๋‚ด ์žฅ๋น„์ •๋ณด(์นด๋ฉ”๋ผ, ๋ Œ์ฆˆ, ํ•„๋ฆ„), ๋‚ด๊ฐ€ ์˜ฌ๋ฆฐ ๋ฉ”๊ฑฐ์ง„, ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ , ํŒ”๋กœ์›Œ, ํŒ”๋กœ์ž‰ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    /// ex) type: likedMagazineId , string: ["1234", "45346346", "56456456"], docID: ํ˜„์žฌ๋กœ๊ทธ์ธํ•œ์œ ์ €์•„์ด๋”” -> ์œ ์ €๊ฐ€ ์ข‹์•„์š”๋ˆ„๋ฅธ ๋ฉ”๊ฑฐ์ง„ ์•„์ด๋”” ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด์„ ["1234", "45346346", "56456456"] ๋กœ ๋ฐ”๊พธ๊ฒ ๋‹ค. !!!
    func updateCurrentUserArray(type: String, arr: [String], docID: String){
        UserService.updateCurrentUserArray(type: type, arr: arr, docID: docID)
            .receive(on: DispatchQueue.main)
            .sink { (completion: Subscribers.Completion<Error>) in
            } receiveValue: { (data: UserDocument) in
                self.fetchCurrentUser(userID: Auth.auth().currentUser?.uid ?? "")
                self.fetchUser(nextPageToken: "")
                self.updateUsersArraySuccess.send()
            }.store(in: &subscription)
    }

 

    // MARK: - ์œ ์ €์ •๋ณด ์—…๋ฐ์ดํŠธ ๋ฉ”์†Œ๋“œ (string ํƒ€์ž…๊ฐ’ ์—…๋ฐ์ดํŠธํ• ๋•Œ ์‚ฌ์šฉ)
    /// ex) type: id , string: "1234", docID: ํ˜„์žฌ๋กœ๊ทธ์ธํ•œ์œ ์ €์•„์ด๋”” -> ์œ ์ €์˜  id ๋ฅผ 1234๋กœ ๋ฐ”๊พธ๊ฒ ๋Œœ!!!
    func updateCurrentUserString(type: String, string: String, docID: String) {
        UserService.updateCurrentUserString(type: type, string: string, docID: docID)
            .receive(on: DispatchQueue.main)
            .sink { (completion: Subscribers.Completion<Error>) in
            } receiveValue: { (data: UserDocument) in
                self.updateUsersStringSuccess.send()
            }.store(in: &subscription)
    }

์œ„์˜ updateCurrentUserString ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ type, string, docID ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋ทฐ์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ• ๋•Œ type์—๋Š” ์—…๋ฐ์ดํŠธ ํ•˜๋ ค๋Š” ํŠน์ • ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ๋„ฃ๊ณ , string ์€ ์—…๋ฐ์ดํŠธ ํ•˜๋ ค๋Š” ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  docID๋Š” ํŠน์ • ์œ ์ €์˜ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ docID๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์„œ

userVM.updateCurrentUserArray(type: "nickName", string: "wonder", docID: "123123")

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

๊ทธ๋Ÿผ ์ด์ œ ์œ ์ €์˜ ๋‹‰๋„ค์ž„์ด wonder ๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋Š”๊ฑฐ์ฃ ! ใ…Žใ…Ž

 

๋А๋‚€์ 

์Œ ์ด ๋ฐฉ์‹์ด ๊ณผ์—ฐ ์ข‹์€ ์ฝ”๋“œ์ธ๊ฐ€ .. ํ”„๋กœํผํ‹ฐ ํƒ€์ž…์œผ๋กœ ๋ถ„๋ฅ˜ํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด

ํ—ท๊ฐˆ๋ฆฌ์ง€๋Š” ์•Š์„๊นŒ, ๋„ˆ๋ฌด ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค์ง€๋Š” ์•Š์„๊นŒ ๋งŽ์ด ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ,

์‚ฌ์šฉํ•˜๋Š”๋ฐ ํŒ€์›๋“ค๋„ ๋ฐ”๋กœ ๋„ˆ๋ฌด ์ž˜ ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ๊ณ , ์ค‘๋ณต๋˜๋Š” update ๋ฉ”์„œ๋“œ๋“ค์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์„œ

๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ์„๋•Œ ์“ฐ๊ธฐ ํŽธํ•œ ์ฝ”๋“œ๋Š” ๋งž๋Š”๊ฒƒ ๊ฐ™๋‹ค.

์ผ๋‹จ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„˜๋‚˜ ์ปค์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

๋˜ ํ”„๋กœ์ ํŠธํ•˜๋ฉด์„œ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์—†์—ˆ์„๋•Œ๋ผ ๋ถ„์—…ํ™”์˜ ์ค‘์š”์„ฑ์„ ๋งŽ์ด ๋А๊ผˆ์„๋•Œ์˜€๋Š”๋ฐ,

์ด๋•Œ ViewModel ์ชฝ์„ ์ž‘์—…ํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ViewModel์„ ์‚ฌ์šฉํ•˜๋Š” View๋ฅผ ๋งŒ์ง€๊ณ  ์žˆ๋Š” ํŒ€์›๋“ค์ด “ViewModel ์ƒํ™ฉ์€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ผ๋‹จ ์ด๊ฑฐ ๊ฐ–๋‹ค์“ฐ๋ฉด ๋˜๋Š”๊ฑฐ์ง€!?” ์ด๊ฒŒ ๊ฐ€๋Šฅํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณธ ๊ฒฐ๊ณผ์ด๋‹ค.

๋˜ ๋‚ด๊ฐ€ ์ฃผ์„์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋†“์•„์„œ์ธ์ง€ ๋ชฐ๋ผ๋„ ํŒ€์›๋“คํ•œํ…Œ ์ด๊ฑฐ ์ด๋Ÿด๋•Œ์“ฐ๊ณ  ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด๋ผ! ๋ผ๊ณ 

์„ค๋ช…๋งŒ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ ๋ฐ”๋กœ ์‰ฝ๊ฒŒ ์ฝ”๋“œ์— ์ ์šฉํ•ด์ค˜์„œ ๋„˜ ๋ฟŒ๋“ฏํ–ˆ๋‹ค … ํ—ท ๐Ÿค