์ํฌ๋ฃจํธ | ๊ตฌ์ธ๊ตฌ์ง ํ๋ซํผ
๊ฐํธํ ์๋ฐ ๊ตฌ์ธ๊ตฌ์ง ํ๋ซํผ, ์ํฌ๋ฃจํธ์์ ์์ํ์ธ์.
www.workroot.life
1. ํ๋ก์ ํธ ๊ฐ์
ํ ๋ฌ์ ๋น ๋ฏํ๊ฒ ๋ณด๋ธ 2024๋
์ ๋ง์ง๋ง โจ ๋๋์ด ์ฌํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ฒ ๋์๋ค. ํ๊ณ ๋ ํ๋ก์ ํธ๊ฐ ๋๋๊ณ 2์ฃผ ํ์ ์์ฑ ์ค..
์ฌํํ๋ก์ ํธ๋ฅผ ํ๋ฉฐ ๊ตฌํํ๋ ๊ฒ๋ค๊ณผ ์ด๋ค ์ด๋ ค์์ด ์์๋์ง, ๋ฐฐ์ด ๊ฒ๋ค์ ๋ฌด์์ธ์ง์ ๋ํด ํ๊ณ ๊ธ์ ์์ฑํด๋ณด๋ ค ํ๋ค.
- ํ๋ก์ ํธ๋ช
: WorkRoot (์ํฌ๋ฃจํธ)
- ๊ฐ๋ฐ ๊ธฐ๊ฐ: 2024.11.22 ~ 2024.12.30
- ํ ๊ตฌ์ฑ: ํ๋ก ํธ์๋ 4๋ช
- GitHub ํ ๋ ํฌ์งํ ๋ฆฌ ๋งํฌ
GitHub - FE9-2/workroot: FE9-2ํ) ๐ณ "์ผ"์ ํตํด ์์ ์ ๋ฟ๋ฆฌ๋ฅผ ๋ด๋ฆฌ๋ฉฐ "์ฑ์ฅ"ํ๋ ๊ตฌ์ธ๊ตฌ์ง ์ฌ์ดํธ
FE9-2ํ) ๐ณ "์ผ"์ ํตํด ์์ ์ ๋ฟ๋ฆฌ๋ฅผ ๋ด๋ฆฌ๋ฉฐ "์ฑ์ฅ"ํ๋ ๊ตฌ์ธ๊ตฌ์ง ์ฌ์ดํธ. Contribute to FE9-2/workroot development by creating an account on GitHub.
github.com
2. ๊ธฐ์ ์คํ ์ ์ ์ด์ ์ ๊ณ ๋ฏผ
- Next.js App Router
- Next.js๋ React ๊ธฐ๋ฐ์ ํ๋ ์์ํฌ๋ก, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. Workroot ํ๋ก์ ํธ๋ ๋น ๋ฅธ ํ์ด์ง ๋ก๋ฉ ์๋์ SEO(๊ฒ์ ์์ง ์ต์ ํ)๊ฐ ์ค์ํ ๋งํผ Next.js๋ฅผ ์ ํํ์ฌ ํผํฌ๋จผ์ค์ SEO๋ฅผ ๋ชจ๋ ์ถฉ์กฑํ ์ ์๋๋ก ํ๋ค. ๋ํ, ๋ด์ฅ๋ ๋ผ์ฐํ ์์คํ ๊ณผ API ๋ผ์ฐํธ๋ฅผ ํ์ฉํด ๊ฐ๋ฐ ํจ์จ์ฑ์ ๊ทน๋ํํ ์ ์์๋ค.
- TypeScript
- TypeScript๋ JavaScript์ ์ ์ ํ์ ์์คํ ์ ์ ๊ณตํ์ฌ ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๋ ์ญํ ์ ํ๋ค. ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์์์น ๋ชปํ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด TypeScript๋ฅผ ์ฌ์ฉํ๋ค. ํนํ, ํ์ ์ ํ์ ์ ์๋ฅผ ํตํด ํ์๋ค ๊ฐ ์์ฌ์ํต ๋น์ฉ์ ์ค์ด๋ ๋ฐ ํจ๊ณผ์ ์ด์๋ค.
- ReactQuery
- React Query๋ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ฐ์ดํฐ ํ์นญ๊ณผ ์บ์ฑ, ๋ฆฌํ์นญ ๋ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค. Workroot ํ๋ก์ ํธ์์๋ ๋ณต์กํ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ API ์์ฒญ์ด ๋ง์๊ธฐ ๋๋ฌธ์ React Query๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ , ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์๋ค.
- React Hook Form
- React Hook Form์ ํผ ๊ด๋ฆฌ๋ฅผ ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ต์ํ์ ๋ฆฌ๋ ๋๋ง๊ณผ ๊ฐ๊ฒฐํ API ๋๋ถ์ ํผํฌ๋จผ์ค๋ฅผ ์ ์งํ๋ฉด์๋ ๋ณต์กํ ํผ ๋ก์ง์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์๋ค. ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฐ๋จํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ์ ๋ ํฐ ์ฅ์ ์ผ๋ก ์์ฉํ๋ค.
- Tailwind CSS
- Tailwind CSS๋ ์ ํธ๋ฆฌํฐ ํด๋์ค ๊ธฐ๋ฐ์ CSS ํ๋ ์์ํฌ๋ก, ๋์์ธ ์์คํ ์ ๋น ๋ฅด๊ณ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌ์ถํ ์ ์๋ค. CSS-in-JS ๋ฐฉ์๋ณด๋ค ๊ฐ๋ฒผ์ด ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ฉฐ, ์ปค์คํฐ๋ง์ด์ง์ด ์ ์ฐํด์ Workroot์ ๋ธ๋๋ ์์ด๋ดํฐํฐ์ ๋ง๋ UI/UX๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์๋ค.
- Supabase
- Supabase๋ Firebase์ ์คํ์์ค ๋์์ผ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ฐํธํ๊ฒ ์ ๊ณตํ๋ Backend-as-a-Service ํ๋ซํผ์ด๋ค. PostgreSQL ๊ธฐ๋ฐ์ผ๋ก ๋์ ํ์ฅ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ์ ๊ณตํ๋ฉฐ, ํ๋ก์ ํธ์ ์ด๊ธฐ ๊ฐ๋ฐ ๋น์ฉ๊ณผ ์๊ฐ์ ์ค์ด๋ ๋ฐ ํจ๊ณผ์ ์ด์๋ค. ํนํ, ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ์ ๊ฐ๋จํ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํ์ ์ ์ฉํ๋ค.
- Framer Motion
- Framer Motion์ React ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๊ฐ๋จํ๋ฉด์๋ ์ธ๋ จ๋ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ ๊ณตํ๋ค. ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ธฐ ์ํด ํ์ด์ง ์ ํ, ๋๋กญ๋ค์ด, ๋ฒํผ ์ธํฐ๋์ ๋ฑ ๋ค์ํ UI ์์์ ์ ๋๋ฉ์ด์ ์ ์ถ๊ฐํ๋ค. ๋ถ๋๋ฝ๊ณ ์ง๊ด์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ํด ์ ํํ๋ค.
๐ค App Router + React Query ์กฐํฉ์ ์ ํํ ์ด์
1. ํ์ ๊ธฐ์ ์ญ๋๊ณผ ์์ ์ฑ ๊ณ ๋ ค
Workroot ํ๋ก์ ํธ๋ ํ์๋ค์ด ์ต์ํ ๊ธฐ์ ์คํ์ ํ์ฉํด ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ค์ํ๋ค. App Router์ ์๋ฒ ์ปดํฌ๋ํธ(Server Components)๋ Next.js 13๋ถํฐ ๋์ ๋ ์ต์ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋์ ๊ฒฝ๋ก์ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ํ ๊ด๋ฆฌ ๋ฑ์ ๋ณต์ก์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด ๋ด์ฉ์ด ๊ธฐ์กด ๋ฐฉ์๊ณผ ๋น๊ตํด ๊ฐ๋ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ํ ํ์ต ๋ฌ๋ ์ปค๋ธ๊ฐ ์กด์ฌํ ๊ฑฐ๋ผ ํ๋จํ๊ณ ํ์ ๋ ๊ฐ๋ฐ ๊ธฐ๊ฐ ๋ด์์ ๊ฐ๋ฐ ์๊ฐ ์ฆ๊ฐ๋ก ์ด์ด์ง ๊ฑฐ๋ผ ํ๋จํ๋ค.
์ด์ ๋ฐํด React Query๋ ํ์ด ์ด๋ฏธ ์๋ จ๋์ด ์๋ ๊ธฐ์ ๋ก, ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์๊ณ , ๋ณต์กํ ํ์ต ๊ณผ์ ์ ์๋ตํ์๋ค.
2. React Query์ ๊ฒ์ฆ๋ ์ํ ๊ด๋ฆฌ
React Query๋ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์บ์ฑ, ๋ฆฌํ์นญ, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ด, ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ์ ํฉํ๋ค. App Router์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ํ ๊ด๋ฆฌ์ ๊ฒฝ๊ณ๊ฐ ํผ๋์ค๋ฌ์ธ ์ ์์์ง๋ง, React Query๋ ์ด๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํด ์ค๋ค.
์์ฌ์ด ์
์๋ฒ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฌ๋์ปค๋ธ ๋๋ฌธ์ App Router + React Query ์กฐํฉ์ ์ ํํ ๊ฒ.
Next.js๋ฅผ ์ฌ์ฉํ๋ ์ค์ ํ ๋ด ์๋ฒ์ปดํฌ๋ํธ์ ํ์ต ๊ฒฝํ ๋ถ์กฑ์ผ๋ก ์ธํด ์๋ฒ ์ปดํฌ๋ํธ์ ํ์ฉ ๋ฐฉ๋ฒ์ ์ตํ๊ธฐ ์ํด์ ํ์ตํ๊ณ ๊ณต์ ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค.
๋ค์ ํ๋ก์ ํธ ๊ธฐํ๊ฐ ์๊ธฐ๋ฉด ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ทน ๋์ ํ๊ณ , ์ง์์ ์ธ ๊ณต๋ถ๋ฅผ ํตํด ๋ฌ๋ ์ปค๋ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ๋ ธ๋ ฅํ ๊ฒ์ด๋ค.
์ํ ์
1. CI/CD ๋์
์ด์ ์๋ ์ฌ์ฉํด๋ณด์ง ๋ชปํ github action CI/CD, storybook ๊ฒฝํ์ ํด๋ณผ ์ ์์๋ค.
GitHub Actions๋ก CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ๊ฒฐ๊ณผ, ์ฝ๋ ๋ณํฉ ํ ๋ฐฐํฌ ์๋๊ฐ ๋นจ๋ผ์ง๊ณ , ๋ฐฐํฌ ์์ ์ฑ์ด ํฌ๊ฒ ํฅ์๋์๋ค.
2. Storybook ํ์ฉ
์ปดํฌ๋ํธ ๊ฐ๋ฐํ ๋ /test/1 ๊ฐ์ ํ์ด์ง๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋ถํธํจ์ด ์์๋ค. storybook์ ์ฌ์ฉํ ํ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ด์ ๋งค์ฐ ํธ๋ฆฌํ๋ค.
3. React Query์ ์ฅ์ ํ์ฉ
React Query๋ฅผ ํตํด ๋ฐ์ดํฐ ์บ์ฑ๊ณผ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํจ์ผ๋ก์จ API ํธ์ถ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์๋ค.
๐ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ์ ์บ์ฑ
- React Query๋ฅผ ํ์ฉํ์ฌ ์๋ฒ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ
- ๋ก๊ทธ์ธ ํ useLogin ํ ์ ํตํด ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ ์ฅํ๊ณ , ์ดํ ํ์ด์ง์์ ๋์ผ ๋ฐ์ดํฐ๋ฅผ ๋ถํ์ํ ์์ฒญ ์์ด ํ์ฉํจ
- queryClient.invalidateQueries์ queryClient.setQueryData๋ฅผ ์ ์ ํ ํ์ฉํด API ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์บ์๋ฅผ ๋ฌดํจํ(๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ต์ ์ํ๋ก ์ ์ง)ํ๊ฑฐ๋, ์บ์๋ฅผ ์ง์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ์ต์ ํ
๐ ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์ฉ์ ํผ๋๋ฐฑ
- Axios ์๋ฌ๋ฅผ onError์์ ์ฒ๋ฆฌํ์ฌ ์ ์ ํ ํ ์คํธ ๋ฉ์ธ์ง๋ฅผ ํ์ํด ์ฌ์ฉ์์๊ฒ ๋ช ํํ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
๐ ๋ฌดํ ์คํฌ๋กค ๊ตฌํ
- useInfiniteQuery๋ฅผ ํ์ฉํด ๊ฒ์๊ธ ๋ชฉ๋ก์ ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ์ ๊ตฌํ
- getNextPageParam์ ์ฌ์ฉํด ๋ค์ ํ์ด์ง์ ์ปค์๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํ
๐ ์บ์ ์ค์ ์ ํตํ ์ฑ๋ฅ ์ต์ ํ
- staleTime๊ณผ gcTime ์ค์ ์ผ๋ก ์๋ฒ ์์ฒญ์ ์ต์ํํ๊ณ , ๋ถํ์ํ ๋ฐ์ดํฐ ์ฌ๋ก๋ฉ ๋ฐฉ์ง
- ๊ฒ์๊ธ ๋ชฉ๋ก์ฒ๋ผ ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ์ ๋ํด 5๋ถ์ ์ ํจ ์๊ฐ์ ์ค์ ํด UX๋ฅผ ํฅ์
๐ OAuth ๋ฐ ์ธ์ฆ ํ ์ ํ์ฅ์ฑ
- ๋ก๊ทธ์ธ ๋ฐ OAuth ํ ์ ์์ฑํ์ฌ ์ธ์ฆ ๊ด๋ จ ๋ก์ง์ ์ผ๊ด์ฑ ์๊ฒ ๊ด๋ฆฌ
- ์ธ์ฆ ์ฑ๊ณต ํ ํ ํ๋ฉด์ผ๋ก ๋ฆฌ๋๋ ์ ํ๊ฑฐ๋, ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ฌ์ฉ์๊ฐ ์ฆ์ ๋ก๊ทธ์ธ์ด ์๋ฃ๋์์์ ํ์ธํ ์ ์๋๋ก ๊ตฌํ
4. Sitemap์ผ๋ก ๊ฒ์์์ง ์ต์ ํ(SEO) 100% ๋ฌ์ฑ
Next.js์ next-sitemap ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๋์ ๊ฒฝ๋ก์ ์ ์ ๊ฒฝ๋ก๋ฅผ ํฌํจํ Sitemap์ ์๋์ผ๋ก ์์ฑํ์๊ณ , ์ด๋ฅผ ํตํด ๊ฒ์์์ง ํฌ๋กค๋ฌ๊ฐ ์ฌ์ดํธ ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ธ์ํ๋๋ก ์ต์ ํํ๋ค.
์ด๊ธฐ์๋ ์ผ๋ถ ๋์ ํ์ด์ง๊ฐ ๊ฒ์์์ง์ ๋ ธ์ถ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง Sitemap ์์ฑ ์ดํ ๋ชจ๋ ํ์ด์ง๊ฐ ํจ์จ์ ์ผ๋ก ์์ธ๋์๋ค.
robots.txt์ Sitemap ๊ฒฝ๋ก๋ฅผ ๋ช ์ํ๊ณ ์ค์๋๊ฐ ๋ฎ์ ํ์ด์ง๋ ํฌ๋กค๋ฌ๊ฐ ์ ๊ทผํ์ง ์๋๋ก ์ค์ ํด, ๊ฒ์์์ง ํฌ๋กค๋ง ๋ฆฌ์์ค๋ฅผ ์ต์ ํํ๋ค.
Sitemap ์ ์ฉ ํ Google Search Console์์ ๋ชจ๋ ํ์ด์ง๊ฐ ์์ธ๋์๊ณ , ํ๋ก์ ํธ ๋ฐฐํฌ ์ดํ ์ฌ์ดํธ ํธ๋ํฝ์ด ์ฆ๊ฐํ๋ ์ฑ๊ณผ๋ฅผ ์ด๋ฃจ์๋ค ๐