[Library] Moya #2 - request-parameter, request-query 이해하기

2022. 1. 12. 23:03Framework, Library

서버 선배와 Moya 선배 처음 공부하기 너무 어려웠다.

하지만 어떻게 하겠노...무조건 성장하기 위해서... 공부해야지.....

오늘은 또 하나 헷갈리는 개념이었던 request-parameter와 request-query 내용을 각각 Moya 라이브러리에서 어떻게 사용하는지, 두 차이점은 어떻게 되는지에 대해서 정리해보도록 하겠다.

(👇🏻Moya 라이브러리를 정리해둔 글은 아래에 있습니다 ^___^)

 

[Library] Alamofire의 단점을 보완한 네트워킹 라이브러리, Moya

1️⃣ Moya? 보통 iOS에서 네트워킹을 구현할 때는 URLSession을 사용하게 된다. 그리고 그 URLSession을 이용한 네트워킹을 조금 더 간편하기 위해, 앞에서도 다룬 적이 있는 Alamofire 라이브러리를 보편

mini-min-dev.tistory.com

 

1. request-parameter..? request-query..?


둘 다 request가 들어있다는 점에서 뭔가 서버에게 rquest(요청)를 할 때, 사용하는 것 같은데....

우선, request-parameter, request-query가 각각 무엇인지 개념부터 알고 가자.

- request-parameter: URI 주소에 포함하는 변수를 담는 방식
    (예시: API 문서 상, https://minjae-server.o-r.kr/:user-id/login 주소가 있다면 :이 있는 user-id 부분이 해당)

- request-query: URI 주소 바깥 부분(? 이후)의 변수를 담는 방식
    (예시: API 문서 상, https://minjae-server.o-r.kr/groups?user-id 주소가 있다면 ?가 있는 user-id 부분이 해당)

아직 감이 잘 안 오는가? 그럼 이제 본격적으로 코드 예시를 살펴보면서 하나씩 알아보도록 하자!

 

2. request-parameter Moya에서 사용하기


앞에서 말했지만, request-parameter 방식은 URL 주소에 보낼 데이터를 함께 실어서 보내는 방식이다.

request-parameter 방식이니, 정말 정말 아주 단순하게 파라미터로 값을 받아 실어 보내면 된다.
조금 자세하게 말하면, 파라미터로 값을 받아 Service 코드에서 path 안에다가 값을 주소대로 실어서 보내면 되는 방식이다!! (정말 쉽다)

대신, 중요한 점은 task 부분(request에 사용되는 파라미터 설정)은 .requestPlain 방식을 사용한다는 점!
(🔥완전 중요🔥 requestParameters 방식이 아니다)

말로만 들어서 감이 안오니, 직접 아래 Service 부분을 코드로 확인해보자. (path와 task 부분 중요하게 확인하기!)

import Foundation
import Moya

enum UserSevice {
    case userIDFetch(userID: String)
}

extension UserSevice: TargetType {

    var baseURL: URL {
        return URL(string: Const.URL.baseURL)!
    }
    
    var path: String {
        switch self {
        case .userIDFetch(let userID):
            return "/\(userID)/login"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .userIDFetch:
            return .get
        }
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        switch self {
        case .userIDFetch:
            return .requestPlain
        }
    }
    
    var headers: [String: String]? {
        switch self {
        case .userIDFetch:
            return ["Content-Type": "application/json"]
        }
    }
}

 

3. request-query Moya에서 사용하기


이번에는 request-query, Query String 방법에 대해서 알아보자.

역시 원하는 데이터를 URL 주소에 함께 실어보낸다는 점에서는 request-parameter 방식과 유사하지만, 그 형태와 방법에서는 차이가 있다.

공통 baseURL과 넘겨야 하는 값 사이에는 "?" 연산자로 구분을 하게 되며,
파라미터가 여러 개일 경우에는 "&"를 붙여서 여러 개의 값을 넘길 수도 있다.

path 부분에서 파라미터로 값을 추가해준 위 방식과는 다르게, 여기서는 task 부분(request에 사용되는 파라미터 설정)에서의 별도 처리가 필요하다.

.requestParameters로 매개 변수를 전달하고, encoding 유형을 URLEncoding.queryString으로 지정해주자.
이 형식으로 서버를 호출해주면, 자동으로 URL이 '?', '&' 형태로 구성되기 때문에 원하는 서버 통신을 할 수 있다.

이 역시도 말로만 들으면 감이 안오니, 직접 아래 Service 부분을 코드로 확인해보자. (task 부분만 중요하게 확인하기!)

import Foundation
import Moya

enum GroupService {
    case groupListFetch(userID: String)
}

extension GroupService: TargetType {
    var baseURL: URL {
        return URL(string: Const.URL.baseURL)!
    }
    
    var path: String {
        switch self {
        case .groupListFetch:
            return "/groups"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .groupListFetch:
            return .get
        }
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        switch self {
        case .groupListFetch(let userID):
            return .requestParameters(parameters: ["userId": userID],
                                      encoding: URLEncoding.queryString)
        }
    }
    
    var headers: [String: String]? {
        switch self {
        case .groupListFetch:
            return ["Content-Type": "application/json"]
        }
    }
}

 

4. request-parameter와 request-query를 함께 사용하고 싶을 때는?


그러면 두 방법을 모두 사용해야 할 때는 어떻게 사용할까?

예를 들어, API 문서의 주소가 https://minjae-server.o-r.kr/group/:group-id?defaultGroupId와 같은 형태라고 가정을 해보자.
그러면, group-id는 request-parameter 방식, defaultGroupId는 request-query 방식이 필요할 것이다.

여기서의 가장 핵심은 request-parameter 방식에서의 path와, request-query 방식에서의 task를 각각 처리를 해주면서 각 부분에서 사용하지 않는 파라미터를 "_"로 받는다는 점이다.

이 역시도 코드로 확인해보자 ^__^

import Foundation
import Moya

enum GroupService {
    case groupDelete(groupID: Int, defaultGroupId: Int)
}

extension GroupService: TargetType {
    var baseURL: URL {
        return URL(string: Const.URL.baseURL)!
    }
    
    var path: String {
        switch self {
        case .groupDelete(let groupID, _):
            return "/group/\(groupID)"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .groupDelete:
            return .delete
        }
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        switch self {
        case .groupDelete(_, let defaultGroupId):
            return .requestParameters(parameters: ["defaultGroupId": defaultGroupId],
                                      encoding: URLEncoding.queryString)
        }
    }
    
    var headers: [String: String]? {
        switch self {
        case .groupDelete:
            return ["Content-Type": "application/json"]
        }
    }
}

 

5. 정리해보자!


Moya 라이브러리를 사용하면서, request-parameter와 request-query를 처리해주는 방법은 크게 어렵지 않았다.

Service 파일 부분을 처리해주면 되는데, 
URL 주소 상, ":"으로 표시된 부분은 path에서 파라미터로 값을 받아 그대로 데이터를 넘겨주는, request-parameter 방식
"?"와 "&"으로 표시된 부분은 task에서 .requestParameters와 encoding을 활용하는 request-query 방식이라 정리하면 되겠다.

 

Request param,query, body 의 차이점

Request 객체는 API를 컨트롤하기 위한 메소드를 셋 담고 있다.

medium.com

 

[iOS] Query String 이란?

AppJam 회고 - 01

juhyeoklee.github.io

 

Query String에 대해 알아보자 ! - 야곰닷넷

제가 맡은 뷰에서는 서버에서 주어진 조건에 맞는 데이터를 불러올 일이 있었습니다. 예를 들어 제품의 최상위 […]

yagom.net

 

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

 

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