2025.12.19 ~ ing
Finders๋ ํ๋ฆ ์นด๋ฉ๋ผ ์ฌ์ฉ์๊ฐ ์น์์ ํ์์๋ฅผ ํ์ํ๊ณ , ์์ฝ๊ณผ ๊ฒฐ์ ๊น์ง ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋๋ ์๋น์ค์ ๋๋ค. AI ์ฌ์ง ๋ณต์, ์ปค๋ฎค๋ํฐ ํผ๋, ํ๋ฆ ์นด๋ฉ๋ผ ๊ฐ์ด๋ ๋ฑ ํ๋ฆ ๋ผ์ดํ ์ ๋ฐ์ ์์ฐ๋ฅด๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
| Feature | Description |
|---|---|
| ๋ก๊ทธ์ธ / ํ์๊ฐ์ | ์นด์นด์คํก ๊ธฐ๋ฐ ์์ ๋ก๊ทธ์ธ |
| ํ์นด ์ ๋ฌธ 101 | ํ๋ฆ ์นด๋ฉ๋ผ ์ ๋ฌธ์๋ฅผ ์ํ ๊ฐ์ด๋ ์ฝํ ์ธ |
| AI ์ฌ์ง ๋ณต์ | Replicate AI ๊ธฐ๋ฐ ์ฌ์ง ๋ณต์ ๊ธฐ๋ฅ |
| ํ์์ ๋ณด๊ธฐ | ์์นยท๊ฐ๊ฒฉยท๋ฆฌ๋ทฐ ๊ธฐ๋ฐ ํ์์ ๊ฒ์ |
| ์จ๋ผ์ธ ์์ฝ | ๋ ์งยท์ต์ ์ ํ์ ํตํ ๋น๋๋ฉด ์์ฝ |
| ์ฌ์ง ์๋ค | ์ฌ์ง ๊ณต์ ๋ฐ ์ปค๋ฎค๋ํฐ ์ํต ๊ธฐ๋ฅ |
| ํ์ ๊ด๋ฆฌ | ํ์ ์๋ฃ ์ฌ์ง ๊ด๋ฆฌ, ๋ฐฐ์ก ๋ฐ ๋ฐฉ๋ฌธ ์๋ น ์ํ ํ์ธ |
๋๋ฉ์ธ ๊ธฐ์ค(
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์ค์ฌ์ผ๋ก ์ธ์ฆ/ํ ํฐ ๊ด๋ฆฌ ๋ก์ง์ ์ง์ค์์ผ ์ค๋ณต๊ณผ ์ทจ์ฝ์ ์ ์ค์์ต๋๋ค.
์ํฌ๋ถ ๊ธฐ๋ฐ ํ์ต์ ๋์ด, ์ค์ ์๋น์ค ์์ค์ ์์ ์ฑ๊ณผ ํ์ฅ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด
์๋ ๊ธฐ์ ๋ฐ ํจํด์ ์ถ๊ฐ ๋์ ํ์ต๋๋ค.
๊ฐ ํญ๋ชฉ์ ์ ์ ์ด์ ์ ํ ํฉ์ ์ฌ๋ถ๋ฅผ ๋ช ์ํฉ๋๋ค.
๐ 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 ๊ฐ์ฒด๋ก ์ ๊ทผ ๋ก์ง์ ๋จ์ผํํ์ต๋๋ค.
ํ ํฉ์
์ถํ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ ๋ฑ ์ ์ฅ์ ์ ์ฑ
๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋๋ก ํ์ฌ๋ ํจํด ๋์
์ ํฉ์ํ์ต๋๋ค.
โก Vite + PNPM
์ ์ ์ด์
Vite๋ ๋น ๋ฅธ HMR๊ณผ ๋น๋ ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, PNPM์ ๋์คํฌ ๊ณต๊ฐ ํจ์จ์ฑ๊ณผ ์์กด์ฑ ์ถฉ๋ ๋ฐฉ์ง ์ธก๋ฉด์์ ์ฅ์ ์ด ์์ต๋๋ค.
๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ํ๋ก์ ํธ ํ์ฅ์ฑ์ ๋์์ ๊ณ ๋ คํด ํด๋น ์กฐํฉ์ ์ ํํ์ต๋๋ค.
ํ ํฉ์
ํ๋ก์ ํธ ์ด๊ธฐ๋ถํฐ ์ต์ ํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ํ ํ์ค์ผ๋ก ํ์ ํ์ต๋๋ค.
๐ค GitHub Actions + Husky
์ ์ ์ด์
PR ๋จ๊ณ์์ ์๋ ๋ฆฐํธ ๋ฐ ๋น๋ ํ
์คํธ๋ฅผ ์ํํ๊ณ , ์ปค๋ฐ ๋จ๊ณ์์ ํฌ๋งท ๋ฐ ๋ฆฐํธ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ์ฐจ๋จํ์ฌ ์ฝ๋ ํ์ง์ ์ ์งํ๊ธฐ ์ํจ์
๋๋ค.
ํ ํฉ์
โํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํโ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์๋ํ๋ ํ์ง ๊ฒ์ดํธ ์ด์์ ํฉ์ํ์ต๋๋ค.
๐งญ Path Aliasing (@/)
์ ์ ์ด์
์๋ ๊ฒฝ๋ก ์ค์ฒฉ์ ์ ๊ฑฐํ์ฌ ๊ฐ๋
์ฑ์ ๋์ด๊ณ , ํ์ผ ์ด๋ ์ import ๊ฒฝ๋ก๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฃจํธ ๊ธฐ์ค ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋์
ํ์ต๋๋ค.
ํ ํฉ์
ํ๋ก์ ํธ ์ ๋ฐ์์ ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ์ ๊ณต์ ๊ท์น์ผ๋ก ํ์คํํ์ต๋๋ค.
๐จ SVGR
์ ์ ์ด์
SVG๋ฅผ React ์ปดํฌ๋ํธ๋ก ๋ณํํ์ฌ Props ๋ฐ Tailwind ๊ธฐ๋ฐ ๋์ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
ํ ํฉ์
์์ด์ฝ ์์ฐ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด ๋์
์ ํฉ์ํ์ต๋๋ค.
๐งฑ React Masonry CSS
์ ์ ์ด์
์ฌ์ง ์ปค๋ฎค๋ํฐ ํผ๋์์ ๋ค์ํ ๋น์จ์ ์ด๋ฏธ์ง๋ฅผ ๋นํ ์์ด ๋ฐฐ์นํ๊ธฐ ์ํด Masonry ๋ ์ด์์์ ์ ์ฉํ์ต๋๋ค.
ํ ํฉ์
์ปค๋ฎค๋ํฐ UX ์์ฑ๋ ํฅ์์ ์ํด ์ ๋ด ๋ ์ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ํฉ์ํ์ต๋๋ค.
๐ React Daum Postcode
์ ์ ์ด์
๊ตญ๋ด ์ฌ์ฉ์์๊ฒ ์ต์ํ ์ฃผ์ ๊ฒ์ UX๋ฅผ ์ ๊ณตํ๊ณ , ๋๋ก๋ช
์ฃผ์ ์
๋ ฅ ์ ํ๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋์
ํ์ต๋๋ค.
ํ ํฉ์
์ค์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ ์ ์ํด ๋์
์ ํฉ์ํ์ต๋๋ค.
main: ์ด์develop: ๊ฐ๋ฐ- ๋ชจ๋ ์์ ๋ธ๋์น๋ develop ๊ธฐ์ค ์์ฑ
type: ๋ฉ์์ง (#์ด์๋ฒํธ)- feat / fix / refactor / style / chore / docs
- Base: develop
- ์ ๋ชฉ: [FEAT] ํ์๊ฐ์ API ์ฐ๋
- Issue ์ฐ๊ฒฐ: Closes #10
- 24์๊ฐ ๋ด ๋ฆฌ๋ทฐ ํ์
UMC 9th ยท Finders ยท Web



