Skip to content

Nal-see/nal-see-front-pwa

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

NAL-SEE

NAL-SEE ๋กœ๊ณ 

ํ”„๋กœ์ ํŠธ ๋™๊ธฐ

'์˜ค๋Š˜ ๋ญ ์ž…์ง€?'๋ผ๋Š” ์ƒ๊ฐ์—์„œ ๊ธฐํš๋œ ์ด ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์™ธ์ถœ ์‹œ ๋ฌด์—‡์„ ์ž…์„์ง€ ์‰ฝ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•์ž๋Š” ์•„์ด๋””์–ด๋กœ๋ถ€ํ„ฐ ๊ธฐํš๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ์”จ๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์‹ค์ œ ์ฐฉ์žฅ์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ, ๊ทธ๋“ค์˜ ์˜ท์ฐจ๋ฆผ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž์‹ ์˜ ์Šคํƒ€์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์›ํ•˜๋Š” ์Šคํƒ€์ผ์˜ ์‚ฌ๋žŒ๋“ค์„ ํŒ”๋กœ์šฐ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์Šคํƒ€์ผ ์•„์ด๋””์–ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜จ๋ผ์ธ ์˜๋ฅ˜ ์‡ผํ•‘๋ชฐ๊ณผ์˜ ์—ฐ๊ณ„๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์„ ๊ณ ๋„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ์†Œ๊ฐœ

ํ”„๋ก ํŠธ์—”๋“œ

ํ”„๋ก ํŠธ์—”๋“œ ํŒ€ ์†Œ๊ฐœ

์ด๋ฆ„ ๊น€์ฑ„ํ˜„ ๊ถŒ์˜ค์˜
์—ญํ•  FE-Lead TeamMate
๊ธฐ๋Šฅ * ๋ฉ”์ธ์ง€๋„, ๋‚ ์”จ๋“œ๋กญ ๊ฒŒ์‹œ๋ฌผ ๋“ฑ๋ก, ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›ํƒˆํ‡ด, PWA, FCM์•Œ๋žŒ, ํ”„๋ก ํŠธ ๋ฐฐํฌ CI/CD * ํ”ผ๋“œ ๋ฆฌ์ŠคํŠธ ๋ฐ ์ƒ์„ธ ํ”ผ๋“œ RUD, 1:1 ์ฑ„ํŒ… ๋ฐ ๋ฆฌ์ŠคํŠธ, ์œ ์ € ํ”„๋กœํ•„, ์ •๋ณด ์ˆ˜์ •, ํŒ”๋กœ์šฐ, ๋กœ๊ทธ์•„์›ƒ
๊นƒํ—ˆ๋ธŒ ๊น€์ฑ„ํ˜„์˜ GitHub ๊ถŒ์˜ค์˜์˜ GitHub

์‹œ์ž‘ ๊ฐ€์ด๋“œ

๋ฐฐํฌ ์ฃผ์†Œ

ํ”„๋กœ์ ํŠธ ์ •๋ณด

  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: 2024.02.29 ~ 2024.04.21

์„œ๋น„์Šค ์•„ํ‚คํ…์ณ

NAL-SEE android

ํŒŒ์ผ ๊ตฌ์กฐ

โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ components.json
โ”œโ”€โ”€ dist
โ”œโ”€โ”€ index.html
โ”œโ”€โ”€ node_modules
โ”œโ”€โ”€ package-lock.json
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ postcss.config.js
โ”œโ”€โ”€ public
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ App.tsx
โ”‚   โ”œโ”€โ”€ assets
โ”‚   โ”œโ”€โ”€ components
โ”‚   โ”œโ”€โ”€ features
โ”‚   โ”‚   โ”œโ”€โ”€ Chat
โ”‚   โ”‚   โ”œโ”€โ”€ Feed
โ”‚   โ”‚   โ”œโ”€โ”€ Home
โ”‚   โ”‚   โ”œโ”€โ”€ Login
โ”‚   โ”‚   โ”œโ”€โ”€ Notifications
โ”‚   โ”‚   โ”œโ”€โ”€ OauthRedirect
โ”‚   โ”‚   โ”œโ”€โ”€ OptionalInfo
โ”‚   โ”‚   โ”œโ”€โ”€ Posts
โ”‚   โ”‚   โ”œโ”€โ”€ Profile
โ”‚   โ”‚   โ””โ”€โ”€ Splash
โ”‚   โ”œโ”€โ”€ global.css
โ”‚   โ”œโ”€โ”€ hooks
โ”‚   โ”œโ”€โ”€ lib
โ”‚   โ”œโ”€โ”€ main.tsx
โ”‚   โ”œโ”€โ”€ mocks
โ”‚   โ”œโ”€โ”€ routes
โ”‚   โ”œโ”€โ”€ services
โ”‚   โ”œโ”€โ”€ store
โ”‚   โ”œโ”€โ”€ types
โ”‚   โ””โ”€โ”€ vite-env.d.ts
โ”œโ”€โ”€ svg.d.ts
โ”œโ”€โ”€ svgr.template.cjs
โ”œโ”€โ”€ tailwind.config.js
โ”œโ”€โ”€ tsconfig.json
โ”œโ”€โ”€ tsconfig.node.json
โ”œโ”€โ”€ vite.config.ts
โ””โ”€โ”€ yarn.lock

ํŒŒ์ผ ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

  1. ๊ณตํ†ต

src ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ”๋กœ ์•„๋ž˜์— ์œ„์น˜ (์˜ˆ: components, hooks, routes, services, mocks ๋“ฑ)

ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ๋‘ก๋‹ˆ๋‹ค. (components - ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ๋ฐ shadcn ui ์ปดํฌ๋„ŒํŠธ)

  1. ๊ธฐ๋Šฅ๋ณ„ ํŒŒ์ผ

src/features ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์— ์ฃผ์š” ๊ธฐ๋Šฅ ๊ตฌ๋ถ„์— ๋”ฐ๋ผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌ ์˜ˆ: Chat, Feed, Home, Notification ๋“ฑ ๊ฐ ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์—๋Š” api, hooks, store, types ๋“ฑ์˜ ํŒŒ์ผ๋“ค์„ ๋‘ ์œผ๋กœ์จ ๊ธฐ๋Šฅ๋ณ„๋กœ ํŠนํ™”๋œ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ํ•œ ๋ฐ ๋ชจ์•„ ๋ชจ๋“ˆํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์˜ ์žฅ์ :

  1. ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

๊ณตํ†ต ํŒŒ์ผ ๋ถ„๋ฆฌ๋กœ ์ฝ”๋“œ ์ค‘๋ณต ๊ฐ์†Œ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

  1. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

๊ธฐ๋Šฅ๋ณ„ ํŒŒ์ผ ๋ถ„๋ฆฌ๋กœ ํŠน์ • ๊ธฐ๋Šฅ ์ˆ˜์ • ์‹œ ํŒŒ์ผ ๊ฐ„ ํƒ์ƒ‰ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋งž๋Š” ํšจ์œจ์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅ

  1. ํŒŒ์ผ ๊ตฌ์กฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ

์ผ๊ด€๋œ ๊ตฌ์กฐ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๋„ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ โ€‹

์ฃผ์š” ๊ธฐ๋Šฅ

Summary

  • ์‚ฌ์šฉ์ž ์œ„์น˜์™€ ๋‚ ์งœ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น ์‹œ์ ์˜ ๋‚ ์”จ์™€ ํ•จ๊ป˜ ootd ๊ฒŒ์‹œ๋ฌผ์„ ํฌ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•จ
  • ์นด์นด์˜ค ์ง€๋„ API, ์นด์นด์˜ค OAuth 2.0 ์‚ฌ์šฉ NAL-SEE QR

