πŸ’»μ›Ή(Web)

[React]μ΄ˆκΈ°μ„ΈνŒ…

stonesy 2024. 7. 18. 08:17
728x90

초기 μ„ΈνŒ…

1. Node.js μ„€μΉ˜

React ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜κΈ° 전에 Node.jsκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. Node.jsλŠ” 곡식 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

2. Create React App μ„€μΉ˜

터미널을 μ—΄κ³  λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ Create React App을 μ „μ—­μœΌλ‘œ μ„€μΉ˜ν•©λ‹ˆλ‹€. (이미 μ„€μΉ˜λ˜μ–΄ μžˆλ‹€λ©΄ 이 λ‹¨κ³„λŠ” κ±΄λ„ˆλ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€.)

npm install -g create-react-app

 

3-1. μƒˆ React ν”„λ‘œμ νŠΈ 생성(CRA)

ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜κ³ μž ν•˜λŠ” λ””λ ‰ν† λ¦¬λ‘œ μ΄λ™ν•œ λ‹€μŒ, λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ μƒˆ React ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

npx create-react-app my-app

μ—¬κΈ°μ„œ my-app은 ν”„λ‘œμ νŠΈμ˜ μ΄λ¦„μœΌλ‘œ, μ›ν•˜λŠ” μ΄λ¦„μœΌλ‘œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3-2. μƒˆ React ν”„λ‘œμ νŠΈ 생성(Vite)

[React]Vite, Redux

 

[React]Vite, Redux

CRAλž€ JavaScript둜 κ΅¬μ„±λœ Webpack(μ›ΉνŒ©)을 μ‚¬μš©ν•˜λŠ”λ° 속도가 λŠλ¦°νŽΈμ΄λ‹€. μ½”λ“œμ˜ 양이 λ§Žμ•„μ§ˆμˆ˜λ‘ 느린 속도λ₯Ό 체감할 수 μžˆλ‹€. μœ„μ˜ 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Esbuildλ₯Ό 기반으둜 λ§Œλ“€μ–΄μ§„ λΉŒλ“œνˆ΄μΈ vite

stonesy927.tistory.com

 

4. ν”„λ‘œμ νŠΈ λ””λ ‰ν† λ¦¬λ‘œ 이동

μƒμ„±λœ ν”„λ‘œμ νŠΈ ν΄λ”λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

cd my-app

 

5. 개발 μ„œλ²„ μ‹œμž‘

λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 개발 μ„œλ²„λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.

npm start / npm run dev

이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ κΈ°λ³Έ λΈŒλΌμš°μ €μ—μ„œ http://localhost:3000 μ£Όμ†Œλ‘œ μžλ™μœΌλ‘œ 열리며, React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

6. ν”„λ‘œμ νŠΈ ꡬ쑰 이해

my-app 폴더 λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄λ©΄, μ£Όμš” 파일 및 ν΄λ”λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • public/: 정적 파일(HTML, 이미지 λ“±)을 μ €μž₯ν•˜λŠ” 폴더.
  • src/: React μ»΄ν¬λ„ŒνŠΈμ™€ JavaScript νŒŒμΌμ„ μ €μž₯ν•˜λŠ” 폴더.
  • package.json: ν”„λ‘œμ νŠΈμ˜ 메타데이터와 μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜λŠ” 파일.
