Git Product home page Git Product logo

restaurant-in-pohang's Introduction

📱 App name: 아, 뭐먹지?

포항의 맛집을 추천받고, 마음에 드는 맛집으로 먹킷리스트를 만들어보세요!

  • 포항 맛집리스트를 볼 수 있고, 카테고리 선택으로 맛집을 추천받을 수 있습니다.
  • 맛집 즐겨찾기를 통해 먹킷리스트를 만들고 관리할 수 있습니다.

✨ Technology

📱UI/UX

UI

모든 UI 구현에 SwiftUI를 사용하였습니다.

본 프로젝트는 Apple Developer Academy에서 SwiftUI 연습용 프로젝트로 시작했기때문에 SwiftUI를 사용하게 되었습니다. SwiftUI는 property Wrapper를 사용해 변수의 변화에 따라 자동으로 뷰를 업데이트합니다. 따라서 UIkit과 비교하면 유저의 interaction에 따른 변화를 빠르게 읽고 뷰를 다시 그려주는 장점이 있기에 뷰 상태가 자주 변하는 앱에 용이합니다. 이 프로젝트에선 가로 스크롤형태로 움직이는 카테고리나, 음식점 즐겨찾기에 관한 UI을 그리는데는 UIkit보다 러닝컴브가 짧다느 장점이 있다고 볼 수 있습니다.

📡Concurrency

Notion API 연동: 음식점 데이터를 Notion DB를 통해 관리하고 Notion API로 앱 첫 실행시 데이터를 받아옵니다.

음식점 데이터는 많은 추가와 수정이 이루어질텐데 그 때마다 앱을 업데이트하는 것이 비효율적이라고 생각했습니다. 하지만 서버 구축에 대한 경험이 없었기에 Notion API를 이용하기로 했습니다. Notion으로 API 활용 경험을 하고 추후 데이터 업로드에도 용이하다고 판단했습니다.

URLSession, async/await: NotionDB에서 데이터를 가져오는 비동기 태스크 구현에 사용되었습니다.

URLSession으로 통시 구조를 이용하는것은 completion Hanlder가 있습니다. URLSession aync await를 사용하여 직관적이 코드 구조르 테스트 해보았습니다.

💾Persistence

  • FileManager: 첫 앱 실행시 DB로부터 받아온 데이터를 FileManager에 저장하여 영구 저장하며 이후 앱 구동시 빠르게 데이터를 가져옵니다.

⚜️Design Pattern

  • MVVM 구조를 사용했습니다. (단일 ObservableObject로 데이터 플로우 관리)

⭐ Data Flow Chart

App running시 다음과 같은 data flow를 가집니다.

image

📌 Features & Design

[UI Design]

프로토타입 디자인 과정에서 다음 HIG 요소들이 고려되었습니다.

  • Gestalt Theory (Similarity & Closure)
  • Color Psychology (Primary Color : Orange)

🫂 Authors

🖼️ Demo

Demo_

🎆 Screenshots

FoodListApp

Growth Points

처음부터 잘하자!(힘들겠지만)

과거에 신중하게 작성하지 못했더 코드를 리팩토링해보면서 처음부터 신중하게 구조를 짜고 계획적으로 개발해야함의 중요성을 깨달을 수 있었습니다.

PR과 커밋을 잘 쪼개자!

혼자서 개발할 때도 여러 업데이트 사항이 있기 때문에 커밋 메시지와 PR을 잘 작성해야겠다고 느꼈습니다.

📚 Documentation

🔏 License

  • All the license of food picture is on Naver or individual blogger.

향후 계획

  1. 유저가 음식점을 제보할 수 있는 기능 개발(POST to Notion DB)
  2. 음식점 검색 기능 추가

About Proejct managing

  • Total Project term : 30days
  • Ideation/Design : 5days
  • MVP Development : 6days
  • Revision/Presentation: 2days
  • Migration to NotionDB: 14days
  • Data Persist: 3days

restaurant-in-pohang's People

Contributors

rookie0031 avatar

Stargazers

parksungsoo avatar Taekyun Kim avatar

Watchers

 avatar

restaurant-in-pohang's Issues

[Refactor] 네트워킹 시스템 개편 및 UI 조정

개편 사항

  • 하단 버튼 크기 조절 및 통일화
    -> UX 개선 및 코드 유지 보수에 용이하게 하기 위함

  • 메인뷰 UI 수정
    -> 음식 사진을 최대한 많이 보이게함. (유저에게 필요한 정보를 최대한 많이 보여줘 UX를 개선)

