Skip to content

Latest commit

ย 

History

History
41 lines (21 loc) ยท 5.06 KB

tech-stack.md

File metadata and controls

41 lines (21 loc) ยท 5.06 KB

๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 

React 19

ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํŽธ์ง‘๊ธฐ์˜ ๋ณต์žกํ•œ UI ์ƒํƒœ(์Šฌ๋ผ์ด๋“œ ๋ชฉ๋ก, ์Šคํฌ๋ฆฝํŠธ ํŽธ์ง‘, ๋Œ“๊ธ€, ๋ฆฌ์•ก์…˜ ๋“ฑ)๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. React 19์˜ ๊ฐœ์„ ๋œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„(React Router, TanStack Query, Zustand ๋“ฑ)๋ฅผ ํ™œ์šฉํ•ด ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. Vue๋‚˜ Svelte ๋Œ€๋น„ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทœ๋ชจ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ์ด ์••๋„์ ์ด์–ด์„œ, ์˜์ƒ ํ”ผ๋“œ๋ฐฑยท์ฐจํŠธยท๊ณต์œ  ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

TypeScript 5.9

ํ”„๋กœ์ ํŠธ ์ „์ฒด์— strict ๋ชจ๋“œ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋“œยท๋Œ“๊ธ€ยท๋ฆฌ์•ก์…˜ ๋“ฑ ๋„๋ฉ”์ธ ํƒ€์ž…์ด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ๋Š” ๊ตฌ์กฐ์—์„œ, ํƒ€์ž… ์‹œ์Šคํ…œ์ด API ์‘๋‹ต๋ถ€ํ„ฐ ์ปดํฌ๋„ŒํŠธ props๊นŒ์ง€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. JavaScript ๋Œ€๋น„ ๋ฆฌํŒฉํ† ๋ง ์•ˆ์ „์„ฑ์ด ๋†’์•„ ํŒ€ ํ˜‘์—… ์‹œ ์‹ค์ˆ˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

Vite 7

๊ธฐ์กด Webpack/CRA ๋Œ€๋น„ ESM ๊ธฐ๋ฐ˜ ์ฆ‰์‹œ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement) ์†๋„๊ฐ€ ์›”๋“ฑํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋“œ ํŽธ์ง‘์ฒ˜๋Ÿผ ์ฝ”๋“œ ์ˆ˜์ • โ†’ ํ™”๋ฉด ํ™•์ธ ์‚ฌ์ดํด์ด ์žฆ์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค. SWC ํ”Œ๋Ÿฌ๊ทธ์ธ(@vitejs/plugin-react-swc)์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ Babel ๋Œ€๋น„ ๋นŒ๋“œ ์†๋„๋ฅผ ์ถ”๊ฐ€๋กœ ๋‹จ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

Tailwind CSS v4

์œ ํ‹ธ๋ฆฌํ‹ฐ ํผ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ๋ณ„๋„ CSS ํŒŒ์ผ ์—†์ด ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์Šคํƒ€์ผ์„ ์ง์ ‘ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ ํ† ํฐ(--color-main, --color-gray-*)๊ณผ ๊ฒฐํ•ฉํ•ด ๋‹คํฌ ๋ชจ๋“œยทํ…Œ๋งˆ ์ „ํ™˜์„ CSS ๋ณ€์ˆ˜ ๊ต์ฒด๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. v4์˜ Rust ๊ธฐ๋ฐ˜ ์—”์ง„์œผ๋กœ ๋นŒ๋“œ ์‹œ CSS ์ƒ์„ฑ ์†๋„๊ฐ€ ๋Œ€ํญ ๊ฐœ์„ ๋˜์—ˆ๊ณ , Vite ํ”Œ๋Ÿฌ๊ทธ์ธ(@tailwindcss/vite)์œผ๋กœ ์„ค์ •๋„ ๊ฐ„์†Œํ™”๋ฉ๋‹ˆ๋‹ค.

Zustand 5

Redux ๋Œ€๋น„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๊ทน๋„๋กœ ์ ์œผ๋ฉด์„œ๋„ DevTools, persist, immer ๋“ฑ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ 6๊ฐœ ๋„๋ฉ”์ธ ์Šคํ† ์–ด(authStore, slideStore, themeStore ๋“ฑ)๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ๋„, ์…€๋ ‰ํ„ฐ ํ›… ํŒจํ„ด(useSlideTitle(), useSlideScript())์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. getState()/setState()๋กœ React ์™ธ๋ถ€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์—ฌ Axios ์ธํ„ฐ์…‰ํ„ฐ ๋‚ด ์ธ์ฆ ํ† ํฐ ์ฃผ์ž… ๊ฐ™์€ ํŒจํ„ด์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TanStack Query 5 + Axios