my-app/
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ index.html
β”‚   β”œβ”€β”€ favicon.ico
β”‚   └── manifest.json
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ assets/                  # 정적 μžμ›
β”‚   β”‚   β”œβ”€β”€ img/
β”‚   β”œβ”€β”€ components/              # μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ common/
β”‚   β”‚   β”‚   β”œβ”€β”€ Header.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Footer.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Layout.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ PlainLayout.jsx
β”‚   β”‚   β”œβ”€β”€ home/
β”‚   β”‚   β”‚   β”œβ”€β”€ Card.jsx
β”‚   β”‚   β”œβ”€β”€ class/
β”‚   β”‚   β”‚   β”œβ”€β”€ Card.jsx
β”‚   β”œβ”€β”€ pages/                   # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ home/
β”‚   β”‚   β”‚   β”œβ”€β”€ HomePage.jsx
β”‚   β”‚   β”œβ”€β”€ class/
β”‚   β”‚   β”‚   β”œβ”€β”€ ClassListPage.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ClassDetailPage.jsx
β”‚   β”‚   β”œβ”€β”€ board/
β”‚   β”‚   β”‚   β”œβ”€β”€ BoardListPage.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ BoardDetailPage.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ BoardCreatePage.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ BoardUpdatePage.jsx
β”‚   β”œβ”€β”€ routes/                  # λΌμš°νŒ…
β”‚   β”‚   β”œβ”€β”€ route.jsx
β”‚   β”‚   β”œβ”€β”€ privateRoute.jsx
β”‚   β”œβ”€β”€ app/                     # λ¦¬λ•μŠ€
β”‚   β”‚   β”œβ”€β”€ store.js
β”‚   β”œβ”€β”€ features/                # λ¦¬λ•μŠ€
β”‚   β”‚   β”œβ”€β”€ auth/
β”‚   β”‚   β”‚   β”œβ”€β”€ authSlice.js
β”‚   β”‚   β”œβ”€β”€ counter/
β”‚   β”‚   β”‚   β”œβ”€β”€ counterSlice.js
β”‚   β”œβ”€β”€ utils/                   # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
β”‚   β”‚   β”œβ”€β”€ validator.js
β”‚   β”œβ”€β”€ hooks/                   # μ»€μŠ€ν…€ ν›…
β”‚   β”‚   β”œβ”€β”€ useCustomHook.js
β”‚   β”œβ”€β”€ styles/                  # μŠ€νƒ€μΌ
β”‚   β”‚   β”œβ”€β”€ color.css
β”‚   β”‚   β”œβ”€β”€ global.css
β”‚   β”œβ”€β”€ App.jsx
β”‚   β”œβ”€β”€ main.jsx
β”œβ”€β”€ .eslintrc.cjs                # ESLint μ„€μ • 파일
β”œβ”€β”€ .gitignore
β”œβ”€β”€ .prettierrc                  # Prettier μ„€μ • 파일
β”œβ”€β”€ index.html                   # μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ§„μž…μ  HTML 파일 (Vite μ„€μ • κ΄€λ ¨)
β”œβ”€β”€ yarn.lock (λ˜λŠ” package-lock.json) # μ˜μ‘΄μ„± 트리 κ³ μ • 파일
β”œβ”€β”€ package.json                 # ν”„λ‘œμ νŠΈ 메타데이터 및 μ˜μ‘΄μ„± μ •μ˜
β”œβ”€β”€ README.md
└── vite.config.js               # Vite μ„€μ • 파일

πŸ› μ£Όμš” ꡬ성 μš”μ†Œ μ„€λͺ…

public/: 정적 νŒŒμΌλ“€μ„ λ³΄κ΄€ν•˜λŠ” 폴더

