2024-03-30.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 4์ฃผ์ฐจ-6

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week4-6_2024-03-30

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์žฅ | SSR๊ณผ ESlint, ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | 469p~495p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 7์‹œ๋ฐ˜~10์‹œ๋ฐ˜


์ข‹์€ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

ESLint๋ฅผ ํ™œ์šฉํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„

  • ์ •์  ์ฝ”๋“œ ๋ถ„์„
    • ์ฝ”๋“œ ์Šค๋ฉœ(์ž ์žฌ์ ์œผ๋กœ ๋ฒ„๊ทธ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ)

ESLint

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ฝ๋Š”๋‹ค.
  2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์„œ(parser)๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”ํ•œ๋‹ค.
  3. 2๋ฒˆ์—์„œ ๊ตฌ์กฐํ™”ํ•œ ํŠธ๋ฆฌ๋ฅผ AST(Abstract Syntax Tree) => ๊ทœ์น™๊ณผ ๋Œ€์กฐ
  4. ๊ทœ์น™๊ณผ ๋Œ€์กฐ: report, fix

| ๊ตฌ๋ถ„ | ๋‚ด์šฉ | | ------- | ---------------------------- | | rules | ์ž˜๋ชป๋œ ์ฝ”๋“œ + ๋งž๋Š” ์ฝ”๋“œ ์ •์˜ | | plugins | ํŠน์ •ํ•œ rules์˜ ๋ชจ์ž„ |

espree

  • ํŒŒ์„œ: ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ
  • ํŒŒ์„œ ํ•ด๋ณด๊ธฐ: https://astexplorer.net/
  • espree: https://github.com/eslint/espree
  • ts => @typescript-eslint/typescript-estree, espree ๊ธฐ๋ฐ˜ ํŒŒ์„œ

eslint-plugin, eslint-config

๋„ค์ด๋ฐ: (1)์ •ํ•ด์ง„ ์ ‘๋‘์‚ฌ๋กœ ์‹œ์ž‘ (2)ํ•œ ๋‹จ์–ด๋กœ ๊ตฌ์„ฑ (3)ํŠน์ • ์Šค์ฝ”ํ”„๊ฐ€ ์•ž์— ๋ถ™๋Š” ๊ฒƒ ๊ฐ€๋Šฅ

eslint-plugin

  • ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋„๋ฉ”์ธ์— ๊ด€๋ จ๋œ ๊ทœ์น™์„ ๋ฌถ๋Š”๋‹ค
  • ๊ทœ์น™(rule)์„ ๋ชจ์•„๋†“์€ ํŒจํ‚ค์ง€, ex) eslint-plugin-import, eslint-plugin-react

eslint-config

  • eslint-plugin์„ ๋ฌถ์–ด์„œ ํ•œ ์„ธํŠธ๋กœ ์ œ๊ณตํ•œ๋‹ค

| ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | ๋‚ด์šฉ | ์ฃผ์†Œ | | --------------------------- | ---------------- | ---------------------------------------------------------------------------------------- | | eslint-config-airbnb | ์—์–ด๋น„์•ค๋น„, ์œ ๋ช… | https://github.com/airbnb/javascript | | @titicaca/triple-config-kit | ํ•œ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ | https://github.com/titicacadev/triple-config-kit | | @eslint-config-next | Next.js | https://nextjs.org/docs/pages/building-your-application/configuring/eslint#eslint-plugin |

  • eslint-config-next
    • Next.js 11 ๋ฒ„์ „๋ถ€ํ„ฐ ๋งŒ๋“ฆ
    • (1)js ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, (2)ํŽ˜์ด์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” JSX (3) **app, **document ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” HTML ์ฝ”๋“œ๋„ ์ •์  ๋ถ„์„ ๋Œ€์ƒ
    • ํ•ต์‹ฌ ์›น ์ง€ํ‘œcore web vitals์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„

ESLint rule ๋งŒ๋“ค๊ธฐ

  • https://eslint.org/docs/latest/use/configure/rules#using-configuration-files

