Skip to content

๐ŸŽž๏ธFinders ํ”„๋กœ์ ํŠธ ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ.

Notifications You must be signed in to change notification settings

Finders-Official/FE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1,186 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Image

๐Ÿ—“๏ธ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

2025.12.19 ~ ing


๐Ÿ“ฑ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

Finders๋Š” ํ•„๋ฆ„ ์นด๋ฉ”๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์—์„œ ํ˜„์ƒ์†Œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ์˜ˆ์•ฝ๊ณผ ๊ฒฐ์ œ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. AI ์‚ฌ์ง„ ๋ณต์›, ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ, ํ•„๋ฆ„ ์นด๋ฉ”๋ผ ๊ฐ€์ด๋“œ ๋“ฑ ํ•„๋ฆ„ ๋ผ์ดํ”„ ์ „๋ฐ˜์„ ์•„์šฐ๋ฅด๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โญ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

Feature Description
๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž… ์นด์นด์˜คํ†ก ๊ธฐ๋ฐ˜ ์†Œ์…œ ๋กœ๊ทธ์ธ
ํ•„์นด ์ž…๋ฌธ 101 ํ•„๋ฆ„ ์นด๋ฉ”๋ผ ์ž…๋ฌธ์ž๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ ์ฝ˜ํ…์ธ 
AI ์‚ฌ์ง„ ๋ณต์› Replicate AI ๊ธฐ๋ฐ˜ ์‚ฌ์ง„ ๋ณต์› ๊ธฐ๋Šฅ
ํ˜„์ƒ์†Œ ๋ณด๊ธฐ ์œ„์น˜ยท๊ฐ€๊ฒฉยท๋ฆฌ๋ทฐ ๊ธฐ๋ฐ˜ ํ˜„์ƒ์†Œ ๊ฒ€์ƒ‰
์˜จ๋ผ์ธ ์˜ˆ์•ฝ ๋‚ ์งœยท์˜ต์…˜ ์„ ํƒ์„ ํ†ตํ•œ ๋น„๋Œ€๋ฉด ์˜ˆ์•ฝ
์‚ฌ์ง„ ์ˆ˜๋‹ค ์‚ฌ์ง„ ๊ณต์œ  ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์†Œํ†ต ๊ธฐ๋Šฅ
ํ˜„์ƒ ๊ด€๋ฆฌ ํ˜„์ƒ ์™„๋ฃŒ ์‚ฌ์ง„ ๊ด€๋ฆฌ, ๋ฐฐ์†ก ๋ฐ ๋ฐฉ๋ฌธ ์ˆ˜๋ น ์ƒํƒœ ํ™•์ธ
Image Image Image Image Image Image

๐Ÿ‘ฉโ€๐Ÿ’ป Web ํŒŒํŠธ

๊น€๋ฏผ์„ ๊น€ํ˜œ๋ฆฐ ์ „๋ณ‘๊ตญ ํ•œํ˜„์„œ
๊น€๋ฏผ์„ ๊น€ํ˜œ๋ฆฐ ์ „๋ณ‘๊ตญ ํ•œํ˜„์„œ
Web Developer Web Developer Web Developer Web Developer
ํ˜„์ƒ์†Œ ๋ณด๊ธฐ
์˜จ๋ผ์ธ ์˜ˆ์•ฝ
ํ˜„์ƒ๊ด€๋ฆฌ
์‚ฌ์ง„์ˆ˜๋‹ค ์ปค๋ฎค๋‹ˆํ‹ฐ
ํ˜„์ƒ๊ด€๋ฆฌ
๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž…
๋งˆ์ดํŽ˜์ด์ง€
ํ˜„์ƒ๊ด€๋ฆฌ
๋ฉ”์ธํŽ˜์ด์ง€
AI ์‚ฌ์ง„ ๋ณต์›
ํ˜„์ƒ๊ด€๋ฆฌ

โš’๏ธ ๊ธฐ์ˆ  Stack

