Giter VIP home page Giter VIP logo

coffe-zip's Introduction

๐Ÿฆ‰ ์นดํŽ˜ ์ฐพ๋Š” ๋ถ€์—‰์ด - ์•ผ๊ฐ„ ์šด์˜ ์นดํŽ˜ ์ฐพ๊ธฐ ์„œ๋น„์Šค(์›น/์•ฑ)

๐Ÿ–ฅ๏ธ ์„œ๋น„์Šค ์†Œ๊ฐœ(Introduction)

  • ์„œ์šธ ๋‚ด ์•ผ๊ฐ„ ์˜์—… ์นดํŽ˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›น/์•ฑ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
  • ์•ผ๊ฐ„ ์˜์—…์€ ์ž์ • ์ดํ›„ ๋˜๋Š” 24์‹œ๊ฐ„ ์˜์—…ํ•˜๋Š” ์นดํŽ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์— GPS ์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๊ฒฝ 2km ๋‚ด์— ์žˆ๋Š” ์นดํŽ˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์š”๊ตฌ ์‚ฌํ•ญ(Requirements)

  • Node.js 20.11.1
  • yarn 1.22.21
  • vite 5.2.0

๐Ÿ’ก ์‹คํ–‰ ๋ฐฉ๋ฒ•(Installation)

$ cd coffe-zip
$ yarn
$ yan dev

๐Ÿ”— ์›น ๋ฐ”๋กœ๊ฐ€๊ธฐ(Deployment)

https://coffeezip.vercel.app

๐Ÿ“– ๊ด€๋ จ ๋ธ”๋กœ๊ทธ(Blog)

https://velog.io/@hojinch99/series/์•ผ๊ฐ„-์นดํŽ˜-์ง€๋„-์„œ๋น„์Šค

๐Ÿ“ฒ PWA๋ฅผ ํ™œ์šฉํ•œ ์•ฑ(Progressive Web Apps)

๐ŸŽ iOS & Safari

  • Safari ํ™˜๊ฒฝ์—์„œ https://coffeezip.vercel.app ์ ‘์†
  • ๊ณต์œ  ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ ์•„๋ž˜ ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€
  • ๋ฐ”ํƒ•ํ™”๋ฉด ๋˜๋Š” ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€๋œ ์•ฑ์œผ๋กœ ์‹คํ–‰

๐Ÿ–ฅ๏ธ Web & Chrome

  • Chrome ํ™˜๊ฒฝ์—์„œ https://coffeezip.vercel.app ์ ‘์†
  • ๊ฒ€์ƒ‰์ฐฝ ์šฐ์ธก์˜ ์œ„์น˜ํ•œ ๋ถ๋งˆํฌ ์ถ”๊ฐ€ ๋ฒ„ํŠผ ์ขŒ์ธก ํด๋ฆญ ํ›„ ์•ฑ ์„ค์น˜
  • ๋ฐ”ํƒ•ํ™”๋ฉด ๋˜๋Š” ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€๋œ ์•ฑ์œผ๋กœ ์‹คํ–‰

๐Ÿ—“๏ธ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„(Development Period)

  • ์ „์ฒด ๊ธฐ๊ฐ„ : 2024.04.24 ~ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘
  • ๊ธฐํš ๋ฐ ๋””์ž์ธ : 2024.04.23 ~ 2024.05.06
  • UI ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ : 2024.04.24 ~ 2024.05.06
  • DB ๊ตฌํ˜„ ๋ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ : 2024.05.07 ~ ํ˜„์žฌ ์ˆ˜์ง‘ ์ค‘

๋ฉค๋ฒ„ ๊ตฌ์„ฑ(Members)

๐Ÿ“š ๊ธฐ์ˆ  ์Šคํƒ(Stacks)

๐Ÿ›ฃ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(Environment)

๐Ÿ’ซ Config

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ๊ธฐ์ˆ (Development)

๐Ÿช„ ๋””์ž์ธ(Design)

๐Ÿ—บ๏ธ ์™ธ๋ถ€ API(External API)


๐Ÿ“‚ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ(Directory Structure)