[Data Binding]

Problem

image

image

버킷리스트를 통해 음식뷰로 들어가면 즐겨찾기 star가 활성화되지 않았다는 문제가 발생함 왜 일까?

Description

[Concurrency]

Bug

다음과 같이 버튼을 반환하는 함수는 버튼을 클릭했을때 최종 필터링된 음식 배열에서 random으로 한개를 뽑아내서 Navigation의 destination View를 init하는데 사용된다.

문제는 서버에서 데이터를 get 하는 과정에 시간이 걸려 UI가 나중에 그려진다는 것이다... 당장에 떠오르는것은 else로 분기처리해 껍데 버튼을 놓는 것인데 이것보다 좋은 방법이 있을까?

private func getRecommendationButton() -> some View {
    VStack {
        if !modelData.foodData.isEmpty {
            NavigationLink(destination: FoodInfoView(foodInfo: filteredGroupFinal.randomElement() ?? modelData.foodData.first!)) {
                Button {
                    filteredGroupFinal = self.filteredGroupA.filter{filteredGroupB.contains($0)}.filter{filteredGroupC.contains($0)}.filter{filteredGroupD.contains($0)}
                } label: {
                    Text("맛집. 추천받기!")
                        .customButtonFormat()
                        .padding(.bottom, 20)
                }
            }
        }
    }
}
ConcurrencyErrorExample.mov

Discussion

프로젝트 관리 To-do List

배경

Young과의 멘토링을 통해 받은 피드백과 제 생각을 바탕으로 리드미 및 코드 개선 부분을 리스트업합니다.

To-do List

ReadMe 설명 개선

  • !!! 왜 UI 작업에 SwiftUI를 사용하게 되었는가? UIkit과 비교해서 어떤 메리트가 있어서 이를 쓰기로 판단했는가? 적어주기
  • !!! NukeUI에 대한 링크를 넣고 SwiftUI의 어떤 부분때문에 이를 사용하게 되었는지 자세하게 기술하기
  • !!! async await 말고 다른 선택지가 있는데 왜 이것을 써야했는지 설명하기
  • !!! FileManager가 어떤 것인지 설명 적어주기 (영구 저장이라는 키워드 다른말로 바꾸기, 맥락상 케싱을 위해 썼다고는 등 )
  • !! 데이터를 왜 제이슨 구조로 저장하는지 설명적어주기
  • !!! 왜 MVVM 구조를 채택하게 되었는지 다른 구조랑 비교해서 설명하기
  • !! 데이터 플로우 차트 수정하기 (FileManager에 저장되는 것과 NotionDB는 결국 같은 데이터라는 것을 보여줘야함)
  • ! Design Skill에 HIG Component를 잘 적어주기 (원론적인 디자인 이야기는 지양)

Code 개선

  • !!! ViewModel은 하나의 뷰에 대한 책임을 가진다. 따라서 각 뷰별 ViewModel을 가지는 구조로 바꿔야함
  • ! 반복적인 구조의 코드를 최대한 없애보자
  • !! server에서 데이터를 가져오는 것과 local에서 가져오는 함수는 따로 관리되어야 한다.

느낀점 작성

  • !!! 지저분한 코드를 받고 이를 개선하면서 했던 삽질과 배운점들을 리스트업하기
  • !!! 한계점 적기, 시간이 없어서 프로젝트를 종료하지만 나중에 이런 부분들은 반영해서 코드를 짜야겠다 하는 부분 등을 발견해서 적기

Tips

  • 자신의 코드에도 리뷰를 한다고 생각하자
  • 혼자 작업하더라도 PR을 작성하는 연습을 하자
  • PR에는 스크린샷보다는 코드 부분을 링크로 걸자 (보는 사람이 클릭해서 페이지 열어보고 바로 어떤 부분인지 찾을 수 있게!)

[To-do List]

기능 개선

  • URL 이미지 업데이트 속도 저하 문제 개선하기

버전 업데이트 사항

  • 로고 교체
  • 아쉽게도 원하는 맛집이 없어요... UI 업데이트
  • 음식 클릭시, 세부 사항 뷰 UI 업데이트

포트폴리오 업데이트 사항

  • 데이터 플로우 정리(Visualization)
  • 노션 DB 데이터 관리 이유 정리 (음식점 업데이트 및 추후 카테고리 추가시 용이)
  • 즐겨 찾기 데이터 저장 이유 정리 (UserDefault, CoreData 등)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.