์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 
UI Library React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ณ , ์ƒํƒœ๊ณ„๊ฐ€ ์•ˆ์ •์ ์ธ SPA ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ
Language TypeScript ์ •์  ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ๋กœ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , API ๊ณ„์•ฝ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Build Tool Vite ๋น ๋ฅธ HMR๊ณผ ๋นŒ๋“œ ์†๋„๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ
Styling TailwindCSS SVGR ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง์œผ๋กœ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•˜๊ณ , SVG๋ฅผ ์ปดํฌ๋„ŒํŠธํ™”ํ•˜์—ฌ ๋™์  ์ œ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Server State Management TanStack Query ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ, ๋™๊ธฐํ™”, ์žฌ์š”์ฒญ ์ „๋žต์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋น„์šฉ์„ ์ค„์ด๊ณ  UX๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Global State Management Zustand ๊ฒฝ๋Ÿ‰ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด ์ธ์ฆ/ํ•„ํ„ฐ ์ƒํƒœ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ
HTTP Client Axios ์ธํ„ฐ์…‰ํ„ฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ฒ˜๋ฆฌ ๋ฐ ๊ณตํ†ต ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Routing React Router SPA ํ™˜๊ฒฝ์—์„œ ์„ ์–ธ์  ๋ผ์šฐํŒ… ๋ฐ ๋ ˆ์ด์•„์›ƒ ๋ถ„๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Package Manager pnpm ๋””์Šคํฌ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ๊ณผ ์˜์กด์„ฑ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์„ ํƒ
Code Quality ESLint Prettier Husky ์ฝ”๋“œ ์Šคํƒ€์ผ ์ผ๊ด€์„ฑ๊ณผ PR ํ’ˆ์งˆ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์ž๋™ํ™”๋œ ๋ฆฐํŠธ/ํฌ๋งทํŒ… ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•
Error Monitoring Sentry ๋ฐฐํฌ ํ›„ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์‹ค์‹œ๊ฐ„ ์ถ”์ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์šด์˜ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…
Deployment / CI Vercel GitHub Actions ์ž๋™ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Collaboration GitHub Notion Figma Discord ๋””์ž์ธ ํ˜‘์—…, ๋ฌธ์„œํ™”, ์ด์Šˆ ๊ด€๋ฆฌ ๋ฐ ์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์œ„ํ•ด ํ™œ์šฉ

๐Ÿ“ ํด๋” ๊ตฌ์กฐ

๋„๋ฉ”์ธ ๊ธฐ์ค€(photoLab, photoFeed, photoManage, photoRestoration ๋“ฑ)์œผ๋กœ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜๊ณ , API / Query Hook / UI / Type / Store๋ฅผ ์—ญํ• ๋ณ„๋กœ ๋ถ„๋ฆฌํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.

