onBan

Stack: Caching, MVP, Network, UIKit, UserDefault, iOS Team: 1인 Role: 개발 진행 기간: 2021/09/27 → 2021/10/08 About: 반찬을 주문할 수 있는 간단한 애플리케이션입니다.

구조

기능

  • 회원가입 기능
  • 상품 목록 기능
  • 세부화면 기능
  • 주문 기능
  • 연결성에 따라 화면 표현을 변경함
  • Dynamic Framework로 네트워크 프레임워크를 추가함
  • 스크롤뷰 pagenation 구현
  • 다크모드 대응

동작

회원 가입

  • 아래 이름을 눌렀을 떄, 대응되지 않는 기기(5s)가 있어, 눌렀을때 화면이 올라오도록 하였습니다.

메인 화면

  • 네트워크 통신시 FileCache로 저장하고, 이를 불러옵니다.
  • DispatchGroup을 사용하여 순차적인 이미지가 있을 경우, 해당 이미지를 모두 받은 후에 보여주는 방식으로 구성하였습니다.

장바구니

고민과 배운점

  • 비동기 통신에 있어서 보여지는 이미지의 순서를 동일하게 유지하는 것이 중요하다는 것을 배웠습니다. DisPatchGroup을 사용해서 해당 세부 뷰가 모두 받아진 경우에 이를 보여주도록 하였는데, 이럴 경우 먼저 받아진 이미지가 보여지지 않아 UX 측면에서 좋지 않을 수 있습니다.
    • 추후 프로젝트에서는 이러한 순서까지 고려하여 이미지를 업데이트 하는 방식을 사용하려 합니다.
  • UseCase 객체에서는 각 기능들을 조합해서 전체 흐름을 관장하는 객체로 처리하였습니다.
  • 요청의 흐름이 View -> Presenter -> Usecase로 가면서 불필요한 함수들이 발생하였습니다.
    • 로직이 중복되는 경우가 많았습니다.
    • 하지만 Notification을 사용한다면 뭔가 전역적으로 알림을 보내는 듯 하여 해당 방법을 사용하지 않고, Delegate 패턴으로 변화사항을 전송하였습니다.
  • CollectionView를 사용할 때, header를 클릭시 크기를 가변적으로 변화해주어야 했는데, 이를 동작하기 위해서 Model안에 해당 Header가 터치되었는지 상태를 저장하여 해결하였습니다.
    • 이후 프로젝트에서는 Diffable DataSource, compositionalDataSource를 사용해보고 싶습니다.
  • Cache를 저장하는데 있어서 모든 이미지를 저장합니다. 하지만 FileCache를 할 때, 특정한 정책이 있거나, 사용자로부터 캐시메모리를 삭제할 수 있어야 합니다. 해당 부분을 적용하지 못해 아쉽습니다.
  • 사용자의 네트워크 연결 상태에 따라 이를 확인할 수 있도록 가장 자리에 색을 표현하였습니다.
    • 네트워크에 연결되지 않은 상태라면, 기존에 저장해둔 json으로부터 파일을 로드하여 보여주었습니다.
    • 네트워크가 돌아오는 경우, 네트워크로부터 연결하여 화면을 다시 로드합니다.
  • 대부분의 작업을 스토리보드로 진행했습니다.
    • 이후 프로젝트에서는 모두 코드를 사용하여 진행해보려 합니다. (snapKit)
  • 네트워크 라이브러리를 사용하지 않고 URLSession을 사용해서 처리했습니다.
    • 추후에는 Alamofire, KingFisher를 사용해보려 합니다.