์˜ˆ์‹œ

  • no-restricted-imports
  • ์˜ˆ์‹œ: import React from 'react';
    • ๋ฆฌ์•กํŠธ 17๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด JSX ๋Ÿฐํƒ€์ž„ ๋•Œ๋ฌธ์— import React๊ฐ€ ํ•„์š”์—†๋‹ค
    • bundle.js์— unused variable
    • ์›นํŒฉ์ด ํŠธ๋ฆฌ์‰์ดํ‚น์œผ๋กœ ์ฝ”๋“œ ์‚ญ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋Š” ์˜ํ–ฅ ์—†์ง€๋งŒ, ํŠธ๋ฆฌ ์‰์ดํ‚น ์ค„์—ฌ์„œ ๋นŒ๋“œ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”
    "no-restricted-imports": [
      'error',
      {
        paths: [
          {
            name: "react",
            importNames: ['default'],
            message:
              "~",
          }
        ]
      }
    ]
    
  • ์˜ˆ์‹œ: import {} from 'lodash'
    {
      name: "lodash",
      message:
        "lodash๋Š” CommonJS๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๋˜์ง€ ์•Š์•„ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ํฌ๊ฒŒ ํ•˜๋ฏ€๋กœ lo-dash/* ํ˜•์‹์œผ๋กœ import ํ•ด์ฃผ์„ธ์š”",
    },
    
  • ์˜ˆ์‹œ: new Date() ๊ธˆ์ง€
    • server ์‹œ๊ฐ„์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ
      • new Date() ๊ธˆ์ง€, new Date(~~)๋Š” ํ—ˆ์šฉ
    • create๋กœ ์ƒˆ๋กœ์šด ๊ทœ์น™์„ ๋งŒ๋“ ๋‹ค.
      • RuleModule => node_modules/@types/eslint/index.d.ts
  • eslint-plugin ๋งŒ๋“ค๊ธฐ
    • yo, generate-eslint
      • lib/rules/~~.js << eslint rules
      • docs/~~.md << ์—ฌ๊ธฐ ๋ฌธ์„œ
      • tests/lib/rules/~~.js << eslint tests

AST, Abstract Syntax Tree ไธญ

| ๊ตฌ๋ถ„ | ๋‚ด์šฉ | | ---------------------------------------- | -------------------------------- | | type: ExpressionStatement | body๊ฐ€ ํ‘œํ˜„์‹ ์ „์ฒด์ž„ | | ExpressionStatement.expression | ํ‘œํ˜„์‹์„ ํ™•์ธํ•  Eslint ๋…ธ๋“œ ๋‹จ์œ„ | | ExpressionStatement.expression.type | ํ‘œํ˜„ ํƒ€์ž… | | ExpressionStatement.expression.callee | ์ƒ์„ฑ์ž๋ช… | | ExpressionStatement.expression.arguments | ์ธ์ˆ˜ |

eslint ์ปค์Šคํ…€ rule ๊ด€๋ จ ๋ ˆํผ๋Ÿฐ์Šค ๋งํฌ

  • https://eslint.org/docs/latest/rules/no-restricted-imports
  • https://typescript-eslint.io/developers/custom-rules/
  • meta https://github.com/eslint/rfcs/blob/main/designs/2023-rule-options-defaults/README.md#support-for-metadefaultoptions-on-rules

์ฃผ์˜ํ•  ์ 

  • Pettier ์ถฉ๋Œ | ์ •์  ๋ถ„์„ ๋„๊ตฌ | ๋ชฉ์  | ์–ธ์–ด | | --- | --- | --- | | Prettier | ํฌ๋งคํŒ… | HTML,CSS,markdown,json | | ESLint | ์ฝ”๋“œ ์Šค๋ฉœ ์ฐพ๊ธฐ | JS |
  • ํ•ด๊ฒฐ๋ฒ•
    1. ์ถฉ๋Œ ์•ˆ ๋‚˜๊ฒŒ ์งœ๊ธฐ
    2. js๋Š” eslint์— ๋งก๊ธฐ๊ธฐ
    • js์—์„œ ํ•„์š”ํ•œ rule์€ eslint-plugin-prettier๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    • // eslint-disable-line
      • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌด์‹œํ•˜๋Š” ๊ฒฝ์šฐ >> ํฌ๊ฑด ์ž‘๊ฑด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค
      • ์ง„์งœ ํ•„์š”์—†๋Š” ๊ทœ์น™์ด๋ผ๋ฉด 'off'ํ•ด์„œ ์ œ๊ฑฐํ•  ๊ฒƒ

๋ฆฌ์•กํŠธ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

| ๊ตฌ๋ถ„ | ํ…Œ์ŠคํŠธ | ๋‚ด์šฉ | ์ˆ˜ํ–‰ | | -------- | ---------- | ---------------------------------------------------------- | -------------------------------- | | backend | ํ™”์ดํŠธ๋ฐ•์Šค | ๊ต์ฐฉ ์ƒํƒœ, ๊ฒฝ์Ÿ ์ƒํƒœ, ๋ฐ์ดํ„ฐ ์†์‹ค, ํŠน์ • ์ƒํ™ฉ์—์„œ ์žฅ์•  ๋ฐœ์ƒ | AUI (Application User Interface) | | frontend | ๋ธ”๋ž™๋ฐ•์Šค | ์ฃผ์š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๊ฒฝ์šฐ์˜ ์ˆ˜ | GUI |

React Testing Library

  • ๋ฆฌ์•กํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฆฌ์•กํŠธ ํ…€ํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŒ…
  • DOM Testing Library๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค
    • jsdom: JS ํ™˜๊ฒฝ์—์„œ HTML๊ณผ DOM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

=> ๋ฐœํ‘œ์ค€๋น„ ์ดํ›„ ์ด์–ด์„œ ๊ณต๋ถ€