โ””โ”€โ”€ ๐Ÿ“ src/
    โ”œโ”€โ”€ ๐ŸŒ apis/                 // ๋„๋ฉ”์ธ๋ณ„ API ์š”์ฒญ ๋ชจ๋“ˆ (Barrel Pattern: index.ts)
    โ”‚   โ”œโ”€โ”€ auth/
    โ”‚   โ”œโ”€โ”€ file/
    โ”‚   โ”œโ”€โ”€ mainPage/
    โ”‚   โ”œโ”€โ”€ member/
    โ”‚   โ”œโ”€โ”€ my/
    โ”‚   โ”œโ”€โ”€ photoFeed/
    โ”‚   โ”œโ”€โ”€ photoLab/
    โ”‚   โ”œโ”€โ”€ photoManage/
    โ”‚   โ””โ”€โ”€ photoRestoration/
    โ”‚
    โ”œโ”€โ”€ ๐Ÿ” hooks/                // ๋„๋ฉ”์ธ๋ณ„ Query Hook + ๊ณตํ†ต ํ›… (์บก์Аํ™”๋œ ์ฟผ๋ฆฌ ํ›… ์ „๋žต)
    โ”‚   โ”œโ”€โ”€ auth/
    โ”‚   โ”œโ”€โ”€ common/
    โ”‚   โ”œโ”€โ”€ file/
    โ”‚   โ”œโ”€โ”€ mainPage/
    โ”‚   โ”œโ”€โ”€ member/
    โ”‚   โ”œโ”€โ”€ my/
    โ”‚   โ”œโ”€โ”€ photoFeed/
    โ”‚   โ”œโ”€โ”€ photoLab/
    โ”‚   โ”œโ”€โ”€ photoManage/
    โ”‚   โ””โ”€โ”€ photoRestoration/
    โ”‚
    โ”œโ”€โ”€ ๐Ÿงฉ components/           // UI ์ปดํฌ๋„ŒํŠธ (๊ณตํ†ต/๋„๋ฉ”์ธ ๋‹จ์œ„ ๋ถ„๋ฆฌ)
    โ”‚   โ”œโ”€โ”€ common/
    โ”‚   โ”œโ”€โ”€ auth/
    โ”‚   โ”œโ”€โ”€ mainPage/
    โ”‚   โ”œโ”€โ”€ mypage/
    โ”‚   โ”œโ”€โ”€ photoFeed/
    โ”‚   โ”œโ”€โ”€ photoLab/
    โ”‚   โ”œโ”€โ”€ photoManage/
    โ”‚   โ””โ”€โ”€ photoRestoration/
    โ”‚
    โ”œโ”€โ”€ ๐Ÿ“„ pages/                // ๋ผ์šฐํŠธ ๋‹จ์œ„ ํŽ˜์ด์ง€(์ง„์ž…์ )
    โ”‚   โ”œโ”€โ”€ auth/
    โ”‚   โ”œโ”€โ”€ developmentHistory/
    โ”‚   โ”œโ”€โ”€ filmCameraGuide/
    โ”‚   โ”œโ”€โ”€ mainPage/
    โ”‚   โ”œโ”€โ”€ mypage/
    โ”‚   โ”œโ”€โ”€ photoFeed/
    โ”‚   โ”œโ”€โ”€ photoLab/
    โ”‚   โ”œโ”€โ”€ photoManage/
    โ”‚   โ””โ”€โ”€ photoRestoration/
    โ”‚
    โ”œโ”€โ”€ ๐Ÿงฑ layouts/              // ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ (Root/Footer/MyPage ๋“ฑ)
    โ”œโ”€โ”€ ๐Ÿงญ router/               // ๋ผ์šฐํŒ… ๊ตฌ์„ฑ (Router.tsx)
    โ”œโ”€โ”€ ๐Ÿ—‚ store/                // ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ (Zustand)
    โ”‚
    โ”œโ”€โ”€ ๐Ÿงฌ types/                // ๋„๋ฉ”์ธ๋ณ„ ํƒ€์ž… ์ •์˜ + ApiResponse<T>
    โ”œโ”€โ”€ ๐Ÿ“š constants/            // ์ƒ์ˆ˜/๋ผ๋ฒจ/๋งคํ•‘ ๊ฐ’
    โ”œโ”€โ”€ ๐Ÿ›  utils/                // ์ˆœ์ˆ˜ ์œ ํ‹ธ ํ•จ์ˆ˜
    โ”œโ”€โ”€ โš™๏ธ lib/                  // ์ „์—ญ ์„ค์ • (axios instance, interceptors ๋“ฑ)
    โ”œโ”€โ”€ ๐Ÿ–ผ assets/               // ํฐํŠธ/์•„์ด์ฝ˜/SVG/์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค
    โ”‚
    โ”œโ”€โ”€ ๐Ÿš€ App.tsx               // ์•ฑ ์—”ํŠธ๋ฆฌ UI
    โ””โ”€โ”€ ๐Ÿ”ฅ main.tsx              // ์•ฑ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ
๐Ÿ“Œ ๊ตฌ์กฐ ์„ค๊ณ„ ํฌ์ธํŠธ
  • ๋„๋ฉ”์ธ ๊ธฐ์ค€ ํด๋”๋ง: photoLab, photoFeed, photoManage, photoRestoration ๋“ฑ ์„œ๋น„์Šค ๊ธฐ๋Šฅ ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • API / Hook / UI / Type ์—ญํ•  ๋ถ„๋ฆฌ: ํ•œ ๋„๋ฉ”์ธ์—์„œ๋„ apis/, hooks/, components/, types/๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ•ด ๋ณ€๊ฒฝ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์ค„์˜€์Šต๋‹ˆ๋‹ค.
  • Barrel Pattern: apis/*/index.ts, hooks/*/index.ts๋ฅผ ํ™œ์šฉํ•ด ์™ธ๋ถ€์—์„œ๋Š” ๋‹จ์ˆœํ•œ import ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Interceptors / Storage ๋‹จ์ผํ™”: lib/setUpInterceptors.ts, utils/tokenStorage.ts ์ค‘์‹ฌ์œผ๋กœ ์ธ์ฆ/ํ† ํฐ ๊ด€๋ฆฌ ๋กœ์ง์„ ์ง‘์ค‘์‹œ์ผœ ์ค‘๋ณต๊ณผ ์ทจ์•ฝ์ ์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿค– ๊ธฐ์ˆ  ์˜์‚ฌ๊ฒฐ์ • (์›Œํฌ๋ถ ์™ธ ์„ ํƒ ๊ธฐ์ˆ )

