๐ŸŽ iOS & Swift

[iOS] ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ†บ์•„๋ณด๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—(0)

taeeekki 2022. 11. 4. 00:51

์š”์ฆ˜ ๊ณต๋ถ€์˜ ์–ด๋А ์ •๋„ ์‹œ๊ฐ„์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ•™์Šต, ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด ์ถ”์ƒํ™”์— ๋Œ€ํ•œ ๊ฒƒ์„ ์—ฐ๊ตฌํ•ด๋ณด๊ณ  ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋งŒ์˜ ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ๊ธฐ์ค€๋„ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ์ค‘

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์€ ์ •๋ง ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์ด ๋‹ค๋ผ๋Š” ๊ฒƒ์„ ์š”์ฆ˜ ๋” ๊ฐ•ํ•˜๊ฒŒ ๋А๋‚€๋‹ค.

์Šค์Šค๋กœ ์ •๋ฆฌ๊ฐ€ ์–ผ์ถ” ๋˜๋ฉด, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์— ๋Œ€ํ•ด์„œ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ž์›(๋ฆฌ์†Œ์Šค)์ด ์žˆ๋Š” ์„œ๋ฒ„ ์ชฝ์— ์š”์ฒญํ•  ์š”์ฒญ์„œ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ€์ ธ์˜จ ์ž์›์„ ์•ฑ์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ํ•ด๋…ํ•˜๊ณ  ๊ฐ€๊ณตํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ ์ด๊ฒƒ์ด ๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์š”์ฒญ์„ ํ†ตํ•ด ์ž์›์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์“ฐ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ž…์žฅ์—์„œ๋Š” ์š”์ฒญ์ด ํŠนํžˆ๋‚˜ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋ณธ๋‹ค.

์š”์ฒญ์„œ์— ํ•„์š”ํ•œ ์ •๋ณด๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • URL(Path, Query ...) (ํ•„์ˆ˜)
  • HTTPMethod (ํ•„์ˆ˜)
  • HTTPHeader (๋ฐ˜ ํ•„์ˆ˜)
  • HTTPParameter (์„ ํƒ)
  • ๊ธฐํƒ€ ์ •๋ณด .. (timeout, caching policy, network connection ...)

๋‹ค์Œ์˜ ์ •๋ณด๋ฅผ ์ž˜ ์กฐํ•ฉ์‹œ์ผœ์„œ ์š”์ฒญ์„œ(์š”์ฒญ์ •๋ณด == URLRequest)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์— ์žˆ์–ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ ์‹ถ๋‹ค. ์ด๊ฒƒ๋งŒ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด ํ†ต์‹ ์€ 80~90% ๋์ด๋ผ๊ณ  ๋ณธ๋‹ค. (์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค. .)

Builder ํŒจํ„ด์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด๋ฅผ ์ถ”์ƒํ™” ํ•ด๋ด„

  • https://github.com/hmlongco/RequestBuilder
  • ์œ„์˜ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ Rx ํ˜•ํƒœ๋กœ ๋ณ€ํ™”์‹œ์ผœ๋ณด๋ ค๊ณ  ํ•จ.
  • BaseSessionManager.swift ํŒŒ์ผ ๋ถ€๋ถ„์—์„œ nil ๊ฐ’์ด ์ƒ๊ฒจ์„œ ์ •์ƒ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ–ˆ์Œ
    • LLDB๋กœ ์ด์Šˆ๋ฅผ ์กฐ๊ธˆ ๋น ๋ฅธ ์†๋„๋กœ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ์Œ. (print ์ฐ์—ˆ์œผ๋ฉด ๋‚  ๋ฐค ์ƒœ์„ ๋“ฏ)
  • Builder ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด SwiftUI ์ฒ˜๋Ÿผ ์„ ์–ธํ˜•์œผ๋กœ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๊ตฌ์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ.
    • Request์— ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค์ด ์–ด๋А ์ •๋„ ์ •ํ•ด์ ธ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ์ž˜ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์Œ.
    • ์ง€๊ธˆ์€ ์•„์ง ์™„๋ฒฝํžˆ ๊ตฌํ˜„์€ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ์• ๋งคํ•œ๋ฐ, ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋‚จ๊ธฐ๋ฉด ๊ดœ์ฐฎ๊ฒŒ ์ด์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Œ.
    • Alamofire, Moya ์ •๋ง ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ธ๋ฐ, ์ง€๊ธˆ ๋“œ๋Š” ์ƒ๊ฐ์€ ์ƒ๊ฐ๋ณด๋‹ค ์ •๋ง ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ ์“ฐ๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Œ. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค๊ณ  ๋ด„. (1) ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์ด ์–ด๋А ์ •๋„ ํ™•๋ณด๋˜์–ด์žˆ๊ฑฐ๋‚˜ (2) ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ํ•œ๋‹ค๋ฉด URLSession์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ถ”์ƒํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•จ. ๋ฌผ๋ก  ์ˆ™๋ จ๋„๊ฐ€ ์–ด๋А ์ •๋„ ์žˆ๊ฑฐ๋‚˜ ํ•œ๋‹ค๋ฉด Alamofire, Moya๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ๋Š” ์ข‹์•„๋ณด์ž„.

์‚ฌ์šฉ ์˜ˆ์‹œ

์ง€๊ธˆ์€ data ๋ฉ”์„œ๋“œ์˜ return ํƒ€์ž…์ด RxSwift์˜ Single Traits์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ์˜ˆ์‹œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์Œ. Combine๊ณผ๋„ ์„ž์–ด๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Œ

let base = URL(string: SeSACAPI.baseURL)
let sessionManager = BaseSessionManager(base: base, session: URLSession.shared)

sessionManager.request()
    .add(path: SeSACAPI.profile.path)
    .add(headers: SeSACAPI.profile.headers)
    .method(.get)
    .data(type: UserResponse.self, decoder: JSONDecoder())
    .subscribe { response in
        print(response)
        print("๐ŸŽŠ :: ํ”„๋กœํ•„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์„ฑ๊ณต :: \(response.user)")
    } onFailure: { error in
        print("๐Ÿ˜ฟ :: ํ”„๋กœํ•„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์‹คํŒจ :: \(error.localizedDescription)")
    }.disposed(by: disposeBag)

์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€

์ข€๋งŒ ๋” ์ •๋ฆฌ๋˜๋ฉด ๊ธฐ์กด์— ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธ€์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์•„๋‹Œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ๋Œ€๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๋ช‡ ํŽธ(๋ฏธ์ •)์˜ ๊ธ€๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. (ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€ ...? ^^)

 

์•„์šฐ.. ๊ทผ๋ฐ ๊ธ€ ์ด์ œ ์–ด๋–ป๊ฒŒ ์จ์•ผํ• ์ง€๋ฅผ ๋ชจ๋ฅด๊ฒ ๋„ค.. ์ผ๋‹จ ์ ๊ณ ๋ณด์ž..!! ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฉ”๋ชจํ•  ์ˆ˜ ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ํŒŒ์•ผ๊ฒ ๋‹ค.