포켓몬 도감 앱 개발

버질·2024년 12월 30일

포켓몬 도감 앱 프로젝트를 시작하며 프로젝트 초반 세팅 및 구조 설계를 진행했습니다

1️⃣ 프로젝트 목표

주요 기능:
포켓몬 리스트(이미지와 이름)를 보여주는 메인 화면.
각 포켓몬의 상세 정보를 보여주는 디테일 화면.
무한 스크롤을 통한 데이터 로드.
사용 기술 스택:
UIKit
RxSwift
MVVM 아키텍처
REST API (PokeAPI)

2️⃣ 오늘 진행한 작업

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
        }
    }
}

3️⃣ 배운 점 및 느낀 점

RxSwift의 Single 활용: RxSwift에서 API 호출을 처리하기 위해 Single을 처음 사용해보았습니다. 비동기 작업의 성공과 실패를 명확히 처리할 수 있어 네트워크 요청에 적합하다는 점을 알게 되었습니다.

API 설계와 데이터 모델링의 중요성: REST API의 구조를 분석하고 이를 기반으로 데이터 모델을 설계하는 과정이 프로젝트 전체 흐름에 얼마나 중요한지 다시 한번 깨달았습니다.

싱글톤 패턴 활용: NetworkManager를 싱글톤으로 구현해 전역적으로 네트워크 요청을 관리할 수 있도록 설정. 이를 통해 코드의 재사용성을 높이고 효율적으로 관리할 수 있었습니다.

4️⃣ 내일 할 일

MVVM 패턴을 적용한 MainViewModel 구현.
포켓몬 리스트 화면(UI) 구성.
RxSwift로 View와 ViewModel 간 데이터 바인딩 구현.

profile
iOS Developer · SwiftUI & UIKit '가끔 되고 가끔 안 되는' 문제를 뿌리부터 잡습니다.

0개의 댓글