저번 포스팅에서는 api키를 발급받고 정상인지 확인해보는 과정까지 했습니다!
이번에는 실제로 코드에 적용해보는 과정입니다
저번 포스팅에서 영화 목록에 Now Playing, Popular등이 있었던 것 생각나시나요?
저는 이번에 예제로 Now Playing을 해보겠습니다
해당 항목을 들어가면 이렇게 나타나는데요
우측에 LANGUAGE
항목에서 우리가 사용하는 swift언어에 맞게 변경해줍니다!
그리고 마찬가지로 밑의 Try It! 버튼을 클릭해서 확인해 봅니다
데이터를 잘 받아오는거 같네요!
참고로 왼쪽에 language
부분에서 en-US
로 되어있으실텐데
ko-KR
로 변경하시면 한글 정보를 받아보실 수 있습니다
이제 데이터도 정상적으로 받아오는 것을 확인했으니 플레이그라운드에서
실제로 연습해보죠!
이렇게 생성되면 기본 코드는 우선 지워 줍니다!
자 우리가 데이터를 받아오면서 쓰고 싶은 특정 데이터가 있겠죠?
예를 들어 영화 이름, 장르, 포스터 등이 있을겁니다
api관련 부분을 작성하기에 앞서 정보를 담아주는 struct
부터 작성해줘야합니다
필요한 데이터는 영문제목, 국문제목, 줄거리, 포스터이미지경로, 평점이 있습니다
struct Movie: Decodable {
let originalTitle: String
let title: String
let overview: String
let posterPath: String?
let voteAverage: Double
enum CodingKeys: String, CodingKey {
case originalTitle = "original_title"
case title
case overview
case posterPath = "poster_path"
case voteAverage = "vote_average"
}
}
이와 같이 작성될 수 있겠네요
아래의 enum CodingKeys
부분은 실제 코드에서 사용되는 변수명과
받아오는 json데이터에서의 변수명과 일치하지 않을 때 작성해주는 부분입니다
swift에서는 카멜케이스를 사용하고 스네이크 케이스는 사용하지 않기에
필요한 부분입니다.
struct ApiResponse: Decodable {
let results: [Movie]
}
그리고 ApiResponse
라는 구조체를 추가하여 수동으로 데이터를 파싱하는 수고를 줄입니다.
이제 데이터 관련 모델은 다 작성했으니
본격적으로 데이터를 가져오는 부분을 작성해보겠습니다
우선 홈페이지에서 아래 화면이 보이는 부분을 전부 복사해옵니다!
그리고 플레이그라운드를 실행해보면!
아마 저와 같은 오류를 마주하실겁니다
여기서 do catch
구문을 추가해줘야합니다!
그리고 실제 받아오는 데이터에 맞게 코드를 추가해줄게요~
func fetchMovies() async {
let url = URL(string: "https://api.themoviedb.org/3/movie/now_playing")!
var components = URLComponents(url: url, resolvingAgainstBaseURL: true)!
let queryItems: [URLQueryItem] = [
URLQueryItem(name: "language", value: "ko-KR"),
URLQueryItem(name: "page", value: "1"),
]
components.queryItems = components.queryItems.map { $0 + queryItems } ?? queryItems
var request = URLRequest(url: components.url!)
request.httpMethod = "GET"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"accept": "application/json",
"Authorization": "Bearer 키"
]
do {
let (data, _) = try await URLSession.shared.data(for: request)
// Decode JSON data
let response = try JSONDecoder().decode(ApiResponse.self, from: data)
// 받아오는 데이터 출력
for movie in response.results {
print("Original Title: \(movie.originalTitle), Title: \(movie.title), Overview: \(movie.overview), Poster Path: \(movie.posterPath ?? "N/A"), Vote Average: \(movie.voteAverage)")
}
} catch {
print("Error fetching data: \(error)")
}
}
// 비동기 단일 실행
Task {
await fetchMovies()
}
그리고 마지막에 Task
구문을 추가해서 해당 함수가 실행될 수 있도록 해줍니다!
그럼 이렇게 정보를 잘 받아오는 것을 확인할 수 있습니다!
비동기에 관련된 부분은 아직 관련 강의를 받지 못해 설명이 완전하지 않은 점이 있습니다
이와 관련해서는 추후 추가하는것으로 하겠습니다