์›Œํฌ๋ถ ๊ธฐ๋ฐ˜ ํ•™์Šต์„ ๋„˜์–ด, ์‹ค์ œ ์„œ๋น„์Šค ์ˆ˜์ค€์˜ ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด
์•„๋ž˜ ๊ธฐ์ˆ  ๋ฐ ํŒจํ„ด์„ ์ถ”๊ฐ€ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ํ•ญ๋ชฉ์€ ์„ ์ • ์ด์œ ์™€ ํŒ€ ํ•ฉ์˜ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ณ ๋„ํ™” ํŒจํ„ด

๐Ÿ” API ์š”์ฒญ ๋™์‹œ์„ฑ ์ œ์–ด (Concurrency Control in Interceptors)

์„ ์ • ์ด์œ 
ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ ์—ฌ๋Ÿฌ API ์š”์ฒญ์ด ๋™์‹œ์— ์‹คํŒจํ•˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ์š”์ฒญ์ด ์ค‘๋ณต ๋ฐœ์ƒํ•˜๋Š” Race Condition ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํŒจ ์š”์ฒญ์„ Pending Queue์— ์ €์žฅํ•˜๊ณ , ํ† ํฐ ๊ฐฑ์‹  ํ›„ ๋Œ€๊ธฐ ์š”์ฒญ์„ ์ผ๊ด„ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
์ธ์ฆ ์•ˆ์ •์„ฑ์€ ์„œ๋น„์Šค ์‹ ๋ขฐ์„ฑ๊ณผ ์ง๊ฒฐ๋œ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ, ๋‹จ์ˆœ ์žฌ์š”์ฒญ ๋ฐฉ์‹์ด ์•„๋‹Œ ํ ๊ธฐ๋ฐ˜ ๋™์‹œ์„ฑ ์ œ์–ด ๋กœ์ง์„ ํ”„๋กœ์ ํŠธ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฉ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„œ๋น„์Šค ๊ณ„์ธต + Barrel Pattern

์„ ์ • ์ด์œ 
์ปดํฌ๋„ŒํŠธ์™€ API ํ˜ธ์ถœ ๋กœ์ง์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด auth, member, photoLab ๋“ฑ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์„œ๋น„์Šค ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ index.ts ๊ธฐ๋ฐ˜ Barrel Pattern์„ ํ™œ์šฉํ•ด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์€๋‹‰ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
๋ฐฑ์—”๋“œ API ๋ช…์„ธ ๋ณ€๊ฒฝ ์‹œ ์ˆ˜์ • ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ์•„ํ‚คํ…์ฒ˜๋กœ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ฆ ์บก์Аํ™”๋œ ์ฟผ๋ฆฌ ํ›… (Encapsulated Query Hooks)

์„ ์ • ์ด์œ 
useQuery๋ฅผ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ํ‚ค ์ค‘๋ณต, ์บ์‹ฑ ์ „๋žต ๋ถˆ์ผ์น˜, ์ •์ฑ… ๋ถ„์‚ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ๋ณ„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๊ฐ์‹ธ ์ฟผ๋ฆฌ ํ‚ค ๋ฐ ์บ์‹ฑ ์ „๋žต(staleTime ๋“ฑ)์„ ์ผ์›ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
UI๋Š” ๋ฐ์ดํ„ฐ ํ‘œํ˜„์— ์ง‘์ค‘ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ •์ฑ…์€ ํ›… ๊ณ„์ธต์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ์›์น™์„ ํŒ€ ๊ทœ์น™์œผ๋กœ ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฌ ์ œ๋„ค๋ฆญ ๊ธฐ๋ฐ˜ API ์‘๋‹ต ํƒ€์ž… ์„ค๊ณ„ (ApiResponse<T>)

์„ ์ • ์ด์œ 
๋ชจ๋“  API ์‘๋‹ต ๊ตฌ์กฐ๋ฅผ ApiResponse<T> ํ˜•ํƒœ๋กœ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ํƒ€์ž… ์ถ”๋ก ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ณตํ†ต ์‘๋‹ต ํƒ€์ž…์„ ์ „ API์— ์ผ๊ด„ ์ ์šฉํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—„๏ธ ์Šคํ† ๋ฆฌ์ง€ ํŒŒ์‚ฌ๋“œ ํŒจํ„ด (Storage Facade Pattern)