Sign Up & In

  • ์„ ํƒ ์ •๋ณด ์ž…๋ ฅ: ๊ฐœ์ธ ๋งž์ถคํ˜• ๊ฒŒ์‹œ๋ฌผ ์ œ๊ณต์„ ์œ„ํ•ด, ์ตœ์ดˆ ๊ฐ€์ž…์‹œ ์ฒดํ˜•, ์ฒด์งˆ, ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์„ ํƒ์ •๋ณด ์ž…๋ ฅ (๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ˆ˜์ • ๊ฐ€๋Šฅ)

  • ์นด์นด์˜ค ๊ฐ„ํŽธ ๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ: OAuth 2.0 ํ™œ์šฉ, Access/Refresh Token ์ฟ ํ‚ค ์ €์žฅ, ์„ธ์…˜ ๊ด€๋ฆฌ

    NAL-SEE QR alt text

Map & Weather

  • useCurrentLocation, useKakaoMap ์ปค์Šคํ…€ ํ›… ๊ตฌํ˜„ : ํƒ€ ๊ธฐ๋Šฅ์— ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž„

  • tanstack-query์˜ useQuery๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ

  • ํ˜„์žฌ ์œ„์น˜ ์‹ค์‹œ๊ฐ„ ๋‚ ์”จ ์กฐํšŒ: ์ƒ๋‹จ ๋‚ ์”จ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅ, ํด๋ฆญ์‹œ ํ™•์žฅ๋˜์–ด ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ

  • ์ง€๋„๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ฉฐ ์œ ์ € ์œ„์น˜ ๊ทผ์ฒ˜์˜ ๋‚ ์”จ ๋“œ๋กญ ํƒ์ƒ‰: ๊ตฌ์—ญ๋ณ„ ๊ฒ€์ƒ‰ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•ด ๋งˆ์ปค๋กœ ํ‘œ์‹œ

    alt text

Post

  • react hook form์œผ๋กœ multi-step form ๊ตฌํ˜„ ๋ฐ form data ์ƒํƒœ ๊ด€๋ฆฌ

  • zod๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์ตœ์ ํ™”๋œ validation

  • ์‚ฌ์ง„ ๋“ฑ๋ก (์ค‘๋ณต ๋ถˆ๊ฐ€, ์ตœ๋Œ€ 3์žฅ), ์—…๋กœ๋“œ ์œ„์น˜ ์ง€์ • (draggable marker ์ปค์Šคํ…€)

  • ์œ„์น˜ ์ง€์ •์œผ๋กœ ํ˜„์žฌ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์ €์žฅ (OpenWeatherMap API ํ™œ์šฉ)

    alt text

Feed

  • useInfiniteQuery๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„
  • ํ˜„์žฌ ์œ„์น˜ ๊ธฐ๋ฐ˜ ํ”ผ๋“œ ๋ฆฌ์ŠคํŠธ ํ‘œ์‹œ
  • ํ”ผ๋“œ ์‹ค์‹œ๊ฐ„ ์ข‹์•„์š”/๋Œ“๊ธ€ CRUD
  • ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ์กฐํšŒ: ๋‚ ์”จ ์ •๋ณด ๋ฐ ์‚ฌ์ง„ ์บ๋Ÿฌ์…€ ๋ ˆ์ด์•„์›ƒ alt text

My Page

  • ํ”„๋กœํ•„ ์„ ํƒ ์ •๋ณด ์ˆ˜์ •, ์•Œ๋ฆผ ์ˆ˜์‹  ์—ฌ๋ถ€ ์ˆ˜์ •

  • ํŒ”๋กœ์›Œ/ํŒ”๋กœ์ž‰ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๋ฐ ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ

  • ๋‚ด ํ”ผ๋“œ ์กฐํšŒ

  • REST API ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์•„์›ƒ, ํšŒ์›ํƒˆํ‡ด

    alt text

Message

  • Websocket (stomp/sockjs)์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ตฌํ˜„

  • SSE (Server-Sent-Event)๋กœ ์‚ฌ์šฉ์ž ์˜จ๋ผ์ธ ์ƒํƒœ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ

  • ์ฑ„ํŒ… ๋ชฉ๋ก์—์„œ ๋ฉ”์‹œ์ง€ ์ฝ์Œ ์ƒํƒœ ๋ฐ˜์˜

    alt text

