ìë íìžì, ê°ë°ì ì¬ë¬ë¶! ð ì€ëì React, TypeScript, ê·žëŠ¬ê³ Next.js륌 íì©íì¬ íë¡ì ížë¥Œ ììí ë êŒ ìììŒ í íŽë 구조ì ëíŽ ì¬ë¯žìê³ ì ìµíê² ìŽìŒêž°íŽë³Žë €ê³ íŽì! 𥳠íŽë 구조ë íë¡ì ížì ì ì§ë³Žìì±ê³Œ íì¥ì±ì í° ìí¥ì 믞ì¹ë, ì¬ë°ë¥ž 구조륌 ê°ì¶ë ê²ìŽ ìŒë§ë ì€ìíì§ íšê» ìì볌ê¹ì? ð§âš
íŽë 구조ë íë¡ì ížì ëŒëì ê°ìì. ðŠŽ ì ì§ìž íŽë 구조ë ë€ì곌 ê°ì ì¥ì ì ê°ì žë€ì€ëë€:
í ë²ì í íë¡ì ížìì íŽë êµ¬ì¡°ê° ìë§ìŽìŽì ì€ìí íìŒì ì°Ÿì§ ëª»íŽ ë°€ì ìë©° ë²ê·žë¥Œ ê³ ì³ìŒ íë 겜íìŽ ììŽì. ð± ê·žë 깚ë¬ìì£ . ì ì§ì¬ì§ íŽë êµ¬ì¡°ê° ìŒë§ë ì€ìíì§! ìŽíë¡ë íì 첎ê³ì ìž êµ¬ì¡°ë¥Œ ì ì§íë €ê³ ë žë ¥íê³ ììµëë€. ì¬ë¬ë¶ë ìŽë° ì€ì륌 ë°ë³µíì§ ìëë¡ ë¯žëŠ¬ ëë¹íŽë³Žìžì! ð
뚌ì , Create React App(CRA)곌 Next.jsë¡ ìì±ë Ʞ볞 íŽë 구조륌 ìŽíŽë³Œê²ì. ð ïž
my-app/
âââ node_modules/
âââ public/
â âââ index.html
â âââ ...
âââ src/
â âââ App.tsx
â âââ index.tsx
â âââ ...
âââ tsconfig.json
âââ package.json
âââ ...
my-next-app/
âââ node_modules/
âââ public/
â âââ favicon.ico
â âââ ...
âââ pages/
â âââ index.tsx
â âââ about.tsx
â âââ api/
â âââ hello.ts
âââ styles/
â âââ globals.css
â âââ Home.module.css
âââ tsconfig.json
âââ package.json
âââ ...
ìŽ êµ¬ì¡°ë€ì ìê³ ëšìí íë¡ì ížì ì í©íì§ë§, íë¡ì ížê° 컀ì§ë©Ž íìŒìŽ íŒì¡íŽì§ ì ììŽì. ð ê·žëì ì¢ ë 첎ê³ì ìž íŽë êµ¬ì¡°ê° íìíëµëë€! ð¯
íë¡ì ížì ê·ëªšì ë³µì¡ì±ì ë°ëŒ ë€ìí íŽë 구조륌 ì íí ì ìëë°ì, ì¬êž°ìë êž°ë¥ë³ ë¶ë¥(Feature-based)ì íìŒ ì íë³ ë¶ë¥(Type-based) ë ê°ì§ ì ê·Œë²ì ìê°í ê²ì. ê·žëŠ¬ê³ ë ê°ì§ë¥Œ íŒí©í íŒí© ì ê·Œë²ë íšê» ììë³Žê² ìµëë€! ð§©
êž°ë¥ë³ ë¶ë¥ë íë¡ì ížë¥Œ êž°ë¥ ëšìë¡ ëëìŽ íŽë륌 구ì±íë ë°©ë²ìŽìì. ê° êž°ë¥ë³ë¡ êŽë š íìŒë€ì íšê» ëìŽ êŽëŠ¬íêž° ì¬ìì. ð
src/
âââ components/
â âââ Header/
â â âââ Header.tsx
â â âââ Header.module.css
â â âââ Header.test.tsx
â âââ Footer/
â âââ Footer.tsx
â âââ Footer.module.css
â âââ Footer.test.tsx
âââ features/
â âââ auth/
â â âââ components/
â â â âââ Login.tsx
â â â âââ Register.tsx
â â âââ hooks/
â â â âââ useAuth.ts
â â âââ services/
â â â âââ authService.ts
â â âââ authSlice.ts
â âââ posts/
â âââ components/
â â âââ PostList.tsx
â â âââ PostItem.tsx
â âââ hooks/
â â âââ usePosts.ts
â âââ services/
â â âââ postService.ts
â âââ postsSlice.ts
âââ hooks/
â âââ useWindowSize.ts
âââ services/
â âââ api.ts
âââ utils/
â âââ helpers.ts
âââ App.tsx
âââ index.tsx
ì¥ì :
í: ê° êž°ë¥ë³ íŽë ìì components
, hooks
, services
ë±ì ìžë¶ííë©Ž ëì± ì²Žê³ì ìŒë¡ êŽëŠ¬í ì ììŽì! ð
íìŒ ì íë³ ë¶ë¥ë 컎í¬ëíž, ì€íìŒ, ì ížëŠ¬í° ë± íìŒì ì íì ë°ëŒ íŽë륌 ëëë ë°©ë²ìŽìì. ð
src/
âââ components/
â âââ Header.tsx
â âââ Header.module.css
â âââ Footer.tsx
â âââ Footer.module.css
âââ pages/
â âââ Home.tsx
â âââ Home.module.css
â âââ About.tsx
â âââ About.module.css
âââ services/
â âââ api.ts
â âââ auth.ts
âââ hooks/
â âââ useAuth.ts
â âââ useFetch.ts
âââ utils/
â âââ helpers.ts
â âââ constants.ts
âââ App.tsx
âââ index.tsx
ì¥ì :
í: íìŒ ì íë³ë¡ ë¶ë¥í ëë ë€ìŽë° ê·ì¹ì ìŒêŽëê² ì ì§íë ê²ìŽ ì€ìíŽì. ì륌 ë€ìŽ, 컎í¬ëížë PascalCase
, ì€íìŒì camelCase
ë¡ íµìŒí ì ììŽì! ð
ì€ì íë¡ì ížììë êž°ë¥ë³ ë¶ë¥ì íìŒ ì íë³ ë¶ë¥ë¥Œ íŒí©íì¬ ì¬ì©íë 겜ì°ê° ë§ìì. ìŽë ê² íë©Ž ê° ì ê·Œë²ì ì¥ì ì 몚ë ë늎 ì ìëµëë€! ð
src/
âââ features/
â âââ auth/
â â âââ components/
â â â âââ Login.tsx
â â â âââ Register.tsx
â â âââ hooks/
â â â âââ useAuth.ts
â â âââ services/
â â â âââ authService.ts
â â âââ authSlice.ts
â âââ posts/
â âââ components/
â â âââ PostList.tsx
â â âââ PostItem.tsx
â âââ hooks/
â â âââ usePosts.ts
â âââ services/
â â âââ postService.ts
â âââ postsSlice.ts
âââ common/
â âââ components/
â â âââ Header.tsx
â â âââ Footer.tsx
â âââ hooks/
â â âââ useFetch.ts
â âââ utils/
â âââ helpers.ts
âââ assets/
â âââ images/
â âââ styles/
âââ App.tsx
âââ index.tsx
ì¥ì :
í: ê³µíµìŒë¡ ì¬ì©ëë 컎í¬ëížë ì ížëŠ¬í°ë common/
íŽëì ëìŽ ì¬ë¬ êž°ë¥ìì ì¬ì¬ì©í ì ìëë¡ íŽë³Žìžì! ð
Next.jsë Reactì ìë² ì¬ìŽë ë ëë§(SSR)ì ì§ìíë íë ììí¬ë¡, ì첎ì ìž íŽë 구조륌 ê°ì§ê³ ììŽì. ð€ïž Next.jsì Ʞ볞 íŽë 구조ë ë€ì곌 ê°ìµëë€:
my-next-app/
âââ node_modules/
âââ public/
â âââ favicon.ico
â âââ ...
âââ pages/
â âââ index.tsx
â âââ about.tsx
â âââ api/
â âââ hello.ts
âââ styles/
â âââ globals.css
â âââ Home.module.css
âââ tsconfig.json
âââ package.json
âââ ...
pages/index.tsx
ë /
겜ë¡ê° ëê³ , pages/about.tsx
ë /about
ìŽ ë©ëë€. ðNext.js íë¡ì ížììë êž°ë¥ë³ ë¶ë¥ë¥Œ ì ì©í ì ììŽì. ì륌 ë€ìŽ:
my-next-app/
âââ components/
â âââ Header.tsx
â âââ Footer.tsx
âââ features/
â âââ auth/
â â âââ components/
â â â âââ Login.tsx
â â â âââ Register.tsx
â â âââ hooks/
â â â âââ useAuth.ts
â â âââ services/
â â â âââ authService.ts
â â âââ authSlice.ts
â âââ posts/
â âââ components/
â â âââ PostList.tsx
â â âââ PostItem.tsx
â âââ hooks/
â â âââ usePosts.ts
â âââ services/
â â âââ postService.ts
â âââ postsSlice.ts
âââ pages/
â âââ index.tsx
â âââ about.tsx
â âââ api/
â âââ hello.ts
âââ public/
â âââ favicon.ico
â âââ ...
âââ styles/
â âââ globals.css
â âââ Home.module.css
âââ utils/
â âââ helpers.ts
âââ App.tsx
âââ _app.tsx
âââ index.tsx
í:
ì²ì Next.js륌 ëì íì ë, pages/ íŽëì êž°ë¥ë³ íŽëê° ìŽë»ê² ì¡°í륌 ìŽë£šëì§ í·ê°ë žë êž°ìµìŽ ëë€ì. ð íì§ë§ ì¡°êžë§ ì°ìµíë©Ž ë êµ¬ì¡°ê° ìŽë»ê² ìŽì°ë¬ì§ëì§ êžë°© ìŽíŽí ì ììŽì. í¹í _app.tsx íìŒì íì©íë©Ž êžë¡ë² ì€íìŒê³Œ ë ìŽììì ììœê² êŽëŠ¬í ì ììŽ ì ë§ ížëŠ¬íëµëë€!
íŽë 구조륌 ì€ê³í ëë ëª ê°ì§ ì€ìí ì¬íì ê³ ë €íŽìŒ íŽì. ð€
íë¡ì ížê° ì»€ì§ ê²ì ììíê³ íŽë 구조륌 ì€ê³íìžì. ì²ììë ììë ëì€ì êž°ë¥ì ì¶ê°í ì ìëë¡ ì ì°íê² ë§ë€ìŽìŒ íŽì.
컎í¬ëížë í ë±ì ì¬ì¬ì©í ì ìëë¡ ê³µíµ ëªšëì ì ë¶ëŠ¬íìžì. ì€ë³µì ì€ìŽê³ ìœëì ìŒêŽì±ì ì ì§í ì ììµëë€.
íŽëì íìŒì ìŽëŠì ëª ííê² ì§ê³ , ìí ìŽ í·ê°ëŠ¬ì§ ìëë¡ êµ¬ì¡°ë¥Œ ëšìíê² ì ì§íìžì.
íìë€ê³Œì íì ì ê³ ë €íì¬ íŽë 구조륌 ì€ê³íìžì. ë구ë ìœê² ìŽíŽíê³ ë°ëŒì¬ ì ìë êµ¬ì¡°ê° ì€ìí©ëë€.
TypeScript륌 ì¬ì©í ëë íì ì ì íìŒì ë³ëë¡ êŽëŠ¬íê±°ë, ê° ì»Ží¬ëížì íšê» íì ì ì ìíì¬ ìœëì ìì ì±ì ëì¬ë³Žìžì! ð
í: íì
ì ìë types/
íŽë륌 ë§ë€ìŽ ì€ììì êŽëŠ¬íê±°ë, ê° êž°ë¥ë³ íŽë ìì types.ts
íìŒì ëìŽ êŽëŠ¬í ì ììŽì. ðïž
ë§ì§ë§ìŒë¡, íŽë 구조륌 ìµì ííêž° ìí ëª ê°ì§ íì ë늎ê²ì! ð
íŽë곌 íìŒì ìŽëŠì ìŒêŽì± ìê² ì§ë ê²ìŽ ì€ìíŽì. ì륌 ë€ìŽ, 컎í¬ëížë PascalCase
, íìŒì camelCase
ë¡ íµìŒí ì ììµëë€.
í° ì»Ží¬ëížë ìì 컎í¬ëížë¡ ë¶ëŠ¬íì¬ êŽëŠ¬íìžì. ìŽë ê² íë©Ž ì¬ì¬ì©ì±ê³Œ ê°ë ì±ìŽ ëìì§ëë€.
Reduxë Context API ë±ì ì¬ì©í ë, ìí êŽëŠ¬ë¥Œ ë³ëì íŽëì ë¶ëŠ¬íì¬ êµ¬ì¡°ë¥Œ ê¹ëíê² ì ì§íìžì.
ê° ì»Ží¬ëížë 몚ëì ëí í ì€íž íìŒì íšê» ëìŽ í ì€íž êŽëŠ¬ë¥Œ ì©ìŽíê² íìžì.
ESLintì Prettier ê°ì ë구륌 ì€ì íì¬ ìœë ì€íìŒì ìŒêŽëê² ì ì§íìžì. íŽë 구조ì 묎êŽíê² ìœëì íì§ì ëìŒ ì ìëµëë€!
íŽë 구조ì ê° íŽëì ìí ì ëí 묞ì륌 ìì±íŽëë©Ž ìë¡ìŽ íììŽ ìœê² íë¡ì ížì ì ìí ì ììŽì. ð
íë¡ì íž íŽë 구조륌 ìœê² íìžíë €ë©Ž tree
ëª
ë ¹ìŽë¥Œ ì¬ì©í ì ììŽì. ì€ì¹ëìŽ ìì§ ìë€ë©Ž ë€ì곌 ê°ìŽ ì€ì¹í ì ììµëë€:
# macOS
brew install tree
# Ubuntu
sudo apt-get install tree
ì€ì¹ í, íë¡ì íž ë£šíž ëë í 늬ìì ë€ì ëª ë ¹ìŽë¥Œ ì€ííŽë³Žìžì:
tree -L 2
-L
ìµì
ì ê¹ìŽë¥Œ ì§ì íë ê²ìŒë¡, ì ìì ììë 2ëšê³ ê¹ìŽê¹ì§ì íŽë 구조륌 ì¶ë ¥í©ëë€. ðïž
í: tree
ëª
ë ¹ìŽì ì¶ë ¥ì Markdown íììŒë¡ ë³ííë €ë©Ž ë€ì곌 ê°ìŽ í ì ììŽì:
tree -L 2 | pbcopy
ë³µì¬ë ëŽì©ì Markdown ìœë ëžë¡ì ë¶ì¬ë£ìŒë©Ž ììê² ì 늬ë íŽë 구조륌 ëžë¡ê·žì ìœì í ì ììµëë€! ðâš
íŽë 구조륌 ìëìŒë¡ ìì±íŽì£Œë í
í늿ì ë§ë€ìŽëë©Ž, ìë¡ìŽ íë¡ì ížë¥Œ ììí ë ìê° ì ìœìŽ ëŒì. ì륌 ë€ìŽ, yo
ë plop
ê°ì ë구륌 ì¬ì©íì¬ íŽëì íìŒì ìëìŒë¡ ìì±í ì ììµëë€. ð
ì€ëì React + TypeScriptì Next.js íë¡ì ížìì íì©í ì ìë íŽë 구조ì ëíŽ ì¬ë¯žìê³ ì ìµíê² ìì볎ììŽì! 𥳠ì¬ë°ë¥ž íŽë 구조ë íë¡ì ížì ì±ê³µì ìž ê°ë°ê³Œ ì ì§ë³Žìì í° ëììŽ ëëµëë€. ì¬ë¬ë¶ì íë¡ì ížì ë§ë ìµì ì 구조륌 ì°Ÿì볎ìžì! ðâš
ì ê° ì²ììŒë¡ í íë¡ì ížë¥Œ ì§íí ë, íŽë êµ¬ì¡°ê° ìë§ìŽìŽì ë§ì íŒëì 겪ììŽì. ð ê·ž 겜í ëë¶ì ì§êžì íì 첎ê³ì ìž íŽë 구조륌 ì ì§íë €ê³ ë žë ¥íê³ ìëµëë€. ì¬ë¬ë¶ë ì²ìë¶í° ì¬ë°ë¥ž íŽë 구조륌 ì€ê³íë©Ž ë§ì ìê°ì ì ìœí ì ìì ê±°ìì!
ê¶êží ì ìŽë ë ìê³ ì¶ì ëŽì©ìŽ ìë€ë©Ž ëêžë¡ ëšê²šì£Œìžì. íšê» ë ê¹ìŽ ìë ìŽìŒêž°ë¥Œ ëë ëŽì! ðšïž
íë³µí ìœë© ëìžì! ð»âš