์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. TanStack Query๊ฐ€ ์บ์‹ฑยท๋ฆฌํŽ˜์นญยท๋‚™๊ด€์  ์—…๋ฐ์ดํŠธยท์—๋Ÿฌ ์žฌ์‹œ๋„๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , Axios๋Š” ์ธํ„ฐ์…‰ํ„ฐ ๊ธฐ๋ฐ˜ ํ† ํฐ ์ž๋™ ์ฃผ์ž…๊ณผ ์ค‘์•™ํ™”๋œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ธต์  ์ฟผ๋ฆฌ ํ‚ค ํŒฉํ† ๋ฆฌ(queryKeys.slides.list(projectId))๋กœ ์„ธ๋ฐ€ํ•œ ์บ์‹œ ๋ฌดํšจํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด, ์Šฌ๋ผ์ด๋“œ ์ˆ˜์ • ์‹œ ๊ด€๋ จ ๋ชฉ๋ก๋งŒ ์ •ํ™•ํžˆ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. fetch API ๋Œ€๋น„ ์š”์ฒญ ์ทจ์†Œ, ์ง„ํ–‰๋ฅ  ์ถ”์ , ์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋ณ„๋„ ๊ตฌํ˜„ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React Router v7

ํŒŒ์ผ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์„ค์ • ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋ผ์šฐํŠธ์™€ useParams()๋ฅผ ํ™œ์šฉํ•ด /:projectId/slide/:slideId ๊ฐ™์€ ๊ณ„์ธต์  URL ๊ตฌ์กฐ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งคํ•‘ํ•˜๊ณ , ๋ผ์šฐํŠธ๋ณ„ ํ…Œ๋งˆ ์˜ค๋ฒ„๋ผ์ด๋“œ(ํ”ผ๋“œ๋ฐฑ ํŽ˜์ด์ง€ ๋‹คํฌ ๋ชจ๋“œ)๋„ props ์ „๋‹ฌ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Vitest + React Testing Library

Vite์™€ ์„ค์ •์„ ๊ณต์œ ํ•˜์—ฌ ๋ณ„๋„์˜ ํ…Œ์ŠคํŠธ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์—†์ด ๋™์ผํ•œ ๊ฒฝ๋กœ ๋ณ„์นญ(@/*)๊ณผ ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Jest ํ˜ธํ™˜ API๋กœ ํ•™์Šต ๋น„์šฉ์ด ๋‚ฎ์œผ๋ฉด์„œ๋„ ESM ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›๊ณผ ๋ณ‘๋ ฌ ์‹คํ–‰์œผ๋กœ ํ…Œ์ŠคํŠธ ์†๋„๊ฐ€ ๋น ๋ฆ…๋‹ˆ๋‹ค. React Testing Library๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ํ–‰๋™ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ•์ œํ•˜์—ฌ, ๋ฆฌํŒฉํ† ๋ง์—๋„ ๊นจ์ง€์ง€ ์•Š๋Š” ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. happy-dom์„ ํ™˜๊ฒฝ์œผ๋กœ ์„ ํƒํ•˜์—ฌ jsdom ๋Œ€๋น„ ์‹คํ–‰ ์†๋„๋ฅผ ์ถ”๊ฐ€๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

MSW (Mock Service Worker)

Service Worker๋ฅผ ํ™œ์šฉํ•ด ๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ์—์„œ API๋ฅผ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋•Œ๋ฌธ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋ชฉ ๋ฐ์ดํ„ฐ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ API๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ npm run dev:local๋กœ ์ „์ฒด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœยทํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ๊ฐœ๋ฐœ ์ผ์ •์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ทธ๋Œ€๋กœ ํ…Œ์ŠคํŠธ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ผ๊ด€์„ฑ๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

ESLint + Prettier + Husky

ESLint๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ(๋ฏธ์‚ฌ์šฉ ๋ณ€์ˆ˜, ํ›… ๊ทœ์น™ ์œ„๋ฐ˜ ๋“ฑ)์„, Prettier๊ฐ€ ์ฝ”๋“œ ํฌ๋งท(๋“ค์—ฌ์“ฐ๊ธฐ, ๋”ฐ์˜ดํ‘œ ๋“ฑ)์„ ๊ฐ๊ฐ ๋‹ด๋‹นํ•˜์—ฌ ์—ญํ• ์ด ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. eslint-plugin-check-file๋กœ ํŒŒ์ผยทํด๋” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜(kebab-case ํด๋”, PascalCase ์ปดํฌ๋„ŒํŠธ)์„ ์ž๋™ ๊ฐ•์ œํ•˜๊ณ , Husky + lint-staged๋กœ ์ปค๋ฐ‹ ์‹œ์ ์— ์ž๋™ ๊ฒ€์‚ฌํ•˜์—ฌ ์ปจ๋ฒค์…˜์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ €์žฅ์†Œ์— ์œ ์ž…๋˜๋Š” ๊ฒƒ์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.