μλ νμΈμ, κ°λ°μ μ¬λ¬λΆ! π μ€λμ 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 νλ‘μ νΈμμ νμ©ν μ μλ ν΄λ ꡬ쑰μ λν΄ μ¬λ―Έμκ³ μ μ΅νκ² μμ보μμ΄μ! π₯³ μ¬λ°λ₯Έ ν΄λ ꡬ쑰λ νλ‘μ νΈμ μ±κ³΅μ μΈ κ°λ°κ³Ό μ μ§λ³΄μμ ν° λμμ΄ λλ΅λλ€. μ¬λ¬λΆμ νλ‘μ νΈμ λ§λ μ΅μ μ ꡬ쑰λ₯Ό μ°Ύμ보μΈμ! πβ¨
μ κ° μ²μμΌλ‘ ν νλ‘μ νΈλ₯Ό μ§νν λ, ν΄λ κ΅¬μ‘°κ° μλ§μ΄μ΄μ λ§μ νΌλμ κ²ͺμμ΄μ. π κ·Έ κ²½ν λλΆμ μ§κΈμ νμ 체κ³μ μΈ ν΄λ ꡬ쑰λ₯Ό μ μ§νλ €κ³ λ Έλ ₯νκ³ μλ΅λλ€. μ¬λ¬λΆλ μ²μλΆν° μ¬λ°λ₯Έ ν΄λ ꡬ쑰λ₯Ό μ€κ³νλ©΄ λ§μ μκ°μ μ μ½ν μ μμ κ±°μμ!
κΆκΈν μ μ΄λ λ μκ³ μΆμ λ΄μ©μ΄ μλ€λ©΄ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ. ν¨κ» λ κΉμ΄ μλ μ΄μΌκΈ°λ₯Ό λλ λ΄μ! π¨οΈ
ν볡ν μ½λ© λμΈμ! π»β¨
ν΄λ ꡬ쑰λ₯Ό μ μ€κ³νλ©΄, νμ μ΄ μνν΄μ§κ³ νλ‘μ νΈκ° 컀μ‘μ λλ κ΄λ¦¬νκΈ°κ° ν¨μ¬ μ¬μμ§μ£ . κΈ°λ³Έμ μΈ ν΄λ ꡬ쑰μ κΈ°λ₯λ³ λ° νμΌ μ νλ³ λΆλ₯ λ°©μμ μ λ§ μ μ©νκ² μ μ©ν μ μμ κ² κ°μ΅λλ€.
νΉν νΌν© μ κ·Όλ²μ μ¬μ©νμ¬ κΈ°λ₯λ³κ³Ό νμΌ μ νλ³ λΆλ₯λ₯Ό μ μ ν κ²°ν©νλ λ°©λ²μ΄ νμ€μ μΈ νλ‘μ νΈμμ λ§€μ° μ μ©ν κ² κ°μμ. κ³΅ν΅ λͺ¨λμ common/ ν΄λμ λκ³ , κ° κΈ°λ₯μ https://www.hmfusafinance.com λ 립μ μΌλ‘ κ΄λ¦¬νλ ꡬ쑰λ νμ₯μ±κ³Ό μ μ§λ³΄μμ±μμ ν° μ₯μ μ μ 곡νκ² λ€μ!