Notification

  • FCM (Firebase Cloud Messaging)์œผ๋กœ ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ตฌํ˜„

  • ์ตœ์ดˆ ๋กœ๊ทธ์ธ ์‹œ ์•Œ๋ฆผ ์„ค์ • ํŒ์—…์œผ๋กœ ๊ถŒํ•œ ์š”์ฒญ

  • ๋ธŒ๋ผ์šฐ์ € ๊ถŒํ•œ ํ—ˆ์šฉ ์‹œ FCM ํ† ํฐ ์ƒ์„ฑ ๋ฐ ๋ฐฑ์—”๋“œ๋กœ ์ „์†ก

    alt text

๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 

Next.js vs React

React Logo

  • ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด๋ณด๋ฉด, ๋ณธ ์„œ๋น„์Šค๋Š” ์‹ค์‹œ๊ฐ„ ์œ ์ € ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํด๋ผ์ด์–ธํŠธ๋‹จ์—์„œ์˜ ์ธํ„ฐ๋ž™์…˜ ๋น„์ค‘์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋“ฑ Next.js๋งŒ์˜ ์ด์ ์„ ์„œ๋น„์Šค์— ์˜จ์ „ํžˆ ๋…น์—ฌ๋‚ด๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด Next.js์˜ App router๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ตœ๊ทผ์— ๋ฆด๋ฆฌ์ฆˆ๋˜์–ด, ํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ์˜ ์™„๋ฒฝํ•œ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์ด์— ์ตœ๋Œ€ํ•œ ์•ˆ์ •์ ์ด๊ณ  ์™„์„ฑ๋„ ์žˆ๋Š” ์„œ๋น„์Šค ๊ตฌ์ถ•์„ ์œ„ํ•ด Next.js๋„์ž…์„ ์ทจ์†Œํ•˜๊ณ  React ํ”„๋กœ์ ํŠธ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

TypeScript

TypeScript Logo

  • ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ฃผ๋ฉฐ, ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ
  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น์†Œ์ผ“๊ณผ SSE ๋ณ‘ํ–‰ ์‚ฌ์šฉ

WebSocket and SSE

  • ์›น์†Œ์ผ“(Stomp/SockJS) : ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์›น์†Œ์ผ“์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • SSE : ์‚ฌ์šฉ์ž์˜ ์˜จ๋ผ์ธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์ด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ์˜ ๋‹จ๋ฐฉํ–ฅ ์ด๋ฒคํŠธ ์ „์†ก์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ SSE๋Š” ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์ ํ•ฉํ•˜๋ฉฐ, ์›น์†Œ์ผ“๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

Zustand

Zustand Logo

  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
  • Redux์— ๋น„ํ•ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ ์–ด ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Vite

Vite Logo

  • ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ดˆ๊ธฐ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ HMR, ๋น ๋ฅธ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์ง€์›์œผ๋กœ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ์˜ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒํ•ด์ค€๋‹ค๋Š” ์ ๋„ ์žฅ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Tailwind CSS

Tailwind CSS Logo

  • ์œ ์—ฐํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•, ์ง๊ด€์ ์ธ ํด๋ž˜์Šค ์ด๋ฆ„, ๊ทธ๋ฆฌ๊ณ  ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ shadcn/ui์™€์˜ ํ˜ธํ™˜์„ฑ๋„ ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Shadcn/ui

Shadcn/ui Logo

  • ์ ‘๊ทผ์„ฑ๊ณผ ๋””์ž์ธ์ด ๊ณ ๋ ค๋œ ๊ณ ํ’ˆ์งˆ์˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • Tailwind CSS์™€ ์ž˜ ํ†ตํ•ฉ๋˜์–ด ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

