포켓몬 도감 앱 프로젝트를 시작하며 프로젝트 초반 세팅 및 구조 설계를 진행했습니다
주요 기능:
포켓몬 리스트(이미지와 이름)를 보여주는 메인 화면.
각 포켓몬의 상세 정보를 보여주는 디테일 화면.
무한 스크롤을 통한 데이터 로드.
사용 기술 스택:
UIKit
RxSwift
MVVM 아키텍처
REST API (PokeAPI)
1. 프로젝트 초기 세팅
설정한 개발 환경:
iOS 17.2, Xcode 15.1
Storyboard 없이 코드베이스로 UI 구성
RxSwift 및 RxCocoa를 CocoaPods로 설치
폴더 구조:
Model : 데이터 모델과 API 응답 처리
View : 사용자 인터페이스
ViewModel : 비즈니스 로직과 데이터 바인딩
Network : API 통신 담당 NetworkManager 구현 예정
2. NetworkManager 구현
목표: API 호출과 데이터를 fetch<T: Decodable> 메서드를 통해 처리.
싱글톤 패턴을 활용해 NetworkManager를 생성.
REST API 호출을 RxSwift의 Single로 비동기 처리.
import Foundation
import RxSwift
final class NetworkManager {
static let shared = NetworkManager()
private init() {}
func fetch<T: Decodable>(url: URL) -> Single<T> {
return Single.create { single in
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
single(.failure(error))
return
}
guard let data = data else {
single(.failure(NetworkError.noData))
return
}
do {
let decodedData = try JSONDecoder().decode(T.self, from: data)
single(.success(decodedData))
} catch {
single(.failure(error))
}
}
task.resume()
return Disposables.create {
task.cancel()
}
}
}
}
enum NetworkError: Error {
case noData
}
3. PokeAPI 이해 및 데이터 모델 설계
API 분석:
포켓몬 리스트 데이터: https://pokeapi.co/api/v2/pokemon?limit=\(limit)&offset=\(offset)
포켓몬 상세 데이터: https://pokeapi.co/api/v2/pokemon/\(pokemon_id)
데이터 모델 설계:
API 응답을 기반으로 Pokemon과 PokemonDetail 구조체 설계.
struct Pokemon: Decodable {
let name: String
let url: String
}
struct PokemonListResponse: Decodable {
let results: [Pokemon]
}
struct PokemonDetail: Decodable {
let id: Int
let name: String
let height: Int
let weight: Int
let types: [PokemonType]
struct PokemonType: Decodable {
let type: TypeInfo
struct TypeInfo: Decodable {
let name: String
}
}
}
RxSwift의 Single 활용: RxSwift에서 API 호출을 처리하기 위해 Single을 처음 사용해보았습니다. 비동기 작업의 성공과 실패를 명확히 처리할 수 있어 네트워크 요청에 적합하다는 점을 알게 되었습니다.
API 설계와 데이터 모델링의 중요성: REST API의 구조를 분석하고 이를 기반으로 데이터 모델을 설계하는 과정이 프로젝트 전체 흐름에 얼마나 중요한지 다시 한번 깨달았습니다.
싱글톤 패턴 활용: NetworkManager를 싱글톤으로 구현해 전역적으로 네트워크 요청을 관리할 수 있도록 설정. 이를 통해 코드의 재사용성을 높이고 효율적으로 관리할 수 있었습니다.
MVVM 패턴을 적용한 MainViewModel 구현.
포켓몬 리스트 화면(UI) 구성.
RxSwift로 View와 ViewModel 간 데이터 바인딩 구현.