[iOS] 콜렉션뷰 Youtube API 활용 #2

2024. 6. 6. 14:17· iOS
목차
  1. 구현 설명 및 사전 작업
  2. Moya 설치
  3. 구현 (Request)
  4. TargetType Protocol
  5. VideoAPI TargetType 채택

구현 설명 및 사전 작업

안녕하세요 노움 입니다.

 

오늘은 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를 진행 했습니다.

 

Untitled

 

Untitled

Project 파일 밑에 Package Dependencies 디렉토리가 추가되고 그 내에 Moya 라이브러리가 포함되어 있다면 성공입니다!!

Untitled

구현 (Request)

Moya 라이브러리 사용

import Moya

사용하고자 하는 API Reference를 Google Developers에서 찾아야합니다. 저의 경우 Video 정보를 가져올 수 있는 Video API를 선택하게 되었습니다.

video 리소스는 YouTube 동영상을 나타냅니다.

이 글을 읽고 다른 API 기능들을 사용하고 싶으신 분들을 아래 사이트를 참조하여 원하시는 요청 메서드를 기반으로 프로토콜을 구현해주시면 됩니다.

API Reference | YouTube Data API | Google for Developers

 

Untitled

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등등 이에 대한 경로는 아까 제가 올려둔 사이트에서 확인이 가능합니다

 

Untitled

아래 코드는 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
  1. 구현 설명 및 사전 작업
  2. Moya 설치
  3. 구현 (Request)
  4. TargetType Protocol
  5. VideoAPI TargetType 채택
'iOS' 카테고리의 다른 글
  • [iOS] 콜렉션뷰 Youtube API 활용 #1
  • [iOS] CompositionalLayout을 한번 사용해보자 #3
  • [iOS] CompositionalLayout을 한번 사용해보자 #2
  • [iOS] CompositionalLayout을 한번 사용해보자 #1
쥐노움
쥐노움
AI로부터 살아남는 개발자 되기
그놈의 이놈 저놈AI로부터 살아남는 개발자 되기
쥐노움
그놈의 이놈 저놈
쥐노움
전체
오늘
어제
  • 분류 전체보기 (16)
    • Embedded (0)
    • iOS (11)
    • Android (4)
    • 소프트웨어 (1)
      • 디자인 패턴 (0)
      • 아키택처 (0)
      • 독서 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • compostional layout
  • CompositionalLayout
  • AOS
  • 새싹 #프로젝트
  • Android
  • 소들
  • 객사오
  • 독서
  • 제토
  • 새싹
  • app
  • URLSession
  • collectionview
  • 소셜 로그인
  • swift
  • YouTube API
  • Jane초이
  • ios
  • API Key
  • 프로젝트

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
쥐노움
[iOS] 콜렉션뷰 Youtube API 활용 #2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.