sladuf
200
sladuf
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (83)
    • ๐Ÿ“š Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • ๐Ÿ“ฑ iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • ์ธ๊ฐ• & ์ฑ… (2)
    • ๐Ÿ”— Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • ๐Ÿ—‚ ETC (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์Šค์œ„ํ”„ํŠธ
  • Swift

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ธ€์“ฐ๊ธฐ ์„ค์ •
hELLO ยท Designed By ์ •์ƒ์šฐ.
sladuf

200

๐Ÿ“ฑ iOS/Base

[Swift] ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋งŒ๋“ค๊ธฐ (feat. Generic)

2023. 5. 5. 02:24

 

 

 

 

์ง€๋‚œ๋ฒˆ์— ์ด๋Ÿฐ ๊ธ€์„ ์ผ์—ˆ๋Š”๋ฐ,

https://990427.tistory.com/112

 

[Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ

์š”์ฆ˜ Set์ด ๋œ ๋‚˜์˜ ๊ฐœ๋ฐœ ์Šคํƒ€์ผ,, ์ค‘๋ณต์„ ๋‹ค ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฌ์ž ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ API๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์„ธํ–ˆ์Šต๋‹ˆ๋‹ค ๊ทธ๋ž˜์„œ ์–ด๋–ค api๋ฅผ ํ˜ธ์ถœํ•˜๋ƒ์— ๋”ฐ๋ผ form์˜ ๋ณ€ํ™”๋Š” ์—†์ง€๋งŒ data์˜ ๊ฐ’์€ ํ•ญ์ƒ

990427.tistory.com

 

์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ์ ๋„ ์žˆ์—ˆ๊ณ ,

๋ชจ๋“ˆ๋งˆ๋‹ค ๋‹ค ๋‹ค๋ฅธ MoyaProvider๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ์ €๋ฒˆ์— ๋งŒ๋“  ํ•จ์ˆ˜์˜ ์“ฐ์ž„์ด ์ข€.. ๋ณ„๋กœ๋ž„๊นŒ?

 

๊ทธ๋ž˜์„œ ๊ฐœ์„ ํ•ด๋ณด์ž!๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ์กฐ๊ธˆ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก

BaseNetworkManager๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

BaseNetWork์˜ ๋ชฉํ‘œ

1. ๋ชจ๋“  ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  NetworkManager์˜ ๊ธฐ๋ฐ˜์ด ๋˜์ž.

2. ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์ž.

 

Base-๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์—์„œ ์ƒ์†ํ•ด์„œ ๊ทธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” MoyaProvider๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ provider๋ฅผ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค์ž!

open class BaseNetworkManager<Target : TargetType>{
    let provider = MoyaProvider<Target>()
    
    public init() {}
    
}

์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ถ€๊ฐ€์„ค๋ช…์„ ํ•˜๋ฉด =

class๋ฅผ ๋งŒ๋“ค ๋•Œ Target์„ ์ง€์ •ํ•˜์—ฌ provider๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค

public init()์„ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ๊ธฐ๋ณธ init์ด internal์ด๊ธฐ ๋•Œ๋ฌธ! (internal์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ดˆ๊ธฐํ™”๊ฐ€ ์•ˆ๋จ)

 

 

๋‹ค์Œ์œผ๋กœ ์ƒ๊ฐํ•œ๊ฒƒ์€ request

๋ชจ๋“  NetworkManager๋Š” ๋ถ„๋ช…ํžˆ request๊ฐ€ ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ์ฃผ๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ๋ญ˜ ๊ณ ๋ คํ•ด์•ผ ํ• ๊นŒ?

 

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ DTO์˜ ์ œ๋„ค๋ฆญ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค DTO๊ฐ€ ๋“ค์–ด์™€๋„ parsing ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ƒ๋‹นํ•œ ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค!!

๊ทธ๋ฆฌ๊ณ  APIResponder์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญํ•œ DTO๋ฅผ parsingํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๊ทผ๋ฐ ์ด๊ฑด rxMoya๊ฐ€ ํ•ด์ค„๊ฑฐ๋‹ˆ๊นŒ ์ƒ๋žตํ• ๊ฒŒ์š”!

 

APIResponder์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ ์€ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ์š”,

ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ƒํƒœ์ฝ”๋“œ 200, 201๋กœ ์•Œ๋ ค์ฃผ๋Š”๋ฐ

์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋‹ˆ Oauth ์ดํ›„์— ๊ธฐ๋ณธ์ •๋ณด ์ž…๋ ฅํ™”๋ฉด์œผ๋กœ ๊ฐˆ๊ฒƒ์ธ์ง€, ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ๊ฐˆ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜๊ฐ€ ์—†์–ด์š”

๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ์ƒํƒœ์ฝ”๋“œ๊นŒ์ง€ ํ•จ๊ป˜ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ ํ–ˆ์Šต๋‹ˆ๋‹ค

 

SuccessDTO๋Š” Result์—์„œ ๋ฐ˜ํ™˜ํ•ด์ค„ ๊ฐ’์ž…๋‹ˆ๋‹ค

๊ธฐ์กด์˜ data์—์„œ code(์ƒํƒœ์ฝ”๋“œ)๊ฐ€ ์ถ”๊ฐ€๋œ struct์ž„!

public struct SuccessDTO<DTO: Decodable> {
    public let code: Int
    public let data: DTO?
}

 

๋ชจ๋“ ๊ฑธ ๊ณ ๋ คํ•ด์„œ ๋งŒ๋“  BaseNetworkManager์˜ ๋ชจ์Šต!

์ƒ๋‹นํžˆ ์ œ๋„ค๋ฆญ..

open class BaseNetworkManager<Target : TargetType>{
    let provider = MoyaProvider<Target>()
    
    public init() {}
    
    public func request<DTO: Decodable>(_ type: Target) -> Single<Result<SuccessDTO<DTO>, Error>> {
        return provider.rx.request(type)
            .map {
                let response = try $0.map(ResponseDTO<DTO>.self)
                if response.success {
                    return .success(SuccessDTO(code: $0.statusCode, data: response.data))
                }
                else{
                    return .failure(response.error!)
                }
            }
    }
}

 

๋‹ค์–‘ํ•œ DTO์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๋„ค๋ฆญํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ ,

์–ด๋– ํ•œ Target์„ ๋ฐ›์•„ ์ƒํƒœ์ฝ”๋“œ+๋ฐ์ดํ„ฐ ๋˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋–„ Error๋ฅผ return

 

๊ทธ๋ฆฌ๊ณ  ์š” ๋ถ€๋ถ„์ด APIResponder์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ๋Œ€์‹  ํ•ด์ค„๊ฒƒ์ž„!

let response = try $0.map(ResponseDTO<DTO>.self)

 

 

๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ Login๋ชจ๋“ˆ์— ์ ์šฉ์„ ํ•ด๋ณด์•„์š”

class LoginNetworkManager : BaseNetworkManager<LoginProvider> {
    
    func login(_ type: LoginProvider) -> Single<Result<SuccessDTO<LoginDTO>,Error>> {
        return request(type)
    }
    
    func enterInfo(_ userInfo: PreUserInfo) -> Single<Result<SuccessDTO<Bool?>, Error>> {
        return request(.enterInfo(preUserInfo: userInfo))
    }
}

์ด๋Ÿฐ์‹์œผ๋กœ APIํ†ต์‹ ์„ ํ•˜๋Š” ๋ชจ๋“ˆ๋งˆ๋‹ค ํ•˜๋‚˜์˜ NetworkManager๋ฅผ ๊ฐ€์ง€๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค

์—ฌ๊ธฐ์„œ๋Š” LoginProvider๋ฅผ Targetํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

 

๋‘๊ฐœ์˜ request๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ฐ๊ฐ login, enterInfo์ด๊ณ ,

๊ธฐ์กด์— ์ œ๋„ค๋ฆญํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋‘” request๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ €๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!!

 

 

 

swift์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ•œ ์ œ๋„ค๋ฆญ์„ ๋„๋ฐฐํ•ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NetworkManager๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค :)

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ ๋„คํŠธ์›Œํฌ ๋กœ์ง ๋ถ„๋ฆฌ๋„ ๋˜๊ณ  ์ข‹๋„ค์š” ๐Ÿ™ƒ

 

 

์ข‹์€ ์˜๊ฒฌ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š” :)

 

 

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“ฑ iOS > Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

