์ง๋๋ฒ์ ์ด๋ฐ ๊ธ์ ์ผ์๋๋ฐ,
https://990427.tistory.com/112
์ํ ์ฝ๋๋ฅผ ๋ฐ์ ์ ์๋ค๋ ๋ฌธ์ ์ ๋ ์์๊ณ ,
๋ชจ๋๋ง๋ค ๋ค ๋ค๋ฅธ 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๋ฅผ ๋ง๋ค์ด ๋ณด์์ต๋๋ค :)
์ด๋ ๊ฒ ํ๋ ๋คํธ์ํฌ ๋ก์ง ๋ถ๋ฆฌ๋ ๋๊ณ ์ข๋ค์ ๐
์ข์ ์๊ฒฌ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์ :)