본문 바로가기
Project/NETFLIX

NETFLIX CLONE 5편 (TMDB 사이트 방문, 데이터 모델 구축)

by 밤새는탐험가 2024. 5. 7.

 

✅ TMDB 사이트 방문

✅ TMDB 사이트에서 API를 호출하는 함수 구현

✅ 함수로 불러온 정보를 토대로 데이터모델 구축 

 


✅ TMDB 사이트 방문

  • 회원가입 후 개인 설정 -> API 부분의 값 확인 
  • Managers 폴더 내에 APICaller 이라는 이름의 swift 파일 생성 
import Foundation

struct Constants {
    static let API_KEY = "678025f9b853729922748d16feb442f9"
}



class APICaller {
    static let shared = APICaller()
}

 

 

  • 아래 사이트 방문하여 trending 이라는 조건에 대한 결과 확인 

https://developer.themoviedb.org/reference/trending-people

 

People

Get the trending people on TMDB.

developer.themoviedb.org

 

 

 

  • APICaller 파일 내에 Constants에 URL 등의 값을 입력한다. 
struct Constants {
    static let API_KEY = "678025f9b853729922748d16feb442f9"
    static let baseURL = "https://api.themoviedb.org/"
}

 

 

  • APICaller 클래스 내에 API 정보를 얻어올 메서드 설정 
class APICaller {
    static let shared = APICaller()
    
    func getTrendingMovies(completion: @escaping (String) -> Void) {
        
        guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
        
        let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
            guard let data = data, error == nil else { return }
            
            do {
                let results = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
                print(results)
            } catch {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }
}

 

 

  • 홈뷰컨트롤러에 들어가서 APICaller 내의 getTrendingMovies가 정상 동작하는지 확인한다. 
    // API를 통해 영화정보 얻어오기
    private func getTrendingMovies() {
        APICaller.shared.getTrendingMovies { _ in

        }
    }

 

  • 위에서 작성한 함수를 viewDidLoad() 메서드 내에서 호출한다. 
   override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .systemBackground
        
        
        view.addSubview(homeFeedTable)
        
        
        homeFeedTable.delegate = self
        homeFeedTable.dataSource = self
        
        configureNavbar()
        
        getTrendingMovies()
        
        // homeFeedTable의 헤더 공간 만들기
        let headerView = HeroHeaderUIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 450))
        homeFeedTable.tableHeaderView = headerView
    }

 

  • 앱을 실행하고 콘솔창을 확인한다. 

 

 

  • 위에서 출력된 내용을 토대로 데이터 모델을 생성한다. 
  • Models 폴더 안에 Movie 라는 스위프트 파일을 만든다. 
import Foundation


struct TrendingMoviesResponse: Codable {
    let results: [Movie]
}

struct Movie: Codable {
    let id: Int
    let media_type: String?
    let original_name: String?
    let original_title: String?
    let poster_path: String?
    let vote_count: Int
    let release_date: String?
    let vote_average: Double
}

 

 

  • APICaller 클래스 내에 getTrendingMovies 메서드를 위해 작성한 데이터 모델 타입으로 결과를 반환할 수 있도록 코드를 수정한다.다.
class APICaller {
    static let shared = APICaller()
    
    func getTrendingMovies(completion: @escaping (String) -> Void) {
        
        guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
        
        let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
            guard let data = data, error == nil else { return }
            
            do {
                let results = try JSONDecoder().decode(TrendingMoviesResponse.self, from: data)
                print(results)
            } catch {
                print(error.localizedDescription)
            }
        }
        task.resume()
    }
}

 

 

 

  • 스위프트의 result를 통해 코드를 간결화한다. 
  • APIError 열거형을 생성한다. 
enum APIError: Error {
    case failedTogetData
}

 

  • APICaller 클래스 내의 getTrendingMovies 메서드를 result 구문으로 사용할 수 있도록 수정한다. 
class APICaller {
    static let shared = APICaller()
    
    func getTrendingMovies(completion: @escaping (Result<[Movie], Error>) -> Void) {
        
        guard let url = URL(string:"\(Constants.baseURL)3/trending/all/day?api_key=\(Constants.API_KEY)") else { return }
        
        let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
            guard let data = data, error == nil else { return }
            
            do {
                let results = try JSONDecoder().decode(TrendingMoviesResponse.self, from: data)
                completion(.success(results.results))
            } catch {
                completion(.failure(error))
            }
        }
        task.resume()
    }
}

 

 

  • 홈뷰컨틀로러에서 생성한 getTrendingMovies 메서드를 수정한다. 
    private func getTrendingMovies() {
        APICaller.shared.getTrendingMovies { results in
            switch results {
                
            case.success(let movies):
                print(movies)
            case.failure(let error):
                print(error.localizedDescription)
            }
        }
    }

 

 

 

https://youtu.be/IhUz6tTT7zI?si=abhJfwBam60jd4KI