React Router

  • ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ
  • ๋™์  ๋ผ์šฐํŒ…๊ณผ ์ค‘์ฒฉ ๋ผ์šฐํŒ…์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PWA

PWA Logo

  • nalsee ์„œ๋น„์Šค ํŠน์„ฑ์ƒ ๋ฐ์Šคํฌํƒ‘๋ณด๋‹ค๋Š” ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์„ฑ์ด ๋‘๋“œ๋Ÿฌ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ์›น๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์ด๋ฉด์„œ๋„ ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ์„ฑ์„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” Progressive Web App์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์˜ ์ˆ˜๋™ ์—…๋ฐ์ดํŠธ ์—†์ด๋„ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ , ์›น ๊ฒ€์ƒ‰๋งŒ์œผ๋กœ๋„ ์–ดํ”Œ์„ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ ‘๊ทผ์„ฑ ๋“ฑ์˜ ์žฅ์ ์ด ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Axios

Axios Logo

  • ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์‰ฝ๊ฒŒ ์ธํ„ฐ์…‰ํŠธํ•˜๊ณ  ๋ณ€ํ˜• / ์ž๋™์œผ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์šฉ์ด

MSW

MSW Logo

  • ๋ฐฑ์—”๋“œ API์™€๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์ง„ํ–‰์‹œ ์‹ค์ œ ํ†ต์‹ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ๋ชจํ‚น API๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

AWS (S3 + Cloudfront + Route53) + Github Actions

  • ์ •์  ๋ฐฐํฌ ๋„๊ตฌ๋กœ AWS๋ฅผ, ๋นŒ๋“œ ๋ฐ S3 ์‹ฑํฌ๋ถ€ํ„ฐ CDN ํŒŒ์ผ invalidate ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Github Actions๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Cloudfront๋Š” ๋‹จ์ˆœํžˆ S3๋งŒ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด์—์„œ ์šฐ์ˆ˜ํ•˜๊ธฐ์— ์„ ํƒํ–ˆ์œผ๋ฉฐ, ์„œ๋ธŒ๋„๋ฉ”์ธ ์„ค์ •์„ ์œ„ํ•ด Route53์„ ํ•จ๊ป˜ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Krampoline & Docker hub + Github Actions

  • ํฌ๋žจํด๋ฆฐ D2hub์—์„œ ๋นŒ๋“œ ์ „ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ๊ด€๊ณ„๋กœ, Docker hub๋กœ ์ด๋ฏธ์ง€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž… ๋ฐ ๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œ, ํ‘ธ์‰ฌ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Github Action์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

