์ฌ๋ด ๋ณด์ ๋ถ์ ์ฒด๊ณ ํตํฉ ์์คํ ํ๋ก์ ํธ์ ์ฐธ์ฌ
์ฐ๋ฆฌ ํ์ฌ๋ ์ ์ ๋ถ์(SAST), ๋์ ๋ถ์(DAST), ์คํ์์ค ์ปดํฌ๋ํธ ๋ถ์(SCA) ๋ฑ ๋ค์ํ ๋ณด์ ๋ถ์ ์๋น์ค๋ฅผ ์์ฒด์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ด์ํ๊ณ ์๋ค.
๊ธฐ์กด์ SAST์ ๊ด๋ จ๋ ์ฒด์ปค(๋ถ์ ๊ท์น ๋ชจ๋)๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ณ๋์ ์ฌ๋ด ์์คํ ์ด ์กด์ฌํ์ผ๋, ๊ทธ ์ธ๋ ์๋ ๊ด๋ฆฌ์ ์์กดํ๊ณ ์์ด ์ฒด๊ณ์ ์ธ ํตํฉ ๊ด๋ฆฌ ํ๋ซํผ์ด ๋ถ์ฌํ ์ํฉ์ด์๋ค. ํนํ ์ ๊ท ์ฒด์ปค๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ถ๊ฐํ ๋ ์ค๋ณต๋ ์์ ์ด๋ ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ์ด ๋ฐ์ํ ์ ๋ฐ์ ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด SAST, DAST, SCA ์ฒด์ปค ๋ฐ ๋ ํผ๋ฐ์ค ์ ๋ณด๋ฅผ ํ๋์ ์์คํ ์์ ํตํฉ ๊ด๋ฆฌํ ์ ์๋๋ก ์ ๊ท ํตํฉ ๊ด๋ฆฌ ์์คํ ์ ๊ธฐํํ๊ณ ๊ตฌ์ถํ๋ ํ๋ก์ ํธ TF๊ฐ ๊พธ๋ ค์ก๋ค. ๋๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก ์ฐธ์ฌํ๊ฒ ๋์๋ค. ํด๋น ํ๋ก์ ํธ ๊ตฌ์ฑ์์ ๋๋ฅผ ํฌํจํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ 3๋ช , ๋ฐฑ์๋ ๊ฐ๋ฐ์ 1๋ช , ๊ธฐํ์ 1๋ช ์ผ๋ก ๊ตฌ์ฑ๋์๋ค.
๋๋ ๋จ์ํ UI ๊ฐ๋ฐ์ ๋์ด ์ด๊ธฐ UX ์ค๊ณ ๋ฐ ๊ธฐํ ๋ ผ์, ๊ธฐ์กด ์์คํ ๋ถ์๊ณผ ์ ๋ณด ๊ตฌ์กฐ ์ฌ์ค๊ณ, ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํ ์ปดํฌ๋ํธ ์ค๊ณ ๋ฐ UI ๊ฐ์ ๋ฑ์ ์ ๊ทน์ ์ผ๋ก ์ฐธ์ฌํ๊ณ ์๋ค. ๋ํ, ์ฌ๋ด ์์คํ ์ธ ๋งํผ ๊ธฐ์กด ์ฌ์ฉ์์ ํผ๋๋ฐฑ์ ์ ๊ทน ๋ฐ์ํ ๊ฐ์ ์์ ๋์ถํ๊ณ ์ ์ํ๋๋ฐ ์ฃผ๋์ ์ผ๋ก ์ฐธ์ฌํ๊ณ ์๋ค.
๊ธฐ์ ์คํ ๋ฐ ์ ํ ๋ฐฐ๊ฒฝ
์ด ํ๋ก์ ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ ์คํ์ ์ฌ์ฉํ๊ณ ์๋ค.
TypeScript
Next.js (Pages Router)
shadcn/ui
React Query
Zod
Tailwind CSS
Storybook
Docker
Prettier
ESLint
โ Next.js (Pages Router → App Router ๊ณ ๋ ค ์ค)
ํ์ฌ๋ Pages Router ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค. ๊ทธ ์ด์ ๋ ๊ธฐ์กด ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ธ์๋ค์ด Pages Router์ ์ต์ํด ์์ด ๋น ๋ฅธ ๊ฐ๋ฐ ์๋์ ํจ์จ์ ์ธ ํ์ ์ ์ํด ์ ํ๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง ํ๋ก์ ํธ์ SSR(Server Side Rendering) ๋ก์ง์ด ์ผ๋ถ ๋์ ๋๋ฉด์, App Router๋ก์ ์ ํ์ ์ค์ฅ๊ธฐ์ ์ผ๋ก ๊ณ ๋ คํ๊ณ ์๋ค.
App Router๋ ๋ ์ด์์ ๊ด๋ฆฌ, ์๋ฒ ์ปดํฌ๋ํธ ๋ฑ SSR์ ๊ฐ์ ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์,์ ์ง์ ์ธ ์ ํ์ ์ํ ๊ธฐ์ ์กฐ์ฌ์ ์ ์ฉ ๋ฐฉ์์ ๊ฒํ ์ค์ด๋ค.
โ shadcn/ui – ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅํ ๋์์ธ ์์คํ
์ฌ๋ด์๋ ์ด๋ฏธ ์ด์ ์ค์ธ ์๋น์ค์ ๋ง์ถฐ ์ ์๋ ๋์์ธ ์์คํ ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ์ง๋ง, ์ฌ๋ด ์ปดํฌ๋ํธ๋ ํน์ ์ ํ์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์ด ์์ด, ํ ํ๋ก์ ํธ์๋ ์คํ๋ ค UI/UX์ ์ ์ฝ์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์ ๋ ์ ์ฐํ๊ฒ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅํ UI๊ฐ ํ์ํ๊ณ , ์ค์นํ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋ shadcn/ui๋ฅผ ์ ํํ๊ฒ ๋์๋ค.
์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋์ ๋ฐฉ์์ด๋ ์คํ์ผ์ ์์ ๋กญ๊ฒ ์์ ํ๋ฉด์๋
๋์์ธ ์์คํ ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ด, ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋ชจ๋ ํ๋ณดํ ์ ์๋ค.
โ React Query – ์๋ฒ ์ํ ๊ด๋ฆฌ ์ต์ ํ
์๋ฒ์์ ํต์ ์์ ํด๋ผ์ด์ธํธ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๊ณ , ๋ฐ์ดํฐ ์บ์ฑ, ๋ก๋ฉ/์๋ฌ ์ํ ๊ด๋ฆฌ, ์ฟผ๋ฆฌ ๋ฌดํจํ ๋ฑ์ ๊ธฐ๋ฅ์ ๋ณด๋ค ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด React Query๋ฅผ ๋์ ํ๋ค.
์ด๋ฅผ ํตํด ๋ณต์กํ ๋น๋๊ธฐ API ํธ์ถ ๋ก์ง์ ๊ฐ์ํํ๊ณ , ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ ๋ฐ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๊ฐ๋ฅํด์ก๋ค.
๋ํ, axios๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด์ ์ธํฐ์ ํฐ๋ฅผ ํตํ ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ๋ ์ธ์ฆ ์ฒ๋ฆฌ๋ ๊ฐํธํ๊ฒ ๊ตฌ์ฑํ ์ ์์๋ค.
โ Zod – ํผ ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฆ ๋ฐ ์คํค๋ง ๊ธฐ๋ฐ ์ค๊ณ
๋ค์ํ ์ ๋ ฅ ํผ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์์๊ธฐ ๋๋ฌธ์, ์ ์ ํ์ ๊ธฐ๋ฐ์ ์ ํจ์ฑ ๊ฒ์ฆ๊ณผ ์คํค๋ง ์ค๊ณ๋ฅผ ๋์์ ์ง์ํ๋ Zod๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
์ด๋ก ์ธํด ์ ๋ ฅ ํผ์ ๊ฒ์ฆ ๋ก์ง์ ๋ช ์์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ,
์๋ฌ ๋ฉ์์ง ๊ด๋ฆฌ ๋ฐ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ ๊ณ์ฝ ๊ธฐ๋ฐ์ ์ค๊ณ์ ๋์์ ์ฃผ๊ณ ์๋ค.
โ Tailwind CSS – ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฐ ์คํ์ผ ๊ตฌ์ฑ
๋์์ธ ์์คํ ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์๋ ๋น ๋ฅด๊ฒ ๋ ์ด์์์ ๊ตฌ์ฑํ๊ธฐ ์ํด, Tailwind CSS๋ฅผ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฐ์ผ๋ก ํ์ฉํ๊ณ ์๋ค.
ํนํ shadcn/ui์ ๋ง์ด ์ฌ์ฉํ์ฌ, ๊ธฐ๋ณธ ์ปดํฌ๋ํธ์ ํ์ํ ์คํ์ผ์ ๋น ๋ฅด๊ฒ ์ ์ฉํ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋ฉํ๊ธฐ ์ฌ์ด ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
โ Storybook – ์ปค์คํ UI ์ปดํฌ๋ํธ ๊ด๋ฆฌ
shadcn/ui๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๊ฑฐ๋ ์๋กญ๊ฒ UI ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ ๊ณผ์ ์์, ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์ํํ๊ณ ํ๊ณผ ๊ณต์ ํ๊ธฐ ์ํ ์ฉ๋๋ก Storybook์ ๋์ ํ๋ค.
Storybook์ ํตํด ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์์ UI๋ฅผ ํ์ธํ๊ณ ํ ์คํธํ ์ ์์ด, ๋น ๋ฅธ ํผ๋๋ฐฑ๊ณผ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ ํ๋ณด์ ํฐ ๋์์ด ๋์๋ค.
โ Docker – CI/CD ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ ํตํฉ
CI/CD ๊ตฌ์ฑ๊ณผ ๊ฐ๋ฐ ํ๊ฒฝ ํ์คํ๋ฅผ ์ํด Docker๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฏธ์ง ์์ฑ ์ ๊ฒฝ๋ํ๋ฅผ ์ํด multi-stage build ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๊ณ ์๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์งํ๋ฉด์๋, ๋ฐฐํฌ ํจ์จ์ฑ๊ณผ ๋น๋ ์์ ์ฑ์ ๋์ผ ์ ์๋ ๊ธฐ๋ฐ์ ๋ง๋ จํ๋ค.
๋๊ธ