์์ฆ ๊ณต๋ถ์ ์ด๋ ์ ๋ ์๊ฐ์ ๋คํธ์ํฌ ํต์ ๋ถ๋ถ์ ๋ํ ํ์ต, ๋คํธ์ํฌ ๋ ์ด์ด ์ถ์ํ์ ๋ํ ๊ฒ์ ์ฐ๊ตฌํด๋ณด๊ณ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ง์ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ ๊ธฐ์ค๋ ๊ณ ๋ฏผํด๋ณด๋ ์ค
๋คํธ์ํฌ ํต์ ์ ์ ๋ง ์์ฒญ(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)
์ค๋์ ์ฌ๊ธฐ๊น์ง
์ข๋ง ๋ ์ ๋ฆฌ๋๋ฉด ๊ธฐ์กด์ ๋ง์ด ๋ณผ ์ ์๋ ๊ธ์ฒ๋ผ ๋จ์ํ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ์ ๋ํ ๋ด์ฉ์ด ์๋ ๋ด๊ฐ ์ดํดํ๋๋ก ๋คํธ์ํฌ ํต์ ์ ๋ช ํธ(๋ฏธ์ )์ ๊ธ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. (ํ ์ ์๊ฒ ์ง ...? ^^)
์์ฐ.. ๊ทผ๋ฐ ๊ธ ์ด์ ์ด๋ป๊ฒ ์จ์ผํ ์ง๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค.. ์ผ๋จ ์ ๊ณ ๋ณด์..!! ๊ฐ๋จํ๊ฒ ๋ฉ๋ชจํ ์ ์๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํ๋ ํ์ผ๊ฒ ๋ค.