src/: μ†ŒμŠ€ μ½”λ“œκ°€ μœ„μΉ˜ν•˜λŠ” 폴더

  • assets/: 이미지 파일과 같은 정적 μžμ›λ“€μ„ λ³΄κ΄€ν•©λ‹ˆλ‹€.
  • components/: μž¬μ‚¬μš© κ°€λŠ₯ν•œ React μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μœ„μΉ˜ν•˜λ©°, 곡톡 μ»΄ν¬λ„ŒνŠΈμ™€ νŽ˜μ΄μ§€λ³„(도메인별) μ»΄ν¬λ„ŒνŠΈλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.
  • pages/: 각각의 νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μœ„μΉ˜ν•˜λ©°, ν™ˆ, 클래슀, κ²Œμ‹œνŒ λ“± μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.
  • routes/: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΌμš°νŒ… μ„€μ • νŒŒμΌλ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • app/: λ¦¬λ•μŠ€ μŠ€ν† μ–΄ μ„€μ • 파일이 μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • features/: λ¦¬λ•μŠ€ μŠ¬λΌμ΄μŠ€λ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • utils/: μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ μ „μ—­μ—μ„œ μ‚¬μš©λ˜λŠ” νŠΉμ • κΈ°λŠ₯ 및 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ”λ° 도움을 μ£ΌλŠ” ν•¨μˆ˜λ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • hooks/: μ»€μŠ€ν…€ 훅듀이 μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • styles/: μŠ€νƒ€μΌ νŒŒμΌλ“€μ΄ μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • App.jsx: μ£Όμš” React μ»΄ν¬λ„ŒνŠΈλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ쑰λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  • main.jsx: ReactDOM을 μ‚¬μš©ν•΄ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ HTML DOM에 λ Œλ”λ§ν•˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€.

 

πŸ› .eslintrc.cjs

Tripleμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ ESLint, ν”„λ‘ νŠΈμ—”λ“œ, Prettier 섀정을 기반으둜 ν•œλ‹€.μž‘μ„±λœ μ„€μ • νŒŒμΌμ€ Triple의 프리티어(Prettier) 섀정을 μžλ™μœΌλ‘œ μ μš©ν•œλ‹€. (npm i @titicaca/eslint-config-triple)

module.exports = {
  root: true, // 이 μ„€μ • 파일이 ν”„λ‘œμ νŠΈμ˜ λ£¨νŠΈμ— μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  env: {
    browser: true, // λΈŒλΌμš°μ € ν™˜κ²½μ„ μ„€μ •ν•œλ‹€.
    es2021: true, // ECMAScript 2021(ES12) ν™˜κ²½μ„ μ„€μ •ν•œλ‹€.
  },
  extends: [
    "eslint:recommended", // ESLintμ—μ„œ ꢌμž₯ν•˜λŠ” κΈ°λ³Έ κ·œμΉ™μ„ μ‚¬μš©ν•œλ‹€.
    "@titicaca/eslint-config-triple", // Triple의 ESLint κΈ°λ³Έ 섀정을 ν™•μž₯ν•©λ‹ˆλ‹€.
    "@titicaca/eslint-config-triple/frontend", // Triple의 ν”„λ‘ νŠΈμ—”λ“œ 섀정을 ν™•μž₯ν•©λ‹ˆλ‹€.
    "@titicaca/eslint-config-triple/prettier", // Triple의 Prettier 섀정을 ν™•μž₯ν•©λ‹ˆλ‹€.
    "plugin:react/recommended", // React κ΄€λ ¨ ꢌμž₯ κ·œμΉ™μ„ μ‚¬μš©ν•œλ‹€.
    "plugin:prettier/recommended", // Prettier와 μ—°λ™λœ κ·œμΉ™μ„ μ‚¬μš©ν•œλ‹€.
    "plugin:react/jsx-runtime", // μƒˆλ‘œμš΄ JSX λ³€ν™˜μ„ μ§€μ›ν•˜λŠ” κ·œμΉ™μ„ μ‚¬μš©ν•œλ‹€.
    // 'plugin:react-hooks/recommended', // React Hooks μ‚¬μš©μ— λŒ€ν•œ ꢌμž₯ κ·œμΉ™μ„ μ‚¬μš©ν•œλ‹€.
  ],
  ignorePatterns: ["dist", ".eslintrc.cjs", "vite.config.js"], // ESLintκ°€ λ¬΄μ‹œν•  파일 ν˜Ήμ€ 디렉토리λ₯Ό μ„€μ •ν•œλ‹€.
  parserOptions: {
    ecmaFeatures: {
      jsx: true, // JSXλ₯Ό νŒŒμ‹±ν•  수 있게 μ„€μ •ν•œλ‹€.
    },
    ecmaVersion: 12, // ECMAScript 2021(버전 12) 문법을 μ‚¬μš©ν•œλ‹€.
    sourceType: "module", // ECMAScript λͺ¨λ“ˆμ„ μ‚¬μš©ν•œλ‹€.
  },
  settings: {
    react: {
      version: "detect", // μ„€μΉ˜λœ React 버전을 μžλ™μœΌλ‘œ κ°μ§€ν•œλ‹€.
    },
    "import/resolver": {
      node: {
        extensions: [".js", ".jsx", ".ts", ".tsx"], // μ‚¬μš©ν•  파일 ν™•μž₯자λ₯Ό μ„€μ •ν•œλ‹€.
        paths: ["./src"], // import 경둜의 κΈ°λ³Έ 폴더λ₯Ό μ„€μ •ν•œλ‹€.
      },
    },
  },
  plugins: ["react", "react-refresh"], // μ‚¬μš©λ  ESLint ν”ŒλŸ¬κ·ΈμΈμ„ μ„€μ •ν•œλ‹€.
  rules: {
    "react/prop-types": "off", // PropTypesλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ κ²½κ³ λ‚˜ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.
    "react/jsx-no-target-blank": "warn", // κ΄€λ ¨ λ³΄μ•ˆ κ²½κ³ λ₯Ό μœ μ§€ν•œλ‹€.
    "react-refresh/only-export-components": [
      "warn", // React Refreshμ—μ„œ μ»΄ν¬λ„ŒνŠΈλ§Œ 내보내도둝 κ²½κ³ ν•œλ‹€.
      {
        allowConstantExport: true, // μƒμˆ˜λ‘œ λ‚΄λ³΄λ‚΄λŠ” 것을 ν—ˆμš©ν•œλ‹€.
      },
    ],
    "react/react-in-jsx-scope": "off", // Reactκ°€ JSX λ²”μœ„ 내에 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” κ·œμΉ™μ„ λΉ„ν™œμ„±ν™”ν•œλ‹€.
    "import/order": [
      "error",
      {
        groups: [
          ["builtin", "external"],
          "internal",
          "parent",
          "sibling",
          "index",
        ],
        "newlines-between": "always",
      },
    ],
  },
};

 