์„ ์ • ์ด์œ 
ํ† ํฐ ์ ‘๊ทผ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๋ถ„์‚ฐ๋  ๊ฒฝ์šฐ ์ค‘๋ณต ์ฝ”๋“œ ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด tokenStorage ๊ฐ์ฒด๋กœ ์ ‘๊ทผ ๋กœ์ง์„ ๋‹จ์ผํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
์ถ”ํ›„ ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋“ฑ ์ €์žฅ์†Œ ์ •์ฑ… ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒŒ์‚ฌ๋“œ ํŒจํ„ด ๋„์ž…์— ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ์ธํ”„๋ผ

โšก Vite + PNPM

์„ ์ • ์ด์œ 
Vite๋Š” ๋น ๋ฅธ HMR๊ณผ ๋นŒ๋“œ ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, PNPM์€ ๋””์Šคํฌ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ๊ณผ ์˜์กด์„ฑ ์ถฉ๋Œ ๋ฐฉ์ง€ ์ธก๋ฉด์—์„œ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๊ณผ ํ”„๋กœ์ ํŠธ ํ™•์žฅ์„ฑ์„ ๋™์‹œ์— ๊ณ ๋ คํ•ด ํ•ด๋‹น ์กฐํ•ฉ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์ตœ์ ํ™”๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ํŒ€ ํ‘œ์ค€์œผ๋กœ ํ™•์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค– GitHub Actions + Husky

์„ ์ • ์ด์œ 
PR ๋‹จ๊ณ„์—์„œ ์ž๋™ ๋ฆฐํŠธ ๋ฐ ๋นŒ๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ํฌ๋งท ๋ฐ ๋ฆฐํŠธ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
โ€œํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœโ€๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ํ™”๋œ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ์šด์˜์— ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงญ Path Aliasing (@/)

์„ ์ • ์ด์œ 
์ƒ๋Œ€ ๊ฒฝ๋กœ ์ค‘์ฒฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ํŒŒ์ผ ์ด๋™ ์‹œ import ๊ฒฝ๋กœ๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ๊ธฐ์ค€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์—์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์‚ฌ์šฉ์„ ๊ณต์‹ ๊ทœ์น™์œผ๋กœ ํ‘œ์ค€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ UI/UX ํŠนํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐ŸŽจ SVGR

์„ ์ • ์ด์œ 
SVG๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Props ๋ฐ Tailwind ๊ธฐ๋ฐ˜ ๋™์  ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
์•„์ด์ฝ˜ ์ž์‚ฐ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋„์ž…์— ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฑ React Masonry CSS

์„ ์ • ์ด์œ 
์‚ฌ์ง„ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ์—์„œ ๋‹ค์–‘ํ•œ ๋น„์œจ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋นˆํ‹ˆ ์—†์ด ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด Masonry ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
์ปค๋ฎค๋‹ˆํ‹ฐ UX ์™„์„ฑ๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ „๋‹ด ๋ ˆ์ด์•„์›ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์— ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ  React Daum Postcode

์„ ์ • ์ด์œ 
๊ตญ๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ต์ˆ™ํ•œ ์ฃผ์†Œ ๊ฒ€์ƒ‰ UX๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋„๋กœ๋ช… ์ฃผ์†Œ ์ž…๋ ฅ ์ •ํ™•๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€ ํ•ฉ์˜
์‹ค์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋„์ž…์— ํ•ฉ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐ŸŒฟ ๋ธŒ๋žœ์น˜ ์ „๋žต

  • main : ์šด์˜
  • develop : ๊ฐœ๋ฐœ
  • ๋ชจ๋“  ์ž‘์—… ๋ธŒ๋žœ์น˜๋Š” develop ๊ธฐ์ค€ ์ƒ์„ฑ

๐Ÿ’ฌ Commit ๋ฉ”์‹œ์ง€

type: ๋ฉ”์‹œ์ง€ (#์ด์Šˆ๋ฒˆํ˜ธ)
  • feat / fix / refactor / style / chore / docs

๐Ÿ”€ Pull Request

  • Base: develop
  • ์ œ๋ชฉ: [FEAT] ํšŒ์›๊ฐ€์ž… API ์—ฐ๋™
  • Issue ์—ฐ๊ฒฐ: Closes #10
  • 24์‹œ๊ฐ„ ๋‚ด ๋ฆฌ๋ทฐ ํ•„์ˆ˜

UMC 9th ยท Finders ยท Web

About

๐ŸŽž๏ธFinders ํ”„๋กœ์ ํŠธ ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5

Languages