์๋ ํ์ธ์~
์ค๋์ ๊ธฐ์กด ํ๋ก์ ํธ์ ์๋กญ๊ฒ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ
Moya ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด์ ์ ๋ฆฌํด ๋ณผ๊น ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋งํฌ์ ๋๋ค : - )
GitHub - Moya/Moya: Network abstraction layer written in Swift.
Network abstraction layer written in Swift. Contribute to Moya/Moya development by creating an account on GitHub.
github.com
๊นํ๋ธ์ ๊ฐ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค.
์ด ์ด๋ฏธ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธ์ด ์ ํ์์ต๋๋ค.
๋น์ ์ ๋๋ํ ๊ฐ๋ฐ์์ ๋๋ค. ๋น์ ์ ์๋ง URLSession๊ณผ ์ ๊ฒฝ ์ฐ์ง ์๋ ๋ชจ๋ ๋ถ์พํ ์ธ๋ถ ์ฌํญ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ถ์ํํ๊ธฐ ์ํด Alamofire๋ฅผ ์ฌ์ฉํ ์ง๋ ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ํ ๊ฐ๋ฐ์ ๋คํธ์ํฌ ์ถ์ํ ๊ณ์ธต์ ์์ฑํ ๊ฒ๋๋ค. "APIManager" ๋๋ "NetworkModel"๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ํ์ง๋ง ์ด ์์ ์ ํญ์ ๋๋ฌผ๋ก ๋์ด ๋ ๊ฒ๋๋ค.
- Moya README.md
์ฝ๋ค๋ณด๋ ์ ๊ฒฝํ๋ด์ ๋์ด๋์ ๊ฒ ๊ฐ์์ ๋ง์์ด ์ํ ์ต๋๋ค.
Alamofire๋ฅผ ์ฌ์ฉํ๊ณ ์์์ง๋ง
์ฃผ๋ณ์ Moya๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ ๋ถ๋ค๋ ์์ด
์ด๋ฒ ๊ธฐํ์ ์ ๋ ๊ฐ๋จํ๊ฒ๋ผ๋ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์ตํ๊ณ ๊ฐ๋ ค๊ณ ํฉ๋๋ค.
๊ฐ๋จํ ์ค๋ช
๋คํธ์ํฌ ํต์ ์ ์ํด URLSession์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ง๋ง Moya ๋ผ์ด๋ธ๋ฌ๋ฆฌ README์์ ๋ดค๋ ๊ฒ์ฒ๋ผ ๋ณต์กํ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ฉฐ ์ถ์ํ๋ฅผ ์ํด ์ ์ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ ํํ๊ฒ ๋๋ ๊ฒ ๊ฐ์ฅ ์ ์๋ ค์ง Alamofire์ ๋๋ค.
ํ์ง๋ง ์ ์ง๋ณด์์ ์ ๋ ํ ์คํธ๊ฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์์ด
์ด๋ฅผ ์กฐ๊ธ ๋ ์ถ์ํ์์ผ ํ์ํ ๊ฒ์ด ๋ฐ๋ก๋ฐ๋ก Moya๋ผ๊ณ ํฉ๋๋ค.
(์ถ์ํ) (์ถ์ํ)
๊ฒฐ๋ก : URLSession -> Alamofire -> Moya
์ฌ์ฉ๋ฐฉ๋ฒ
1. ์ด๊ฑฐํ์ ํ๋ ์์ฑํด ์ฃผ์ธ์. ์ฌ์ฉ๋ Target๋ค์ ์์ฑํ ๊ฒ๋๋ค.
- ํ์ํ ๋งค๊ฐ๋ณ์๊ฐ ์๋ค๋ฉด ํจ๊ป ๊ธฐ์ ํ์๋ฉด ๋๊ณ ํ์ ์๋ค๋ฉด ์ ์ง ์์ผ์ ๋ ๋ฉ๋๋ค.
- User๊ด๋ จ API๊ฐ ์๋ค๋ฉด UserTarget ๋ฑ ๊ฐ๊ฐ์ ์กฐ๊ฑด์ ๋ง๊ฒ ํ๊ฒ์ ์ค์ ํ์๋ฉด ๋ฉ๋๋ค.
//DefaultTarget์ ๋ฌด์ํ์
๋ ๋ฉ๋๋ค!
enum UserTarget : DefaultTarget {
case getUser(idToken : String) //์ ์ ์ ๋ณด
case signupUser(idToken: String,SignupParameter) //ํ์๊ฐ์
case withdrawUser(idToken: String) //ํ์ํํด
case updateMypage(idToken: String,MypageParameter) //๋ด์ ๋ณด ์
๋ฐ์ดํธ
case updateFCMToken(idToken: String,FCMtokenParameter) //FCMํ ํฐ ๊ฐฑ์
}
2. TargetType์ ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค.
- TargetType์ ์ฑํํ๊ณ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ๋ ํ๋กํผํฐ๋ค์ด ๋์ต๋๋ค.
extension UserTarget : TargetType {
var baseURL: URL { }
var path: String { }
var method: Method { }
var task: Task { }
var headers: [String : String]? { }
}
ํ์์ Alamofire๋ฅผ ์ฌ์ฉํ ๋
๋ฐ๋ก ๋ชจ๋ํ๋ฅผ ์งํํ๋ ํ๋กํผํฐ๋ค์ ํ ๋ฒ์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์ฃผ๋ ํ๋กํ ์ฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ ๊ฒ ๊ฐ์ต๋๋ค.
Moya์์๋ MoyaProvider <TargetType>์ผ๋ก request๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ํด๋น ํ๋กํ ์ฝ์ ๋ฐ๋์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ค ๊ฑฐ์์.
โปmethod ๋ถ๋ถ์ Moya.Method๋ก ํ์
์ ๋ณํํด ์ฃผ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค
๊ฐ ํ๋กํผํฐ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- baseURL: ์๋ฒ์ endpoint ๋๋ฉ์ธ
- path: ๋๋ฉ์ธ ๋ค์ ์ถ๊ฐ๋ ๊ฒฝ๋ก
- method: HTTP method
- task: request์ ์ฌ์ฉ๋ ํ๋ผ๋ฏธํฐ. requestPlain: no param,. requestParameters(parameter:, encoding:)
- headers: HTTP Header
์ ๋ฆฌํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
//์์๋ฅผ ์ํด์ ๋๊ฐ๋ง ์ ์ด๋ณผ๊ฒ์!
extension UserTarget : TargetType {
//BaseURL
var baseURL: URL {
return URL(string: "http://www.naver.com")!
}
//Path
var path: String {
switch self {
case .getUser : return "user"
case .updateFCMToken : return "user/update_fcm_token"
}
}
//HTTP Method -> GET, POST, PUT, DELETE
var method: Moya.Method {
switch self {
case .getUser: return .get
case .updateFCMToken : return .put
}
}
//Task
var task: Task {
switch self {
case .getUser:
return .requestPlain
case .updateFCMToken(_,let parameter):
return .requestParameters(parameters: [
"FCMtoken": parameter.FCMtoken
], encoding: URLEncoding.default)
}
}
//Headers
var headers: [String : String]? {
switch self {
case .getUser(let idToken):
return [
"idtoken": idToken
]
case .updateFCMToken(let idToken,_):
return [
"idtoken": idToken,
"Content-Type": "application/x-www-form-urlencoded"
]
}
}
3. Request๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
RxSwift๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ Request๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
private let provider = MoyaProvider<UserTarget>()
provider.rx.request(.getUser(idToken: idToken))
.subscribe{ result in
switch result {
case .success(let response):
onCompletion(try? response.map(User.self),response.statusCode)
case .failure(let error):
onCompletion(nil,error.asAFError?.responseCode)
}
}
.disposed(by: disposeBag)
์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
provider.request(.getUser)) { result in
switch result {
case let .success(response):
onCompletion(try? response.map(User.self),response.statusCode)
case let .failure(error):
onCompletion(nil,error.asAFError?.responseCode)
}
}
Moya ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ๋จํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํด์ ์ ๋ฆฌํด ๋ดค์ต๋๋ค.
์ด๋ ต์ง ์๊ฒ ๊ตฌํํ ์ ์์๊ณ
Moya๊ฐ ์ฃผ๋ ๊ฐํธํจ๊ณผ ๊ฐ๋ ์ฑ์ด ์ข์ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค : - )
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] UICollectionView์์ Cell์ ์ผ์ชฝ ์ ๋ ฌ(Left Alignment) ํ๋ ๋ฐฉ๋ฒ (0) | 2022.02.14 |
---|---|
[Swift] ๋๋ ์คํ์์ค์ ๊ธฐ์ฌํด๋ณด๊ณ ์ถ๋ค (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ) (0) | 2022.02.08 |
[Swift] R.swift SPM์ผ๋ก ์ค์นํด๋ณด๊ธฐ (0) | 2022.02.06 |
[Swift] Foundation Framework์ ๋ํด์ (0) | 2022.02.05 |
[Swift] URLSession์ ๋ํด์ ์์๋ณด์ (0) | 2021.12.24 |