구현 설명 및 사전 작업
안녕하세요 노움 입니다.
오늘은 Youtube API
를 사용하기 위해서 iOS에서 지원하는 HTTP
통신을 진행해보려고 합니다.
우선 HTTP
란 HTTP(Hypertext Transfer Protocol)이라는 것의 약어로 웹기반에서 수행되는 서버 - 클라이언트 관계의 통신 프로토콜을 말하는데요.
예를 들어서 설명을 드리자면 웹(서버) ↔ 앱(클라이언트) 간의 통신 규약이라고 볼수가 있습니다.
Swift에서는 HTTP
통신을 지원하는 라이브러리 URLSession
API를 지원해주는데 URLSession
에 대한 구현 방법에 대하여 간략하게 설명드리자면
1: URL Request 객체 생성
2: URL Session 객체 생성
3: URL Session Task 객체 생성
4: Task 실행
5: 응답 처리
순으로 간단하게 구현이 가능합니다.
저는 이번에 URLSession
의 기능을 추상화한 API를 사용해보려고 하는데요. Moya
라는 서드 파티 라이브러리를 사용해보려고 합니다.
Moya
를 사용하는 이유는 복잡할 수 있는 URLSession의 구현 과정을 간편화 할 수 있으며 URLSession 라이브러리를 추상화 하여 코드를 더욱 간결하고 직관적으로 작성할 수 있기 때문입니다.
Moya 설치
Moya를 설치하기 위해서는 2가지 방법이 있는데요
CocoaPods를 이용하여 Moya를 설치하는 방법과 Swift Package Manager를 사용하는 방식이 있습니다.
저는 이 2개중에서 Swift Package Manager를 사용해보려고 해요.
추가하는 방법은 아래처럼 프로젝트 파일에 접근하여 Package Dependencies파일을 열고 패키지에 + 버튼을 클릭합니다
그럼 seach
항목에 추가하고자 하는 라이브러리를 검색하면 되는데 저의 경우 moya
라이브러리를 사용할 것이기 때문에 moya
를 검색후 Add Package
를 진행 했습니다.
Project 파일 밑에 Package Dependencies 디렉토리가 추가되고 그 내에 Moya 라이브러리가 포함되어 있다면 성공입니다!!
구현 (Request)
Moya 라이브러리 사용
import Moya
사용하고자 하는 API Reference를 Google Developers에서 찾아야합니다. 저의 경우 Video 정보를 가져올 수 있는 Video API를 선택하게 되었습니다.
video
리소스는 YouTube 동영상을 나타냅니다.
이 글을 읽고 다른 API 기능들을 사용하고 싶으신 분들을 아래 사이트를 참조하여 원하시는 요청 메서드를 기반으로 프로토콜을 구현해주시면 됩니다.
API Reference | YouTube Data API | Google for Developers
VideoAPI
중 swift의 CollectionView의 list 아이템에 업데이트를 하기 위한 메서드 list
를 선택후 아래와 같이 enum 코드로 작성해줍니다.
enum을 사용한 이유는 해당 API의 다른 메서드를 호출하는 경우 추상화 라이브러리인 Moya
를 사용했기 때문에 이에 대한 HTTP
요청 방식의 변경을 간편하게 할 수 있기 때문 입니다.
위 방식을 통해 각 메서드 마다 request
를 만들어낼 필요를 없애버릴수 있습니다.
enum VideoAPI {
case insert(VideoListRequest) // post
// list만 사용해볼 예정
case list(VideoListRequest) // get
case delete(VideoListRequest) // delete
case update(VideoListRequest) // put
}
video API를 확인 해보면 post, get, delete, put … 등등 다양한 HTTP 요청 방식이 존재하는데 이것들에 대한 차이는 구글링을 통해 확인해 보시면 됩니다.
저는 list
를 활용하고자 하며 이는 HTTP 요청 방식중 GET
요청에 해당됩니다.
Moya 라이브러리를 활용하기 위해서는 아래 프로토콜을 채택해야 하는데
TargetType Protocol
/// The protocol used to define the specifications necessary for a `MoyaProvider`.
public protocol TargetType {
/// The target's base `URL`.
var baseURL: URL { get }
/// The path to be appended to `baseURL` to form the full `URL`.
var path: String { get }
/// The HTTP method used in the request.
var method: Moya.Method { get }
/// Provides stub data for use in testing. Default is `Data()`.
var sampleData: Data { get }
/// The type of HTTP task to be performed.
var task: Task { get }
/// The type of validation to perform on the request. Default is `.none`.
var validationType: ValidationType { get }
/// The headers to be used in the request.
var headers: [String: String]? { get }
}
public extension TargetType {
/// The type of validation to perform on the request. Default is `.none`.
var validationType: ValidationType { .none }
/// Provides stub data for use in testing. Default is `Data()`.
var sampleData: Data { Data() }
}
- baseURL: 네트워크 요청의 기본 URL을 정의합니다.
- path: 엔드포인트의 상대 경로를 지정합니다.
- method: HTTP 메서드(GET, POST, PUT, DELETE 등등)를 설정합니다.
- sampleData: 테스트 및 디버깅을 위한 샘플 데이터를 제공합니다.
- task: 요청 시 전송할 데이터(parameters, encoding 등)을 정의합니다.
- validationType: 응답에 대한 에러처리 및 유효성을 검사합니다.
- headers: 요청하고자 하는 헤더를 설정합니다.
이 중에서 TargetType의 extension으로 이미 초기화가 되어진 프로퍼티를 제외하고는 해당 프로토콜을 채택하는 모든 타입에서는 baseURL, path, method 등의 프로퍼티를 선언해야 합니다.
VideoAPI TargetType 채택
아래는 VideoAPI Type에 TargetType 프로토콜을 채택하는 소스 코드입니다. URL은 Youtube data API에 가장 기본이 되는 URL을 입력하고 path등등 이에 대한 경로는 아까 제가 올려둔 사이트에서 확인이 가능합니다
아래 코드는 list
메서드를 사용하기 위해서 설정된 코드기 때문에 다른 메서드 사용의 경우 API 가이드를 새로 참고하셔 확인후 진행하시길 바랍니다.
extension VideoAPI: TargetType {
var baseURL: URL {
return URL(string: "https://www.googleapis.com/youtube/v3")!
}
var path: String {
switch self {
case .insert:
return "/videos"
case .list:
return "/videos"
case .delete:
return "/videos"
case .update:
return "/videos"
}
}
var method: Moya.Method {
switch self {
case .insert:
return .post
case .list:
return .get
case .delete:
return .delete
case .update:
return .put
}
}
var task: Moya.Task {
switch self {
case .insert(_):
return .requestPlain
case .list(_):
return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
case .delete(_):
return .requestPlain
case .update(_):
return .requestPlain
}
}
var parameters: [String: Any] {
switch self {
case .insert(_):
return [:]
case .list(let param):
let params = [
"part" : param.part,
"chart" : param.chart,
"maxResults" : param.maxResults,
"key" : apiKey,
] as [String : Any]
return params
case .delete(_):
return [:]
case .update(_):
return [:]
}
}
var headers: [String : String]? {
return [
"Content-Type": "application/json",
]
}
private var apiKey: String {
return "USER_API_KEY" // USER_API_KEY에 사용자 전용 Youtube API KEY를 입력
}
}
swift의 enum은 연관 값(Associated Value)라는 기능을 제공 해주는데 연관 값이란 enum내 정의된 case에 값을 저장하여 사용할 수 있는 것을 말합니다.
enum VideoAPI {
case insert(VideoListRequest) // post
// list만 사용해볼 예정
case list(VideoListRequest)
....
}
extension VideoAPI: TargetType {
....
case .list(let param):
let params = [
"part" : param.part,
"chart" : param.chart,
"maxResults" : param.maxResults,
"key" : apiKey,
] as [String : Any]
return params
....
}
이렇게 되면 Moya에서 제공하는 요청(request) 구현이 완료됩니다.
'iOS' 카테고리의 다른 글
[iOS] 콜렉션뷰 Youtube API 활용 #1 (2) | 2024.06.03 |
---|---|
[iOS] CompositionalLayout을 한번 사용해보자 #3 (0) | 2024.05.29 |
[iOS] CompositionalLayout을 한번 사용해보자 #2 (0) | 2024.05.18 |
[iOS] CompositionalLayout을 한번 사용해보자 #1 (0) | 2024.05.13 |
[iOS] Concurrency(async & await) (0) | 2024.03.31 |