πŸ› μ μš©λ°©λ²•

ESLint 검사: npm run lint:es

ESLint 검사+μžλ™ μˆ˜μ •: npm run lint:es:fix

Prettier 검사: npx prettier —check .

Prettier 검사+μžλ™ μˆ˜μ •: npx prettier —write .

(VSCodeμ—μ„œ extension을 μ„€μΉ˜ν•˜λ©΄ μ¦‰κ°μ μœΌλ‘œ 확인할 수 μžˆλ‹€.)

 

7. 개발 μ‹œμž‘

이제 κΈ°λ³Έ 섀정이 λͺ¨λ‘ μ™„λ£Œλ˜μ—ˆμœΌλ‹ˆ, src/App.js νŒŒμΌμ„ μˆ˜μ •ν•˜μ—¬ κ°œλ°œμ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 단계λ₯Ό 톡해 React ν”„λ‘œμ νŠΈλ₯Ό μ‰½κ²Œ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΆ”κ°€μ μœΌλ‘œ ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ 도ꡬ듀은 npm을 μ‚¬μš©ν•˜μ—¬ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

728x90

'πŸ’»μ›Ή(Web)' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Servlet  (0) 2024.12.01
[κ³΅ν†΅ν”„λ‘œμ νŠΈ]5μ£Όμ°¨: React Openvidu κ΅¬ν˜„  (0) 2024.08.11
MVC, MVVM, Flux νŒ¨ν„΄  (1) 2024.07.15
[React]React Router  (0) 2024.06.28
ν”„λ‘ νŠΈμ—”λ“œ μ„±λŠ₯ μ΅œμ ν™”  (0) 2024.04.12