이 저장소를 자신의 저장소로 fork하여 프로젝트를 진행합니다!
![]() |
![]() |
---|---|
Sajae | Harry |
@suojae3 | @hemil0102 |
영화진흥위원회의 일별 박스오피스 API 문서의 데이터 형식을 고려하여 모델 타입을 구현합니다.제공된 JSON 데이터를 위에서 구현한 Model 타입으로 Parsing 할 수 있는지에 대한 단위 테스트(Unit Test)를 진행합니다.네트워크 통신을 담당할 타입을 설계하고 구현합니다.영화진흥위원회의 일별 박스오피스 API 문서의 데이터 형식을 고려하여 서버와 실제로 데이터를 주고받도록 구현합니다.
- 파싱한 JSON 데이터와 매핑할 모델 설계
- CodingKeys 프로토콜의 활용
- 단위 테스트(Unit Test)를 통한 설계의 검증
- URL Session을 활용한 서버와의 통신
- CodingKeys 프로토콜의 활용
- Safe Area을 고려한 오토 레이아웃 구현
- Collection View의 활용
- Mordern Collection View 활용
1. 네트워크 구현
- URLSession을 활용한 네트워크 구현
- 재사용성과 범용성을 고려하여 네트워크 레이어를 설계
- URL(Endpoint)생성, Request, Session, Decode 등을 POP 의존성 주입 형태로 Testable 설계 구현
2. Async/Await를 통한 네트워크 비동기 처리
- Completion Handler 비동기 처리 방식에서 Async/Await를 통해 URLSession.data async 메서드를 활용하여 네트워크를 구현
3. 데이터 플로우에 대한 고민
문제상황: Repository의 낮은 재사용성
- 레포지토리 객체가 DTO -> Entity 맵핑 책임을 맡음
- 이로인해 레포지토리 메서드들이 엔티티와 1대1 관계가 되어 경직된 코드가 되어버림
해결방법:
- 레포지토리의 본래역할, 네트워크 객체들을 이용해 DTO를 가져오는 역할만 남기기위해 리턴타입을 Result<Data, NetworkError> 로 넘겨 인풋과 아웃풋의 Context는 유지
- 맵핑 객체를 따로 둠으로써 레포지토리의 리턴값을 받아 도메인레이어로 맵핑된 값을 보냄. 이를통해 레포지토리의 느슨한 객체관계를 확보
4. 캐싱 방법에 대한 고민
문제상황:
- 박스오피스는 하루단위로 업데이트되는 데이터였음
- 따라서 한 번 받아온 데이터를 몇분내로 새로고침할 때 불필요한 네트워크 통신이 발생했음
해결방법:
- 네트워크 관련 캐시 관리이기 때문에 NSCache 보다 디테일한 캐시정책을 설정할 수 있는 URLCache 선택
- 개별 Cache 에 대한 설정도 부여(http일 경우에는 디스크에 저장못하도록 제한)