UserDefaults ๊ฐ’ ํ•˜๋‚˜๋กœ ์•ฑ ์ง„์ž…์‹œ 1ํšŒ๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง ๊ด€๋ฆฌํ•˜๊ธฐ  (0) 2024.06.20
[Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ  (0) 2023.03.23
[Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ  (0) 2023.02.12
[RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)  (0) 2023.02.04
[Swift] Custom Calendar ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚  ๊ตฌํ•˜๊ธฐ  (0) 2023.01.16
    '๐Ÿ“ฑ iOS/Base' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • UserDefaults ๊ฐ’ ํ•˜๋‚˜๋กœ ์•ฑ ์ง„์ž…์‹œ 1ํšŒ๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋กœ์ง ๊ด€๋ฆฌํ•˜๊ธฐ
    • [Swift] ์„œ๋ฒ„์— iOS ์ด๋ฏธ์ง€ ๋ณด๋‚ผ ๋•Œ ์šฉ๋Ÿ‰ ์ด์Šˆ & ํ•ด๊ฒฐ
    • [Swift] json value type์ด ๋‹ฌ๋ผ์ง€๋Š” response์— ๋Œ€์‘ํ•˜์—ฌ API Responder๋งŒ๋“ค๊ธฐ
    • [RxSwift] ๊ฐœ๋…์žก๊ธฐ (Subscribe, Observable, Subject)
    sladuf
    sladuf

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”