문제 1: NetworkManager 구현
문제: REST API로 데이터를 가져오는 비동기 작업을 효율적으로 처리하기 위해 NetworkManager를 싱글톤 패턴으로 설계해야 했음.
해결:
URLSession을 활용하여 데이터를 가져오는 fetch<T: Decodable>(url: URL) -> Single 메서드를 구현.
RxSwift의 Single을 사용해 비동기 작업 결과를 반환하여 데이터 처리를 간소화.
문제 2: MVVM 아키텍처 구현
문제: 데이터를 ViewModel에서 관리하고 View와 바인딩해야 하는 구조를 적용하는 것이 처음에는 익숙하지 않았음.
해결:
ViewModel에서 BehaviorRelay를 활용해 데이터를 관리하고, ViewController에서 bind를 사용해 View와 데이터 바인딩.
비동기 데이터 흐름을 관리하기 위해 RxSwift를 적극 활용.
문제 3: 무한 스크롤 구현
문제: 컬렉션뷰의 스크롤 이벤트를 감지해 추가 데이터를 로드해야 했음.
해결:
UICollectionView의 contentOffset을 관찰하여 사용자가 하단으로 스크롤할 때 ViewModel의 fetchPokemonList 메서드 호출.
데이터 중복 요청 방지를 위해 isLoading 플래그를 추가.
문제 4: 디테일 화면 전환
문제: 셀을 클릭했을 때 포켓몬의 상세 정보를 보여주는 화면으로 전환해야 했음.
해결:
UICollectionView의 modelSelected 이벤트를 활용해 DetailViewController로 네비게이션 푸시.
Detail 화면에서 포켓몬 이름과 이미지를 보여줄 수 있도록 URL 및 이름 번역기를 활용.
MVVM 패턴
ViewModel에서 데이터와 로직을 분리함으로써 ViewController의 역할을 단순화하고 테스트 가능성을 높이는 장점을 경험.
RxSwift를 활용해 데이터 바인딩을 구현하며 옵저버블과 BehaviorRelay의 사용법을 익힘.
RxSwift 활용
비동기 데이터 처리에서의 Single과 UI 이벤트 관찰에 사용하는 Relay의 차이를 학습.
bind와 subscribe의 차이를 이해하고 적절히 적용.
무한 스크롤
스크롤 이벤트를 활용해 네트워크 요청을 최적화하고, 플래그를 사용해 중복 요청을 방지하는 방법을 배움.
싱글톤 패턴
NetworkManager를 싱글톤 패턴으로 설계하여 네트워크 호출 관리를 통합적으로 처리.
코드의 확장성
MainViewModel의 fetchPokemonList 메서드를 확장하여 필터링 및 검색 기능을 추가할 수 있을지 고민.
에러 처리
네트워크 요청 실패 시 사용자에게 알림을 주는 UI 구현과 로깅 메커니즘 추가 필요.
캐싱
이미지와 데이터 요청 결과를 캐싱하여 네트워크 사용량을 줄이고 앱 성능을 최적화할 수 있는 방법 탐구.
챌린지 도전
RxSwift의 Relay 활용 및 Observable과의 차이를 더 깊이 학습.
포켓몬 타입 및 상세 정보를 추가로 활용하여 UI를 더 디테일하게 개선.
코드 리팩토링
중복 코드를 줄이고, 유틸리티 메서드와 익스텐션을 활용하여 가독성을 높이기.
성능 최적화
이미지 로딩 속도를 개선하고, UICollectionView 성능을 최적화하는 방법 탐구.
마무리
이번 과제를 통해 RxSwift와 MVVM 패턴의 장점을 직접 경험하며 효율적인 코드 작성법을 배웠습니다. 특히 비동기 프로그래밍과 데이터 흐름 관리에서 RxSwift의 강력함을 체감했고, 이를 활용해 더 깔끔하고 유지보수 가능한 코드를 작성할 수 있었습니다. 앞으로 이 구조를 다른 프로젝트에도 적용해보며 실력을 더 쌓고 싶습니다.