24hour-cafe
โ”œโ”€ .eslintrc.cjs
โ”œโ”€ .github
โ”‚  โ””โ”€ workflows
โ”‚     โ””โ”€ test.yml
โ”œโ”€ .gitignore
โ”œโ”€ index.html
โ”œโ”€ package.json
โ”œโ”€ public
โ”‚  โ”œโ”€ icons
โ”‚  โ”‚  โ”œโ”€ favicon.ico
โ”‚  โ”‚  โ”œโ”€ logo-128X128.png
โ”‚  โ”‚  โ”œโ”€ logo-144X144.png
โ”‚  โ”‚  โ”œโ”€ logo-192X192.png
โ”‚  โ”‚  โ”œโ”€ logo-256X256.png
โ”‚  โ”‚  โ”œโ”€ logo-32X32.png
โ”‚  โ”‚  โ”œโ”€ logo-48X48.png
โ”‚  โ”‚  โ”œโ”€ logo-512X512.png
โ”‚  โ”‚  โ””โ”€ logo-72X72.png
โ”‚  โ”œโ”€ manifest.json
โ”‚  โ”œโ”€ svg
โ”‚  โ”‚  โ”œโ”€ allday.svg
โ”‚  โ”‚  โ”œโ”€ arrow.svg
โ”‚  โ”‚  โ”œโ”€ arrowdown.svg
โ”‚  โ”‚  โ”œโ”€ arrowup.svg
โ”‚  โ”‚  โ”œโ”€ cafe.svg
โ”‚  โ”‚  โ”œโ”€ cancle.svg
โ”‚  โ”‚  โ”œโ”€ close.svg
โ”‚  โ”‚  โ”œโ”€ current.svg
โ”‚  โ”‚  โ”œโ”€ location.svg
โ”‚  โ”‚  โ”œโ”€ muin.svg
โ”‚  โ”‚  โ”œโ”€ parttime.svg
โ”‚  โ”‚  โ”œโ”€ search.svg
โ”‚  โ”‚  โ””โ”€ unman.svg
โ”‚  โ””โ”€ webp
โ”‚     โ”œโ”€ kakaomap.webp
โ”‚     โ”œโ”€ loading.webp
โ”‚     โ”œโ”€ logo.webp
โ”‚     โ””โ”€ wrapper.webp
โ”œโ”€ README.md
โ”œโ”€ robots.txt
โ”œโ”€ src
โ”‚  โ”œโ”€ apis
โ”‚  โ”‚  โ””โ”€ supabase-api.ts
โ”‚  โ”œโ”€ App.tsx
โ”‚  โ”œโ”€ components
โ”‚  โ”‚  โ”œโ”€ custom-overlay.ts
โ”‚  โ”‚  โ”œโ”€ kakao-map.tsx
โ”‚  โ”‚  โ”œโ”€ list.tsx
โ”‚  โ”‚  โ”œโ”€ loading.tsx
โ”‚  โ”‚  โ”œโ”€ search-box.tsx
โ”‚  โ”‚  โ”œโ”€ skeleton-ui.tsx
โ”‚  โ”‚  โ””โ”€ tab-bar.tsx
โ”‚  โ”œโ”€ interfacce
โ”‚  โ”‚  โ””โ”€ list-interface.ts
โ”‚  โ”œโ”€ main.tsx
โ”‚  โ”œโ”€ pages
โ”‚  โ”‚  โ””โ”€ Home.tsx
โ”‚  โ”œโ”€ stores
โ”‚  โ”‚  โ””โ”€ map-store.ts
โ”‚  โ”œโ”€ supabase
โ”‚  โ”‚  โ””โ”€ supabase.ts
โ”‚  โ””โ”€ vite-env.d.ts
โ”œโ”€ sw.js
โ”œโ”€ tsconfig.json
โ”œโ”€ tsconfig.node.json
โ”œโ”€ vite.config.ts
โ””โ”€ yarn.lock

๐ŸŒŸ ์ฃผ์š” ๊ธฐ๋Šฅ(Specification)

โ˜• ์ฃผ๋ณ€ ์นดํŽ˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ(Data Fetching)

  • ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ GPS ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ 2km ์ด๋‚ด์— ์žˆ๋Š” 24์‹œ๊ฐ„/๋ฌด์ธ ์นดํŽ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒ ํ›„ ์ง€๋„์— ๋งˆ์ปค ๋ณด์—ฌ์ฃผ๊ธฐ
  • ํ•œ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ตœ๋Œ€ ์นดํŽ˜ ๋ฐ์ดํ„ฐ 5๊ฐœ ๋ฐ ์ง€๋„ ์ตœ๋Œ€ ๋งˆ์ปค 5๊ฐœ ์ œํ•œ, ๊ทธ ์™ธ ๋ชจ๋‘ ํŽ˜์ด์ง€๋„ค์ด์…˜ ํ™œ์šฉ
  • React-Query๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์ง€์›

๐Ÿ” ์žฅ์†Œ/์ฃผ์†Œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ(Search)

  • ์นด์นด์˜ค ์ง€๋„ API์˜ ์žฅ์†Œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ์žฅ์†Œ/์ฃผ์†Œ ๊ฒ€์ƒ‰ ์‹œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ
  • ๊ฒ€์ƒ‰ ์‹œ ์ง€๋„์˜ ์ค‘์‹ฌ์„ ๊ฒ€์ƒ‰ ํ•œ ์œ„์น˜์˜ ์ขŒํ‘œ๋กœ ์ด๋™๊ณผ ๋™์‹œ์— ๊ทผ๋ฐฉ 2km ์ด๋‚ด์— ์žˆ๋Š” ์นดํŽ˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ

๐Ÿ“ฌ ์ฃผ์†Œ ๋ณต์‚ฌ/๊ธธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ(Copy & Giving Direction)

  • ๋งˆ์ปค/๋ฆฌ์ŠคํŠธ ํด๋ฆญ ์‹œ ์นดํŽ˜ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ธ๋ณด๊ธฐ ์ฐฝ ๊ธฐ๋Šฅ
  • ์ƒ์„ธ๋ณด๊ธฐ ์ฐฝ์—์„œ ์ฃผ์†Œ ๋ณต์‚ฌ ๊ธฐ๋Šฅ์œผ๋กœ ํด๋ฆฝ๋ณด๋“œ์— ์นดํŽ˜ ์ฃผ์†Œ ๋ณต์‚ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์ƒ์„ธ๋ณด๊ธฐ ์ฐฝ์—์„œ ์ฃผ์†Œ ๊ธธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์œผ๋กœ ์นด์นด์˜ค ๋งต์—์„œ ํ˜„์žฌ ์นดํŽ˜ ์ฃผ์†Œ๋ฅผ ๋„์ฐฉ์ง€๋กœ ์„ค์ •

๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…(Trouble Shooting)

๐Ÿ“š useEffect ์นด์นด์˜ค ์ง€๋„ ์ค‘๋ณต ์ƒ์„ฑ(Map Duplication)

๋ฌธ์ œ: React Hook useEffect๋ฅผ ์‚ฌ์šฉํ•ด ์นด์นด์˜ค ์ง€๋„๋ฅผ ํ™”๋ฉด์— ๋„์šฐ๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋‹ค. useEffect๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›์•„ ํ•ด๋‹น ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋•Œ ์นดํŽ˜ ๋ชฉ๋ก์„ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜๋‹ˆ ์ง€๋„๊ฐ€ ์ค‘๋ณต์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด์„œ ์ง€๋„ ์กฐ์ž‘ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋™ ์‹œ ์ด์ „์— ์ƒ์„ฑ๋œ ์ง€๋„๊ฐ€ ์ง€์†ํ•ด์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•ด๊ฒฐ: useEffect๋ฅผ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋น„์›Œ ์ตœ์ดˆ ๋งˆ์šดํŠธ ์‹œ ์ง€๋„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ React Hook useState๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ €์žฅํ•œ ํ•œ ๊ฐœ์˜ ์ง€๋„๋งŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

๋˜ํ•œ React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ React์—์„œ ์ œ๊ณตํ•˜๋Š” React StrictMode๊ฐ€ true๋กœ ์„ค์ •๋˜์–ด useEffect๊ฐ€ ๋‘ ๋ฒˆ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ false๋กœ ์„ค์ •ํ•˜์—ฌ ์˜ค์ง ์ตœ์ดˆ ๋งˆ์šดํŠธ์‹œ ํ•œ ๋ฒˆ๋งŒ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

โ›“๏ธ ์˜์กด์„ฑ ๋ฌธ์ œ - Callback ํ•จ์ˆ˜ ๋ฐ Props ์ „๋‹ฌ(Dependency Problem)

๋ฌธ์ œ: ํ•œ ๊ฐœ์˜ ๋‹จ์ผ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋•Œ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„ํ•  ํ•˜์—ฌ ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ Home์—์„œ import ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

import ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์นด์นด์˜ค ์ง€๋„๋ฅผ ๋„์šฐ๋Š” KakaoMap ์ปดํฌ๋„ŒํŠธ์™€ ์นดํŽ˜ ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก์ธ List ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ List ์ปดํฌ๋„ŒํŠธ์—์„œ ์นดํŽ˜์˜ ํด๋ฆญ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ž‘๋™์„ KakaoMap ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ <List> -> <Home> -> <KakaoMap> ์ปดํฌ๋„ŒํŠธ ์ˆœ์œผ๋กœ Callback ํ•จ์ˆ˜์™€ Props ์ „๋‹ฌ์ด ๋ณต์žกํ•ด์ ธ ์ถ”ํ›„ ์˜์กด์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค.

ํ•ด๊ฒฐ: ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Zustand๋ฅผ ์‚ฌ์šฉํ•ด List ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์นดํŽ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ kakaoMap ์ปดํฌ๋„ŒํŠธ์—์„œ ์ค‘์•™ Store์— ์ ‘๊ทผํ•˜์—ฌ ์ด๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

๐Ÿšจ Kakao Map API ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฌธ์ œ(Kakao Map API onClick Event Listner)

๋ฌธ์ œ: kakao Map API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์ปค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ฆญ ์ด๋ฒคํŠธ๋กœ ์ปค์Šคํ…€ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CustomOverlay์— ๊ฒฝ์šฐ ๋งˆ์ปค์ฒ˜๋Ÿผ addEventListener๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

https://devtalk.kakao.com/t/topic/44205/6?u=karl.lee

ํ•ด๊ฒฐ: ์œ„์˜ ๋งํฌ์— ์žˆ๋Š” ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ CustomOverlay๋ฅผ CreateElement๋กœ ์ƒ์„ฑํ•˜๊ณ  onClick ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ๋“ฑ๋กํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

coffe-zip's People

Contributors

jack42chj avatar

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.