1. ๋ธŒ๋ผ์šฐ์ €๊ฐ„ ์ƒ์ดํ•œ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ์ •์ฑ…

  • Backend ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์‚ฌ๋ก€์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ์ดˆ๋ฐ˜์—๋Š” Cross-site ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ์šฐํšŒํ•˜๊ณ ์ž ํ•„์š”ํ•œ ์„ค์ •์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Safari ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ, ๋” ๊ฐ•๋ ฅํ•œ ๋ณดํ˜ธ์ •์ฑ…์„ ์ ์šฉํ•˜์—ฌ cross-site ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๋ฐฉ์‹์œผ๋กœ JWT ํ† ํฐ์„ ์ฟ ํ‚ค์— ๋‹ด๋Š” ์ƒํ™ฉ์—์„œ ๋ฐ˜๋“œ์‹œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • mixed-content๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹ ๋˜ํ•œ Safari๊ฐ€ ๋” ์—„๊ฒฉํ•ด, ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ›„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๊ฐ€ ๊นจ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

    โœ… ํ•ด๊ฒฐ

    • ์ฟ ํ‚ค์˜ ๊ฒฝ์šฐ, ๋ฐฐํฌ ์„œ๋ธŒ๋„๋ฉ”์ธ(CNAME)์„ ์„ค์ •ํ•ด์คŒ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฏธ์ง€ ์†Œ์Šค url์˜ ๊ฒฝ์šฐ http โ†’ https๋กœ ๊ต์ฒดํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด ์ ์šฉํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๋ธŒ๋ผ์šฐ์ € geolocation API์˜ ์†๋„ ์ง€์—ฐ

  • ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด navigator.geolocation API๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์‹ค์ œ ์œ„์น˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊นŒ์ง€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ˆ˜ ์ดˆ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ง€๋„ ํ™”๋ฉด ์ „์ฒด๊ฐ€ ๋กœ๋”ฉ ์ƒํƒœ๋กœ ํ‘œ์‹œ๋˜์–ด, ์œ ์ € ๊ฒฝํ—˜์„ ํ•ด์น˜๊ณ  ์„œ๋น„์Šค๊ฐ€ ๋งค๋„๋Ÿฝ์ง€ ๋ชปํ•˜๋‹ค๋Š” ์ธ์ƒ์„ ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    โœ… ํ•ด๊ฒฐ

    • ๊ธฐ๋ณธ ์ขŒํ‘œ๋ฅผ ์ง€์ •ํ•ด๋‘๊ณ , ์ดˆ๊ธฐ์—๋Š” ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง€๋„๋ฅผ ์šฐ์„  ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์‹ค์ œ ์œ„์น˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ํ˜„์žฌ ์œ„์น˜ ๋งˆ์ปค๋ฅผ ํšŒ์ƒ‰์œผ๋กœ, ์œ„์น˜๊ฐ€ ์ ์šฉ๋œ ํ›„์—๋Š” ์ปฌ๋Ÿฌ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€๋„ ํ™”๋ฉด ๋‚ด์—์„œ ์œ„์น˜ ์ƒํƒœ์˜ ๋ณ€ํ™”๋ฅผ ์‹œ๊ฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์œ ์ €์˜ ๋งˆ์ง€๋ง‰ ์ ‘์† ์œ„์น˜๋ฅผ localStorage์— ์ €์žฅํ•˜๊ณ , ์žฌ ์ ‘์†์‹œ ํ•ด๋‹น ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๋‚™๊ด€์  UI ์—…๋ฐ์ดํŠธ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ API์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๋ฅผ ์–ด๋А์ •๋„ ๊ฐ์ถœ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

3. Notification API์˜ ์ œ์•ฝ์‚ฌํ•ญ

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์•Œ๋ฆผ ๊ถŒํ•œ ์„ค์ • ํŒ์—…์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•ด๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ์ €๊ฐ€ ์ง์ ‘ ๋ธŒ๋ผ์šฐ์ €์˜ ์„ค์ •์„ ์กฐ์ž‘ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋น„์Šค ๋‚ด์—์„œ ์•Œ๋žŒ ํ™œ์„ฑ/๋น„ํ™œ์„ฑํ™”์‹œ ์„œ๋น„์Šค์›Œ์ปค์˜ ์„ค์ • ์ƒํƒœ์™€ ๋ธŒ๋ผ์šฐ์ € ์•Œ๋ฆผ ๊ถŒํ•œ ์ƒํƒœ๊ฐ€ ๋ถˆ์ผ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    โœ… ํ•ด๊ฒฐ

    • UX๋กœ ์ฐจ์„ ์ฑ…์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
      • ์ตœ์ดˆ ๊ฐ€์ž…์‹œ โ€˜์•Œ๋ฆผ ํ—ˆ์šฉํ•˜๊ธฐโ€™๋ฒ„ํŠผ์ด ์ถ”๊ฐ€๋œ ํŒ์—…์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ง์ ‘์ ์ธ ์•Œ๋ฆผ ์„ค์ •์„ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
      • ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์•Œ๋ฆผ ์—ฌ๋ถ€๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•Œ๋ฆผ์„ ํ•ด์ œํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ๊ถŒํ•œ ์„ค์ •์„ ๋”ฐ๋กœ ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ํŒ์—…์œผ๋กœ ์•ˆ๋‚ดํ•˜๋ฉฐ UX์ ์ธ ํ๋ฆ„์œผ๋กœ ํ’€์–ด ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •