๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

์‚ฌ๋‚ด ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค ํ†ตํ•ฉ ํ”Œ๋žซํผ ๊ตฌ์ถ•๊ธฐ : 0. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”์™€ ๊ธฐ์ˆ  ์„ ํƒ

by DevIseo 2025. 6. 13.
์‚ฌ๋‚ด ๋ณด์•ˆ ๋ถ„์„ ์ฒด๊ณ„ ํ†ตํ•ฉ ์‹œ์Šคํ…œ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌ

์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” ์ •์  ๋ถ„์„(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 ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ๋ฐฐํฌ ํšจ์œจ์„ฑ๊ณผ ๋นŒ๋“œ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ–ˆ๋‹ค.

๋Œ“๊ธ€