๐Ÿ“šย TS config

tsconfig.base.json(๋ฃจํŠธํด๋”)

{
  "compileOnSave": false, // ํŒŒ์ผ ์ €์žฅ ์‹œ ์ž๋™์œผ๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์Œ
  "compilerOptions": {
    "rootDir": ".", // ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ • (์ปดํŒŒ์ผ๋œ .js ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๊ธฐ์ค€ ๊ฒฝ๋กœ)
    "sourceMap": true, // .ts ํŒŒ์ผ์— ๋Œ€์‘๋˜๋Š” .js.map ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
    "declaration": false, // .d.ts ํƒ€์ž… ์„ ์–ธ ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€ (false๋ฉด ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ)
    "moduleResolution": "node", // ๋ชจ๋“ˆ ํ•ด์„ ๋ฐฉ์‹ ์ง€์ • (Node.js ๋ฐฉ์‹ ์‚ฌ์šฉ - node_modules ๊ธฐ์ค€)
    "emitDecoratorMetadata": true, // ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‚ฌ์šฉ ์‹œ ํƒ€์ž… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ƒ์„ฑ (Reflect.metadata ๋“ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ•จ๊ป˜ ํƒ€์ž… ์ •๋ณด๋ฅผ runtime์— ์œ ์ง€ํ•˜๊ธฐ์œ„ํ•จ)
    "experimentalDecorators": true, // ์‹คํ—˜์ ์ธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ (@ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ)
    "importHelpers": true, // TypeScript์˜ ์ค‘๋ณต๋˜๋Š” ํ—ฌํผ ํ•จ์ˆ˜๋“ค์„ tslib์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •. ์ค‘๋ณต์ฝ”๋“œ ์ œ๊ฑฐ, ๋นŒ๋“œํฌ๊ธฐ ์ถ•์†Œ, ๊น”๋”ํ•œ ๋ฒˆ๋“ค ์ƒ์„ฑ(tslibํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค.)
    "target": "es2015", // TypeScript๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ๋ณ€ํ™˜๋  JavaScript ๋ฒ„์ „ (ES6)
    "module": "esnext", // import/export ๋ฌธ๋ฒ•์˜ ๋ชจ๋“ˆ ํ˜•์‹ ์ง€์ • ('commonjs', 'amd', 'es2015', 'esnext' ๋“ฑ)
    "lib": ["es2017", "dom"], // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‚ด์žฅ API๋ฅผ ์ •์˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จ (์˜ˆ: Promise, DOM ๋“ฑ)
    "skipLibCheck": true, // node_modules ๋‚ด์˜ .d.ts ํŒŒ์ผ ํƒ€์ž… ๊ฒ€์‚ฌ ์ƒ๋žต (์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ)
    "skipDefaultLibCheck": true, // ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๊ฒ€์‚ฌ ์ƒ๋žต
    "baseUrl": ".", // ๋ชจ๋“ˆ์„ importํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฒฝ๋กœ ์„ค์ •
    "paths": {
      "@dongsun/shared": ["libs/shared/src/index.ts"] // ๊ฒฝ๋กœ ๋ณ„์นญ ์„ค์ • (์˜ˆ: import from '@project/shared')
    }
  },
  "exclude": ["node_modules", "tmp"] // ์ปดํŒŒ์ผ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•  ๋””๋ ‰ํ† ๋ฆฌ
}

tsconfig.json(ํ”„๋กœ์ ํŠธ ๊ฐœ๋ณ„ ํด๋” ๋‚ด)

{
  "extends": "../../tsconfig.base.json", // ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ๊ณตํ†ต tsconfig ์„ค์ •์„ ๊ฐ€์ ธ์™€์„œ ํ™•์žฅ

  "compilerOptions": {
    "jsx": "preserve", // JSX ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด์„œ Babel ๊ฐ™์€ ๋‹ค๋ฅธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•จ(React, Next.js์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ)
    "allowJs": true, // .js ํŒŒ์ผ๋„ TypeScript์—์„œ import ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉ
    "esModuleInterop": true, // CommonJS ๋ชจ๋“ˆ์„ ES6 ๋ฐฉ์‹์œผ๋กœ import ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คŒ (import fs from 'fs'), default export๊ฐ€ ์—†๋Š” ๋ชจ๋“ˆ๋„ default์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
    "allowSyntheticDefaultImports": true, // default export๊ฐ€ ์—†์–ด๋„ default import ๋ฌธ๋ฒ•์„ ํ—ˆ์šฉ(esModuleInterop ์—†์ด๋„ ์ž‘๋™ํ•˜๋‚˜, ๋‘˜ ๋‹ค true๊ฐ€ ์ผ๋ฐ˜์ )
    "strict": false, // TypeScript์˜ strict ๋ชจ๋“œ (์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ) ๋น„ํ™œ์„ฑํ™”(true๋ฉด null ์ฒดํฌ, ํƒ€์ž… ์ถ”๋ก  ๋“ฑ ๋งค์šฐ ์—„๊ฒฉํ•ด์ง)
    "forceConsistentCasingInFileNames": true, // ํŒŒ์ผ import ์‹œ ๋Œ€์†Œ๋ฌธ์ž ์ผ์น˜ ๊ฐ•์ œ(ex: ์‹ค์ œ ํŒŒ์ผ์€ `MyComponent.tsx`์ธ๋ฐ `myComponent`๋กœ importํ•˜๋ฉด ์˜ค๋ฅ˜)
    "noEmit": true, // ์‹ค์ œ๋กœ JavaScript ํŒŒ์ผ(.js)๋กœ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š์Œ (๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ์ƒ์„ฑ ์•ˆ ํ•จ)์ฃผ๋กœ ํƒ€์ž… ๊ฒ€์‚ฌ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉ (Next.js์—์„œ๋Š” Babel์ด ์ปดํŒŒ์ผํ•˜๋ฏ€๋กœ TS๊ฐ€ emitํ•  ํ•„์š” ์—†์Œ)
    "resolveJsonModule": true, // .json ํŒŒ์ผ๋„ import ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์คŒ (ex: import config from './config.json')
    "isolatedModules": true, // ๊ฐ ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์ธ ๋ชจ๋“ˆ๋กœ ์ทจ๊ธ‰ (Next.js ๋“ฑ์—์„œ ํ•„์ˆ˜ ์„ค์ •) Babel์„ ์‚ฌ์šฉํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•  ๋•Œ, TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์„ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”
    "incremental": true, // ์ด์ „ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด์„œ ๋‹ค์Œ ์ปดํŒŒ์ผ ์‹œ ์†๋„ ํ–ฅ์ƒ (์บ์‹œ ๊ธฐ๋ฐ˜)
    "types": ["jest", "node"] // ๊ธ€๋กœ๋ฒŒ ํƒ€์ž… ์ •์˜ํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์ •(jest ํ…Œ์ŠคํŠธ์šฉ, node.js ๊ด€๋ จ ํƒ€์ž… ํฌํ•จ)
  },

  "include": [
    "**/*.ts",     // ๋ชจ๋“  .ts ํŒŒ์ผ ํฌํ•จ
    "**/*.tsx",    // ๋ชจ๋“  .tsx (React ์ปดํฌ๋„ŒํŠธ ๋“ฑ) ํŒŒ์ผ ํฌํ•จ
    "**/*.js",     // .js ํŒŒ์ผ๋„ ํฌํ•จ (allowJs: true์ผ ๊ฒฝ์šฐ ํ•„์š”)
    "**/*.jsx",    // .jsx ํŒŒ์ผ๋„ ํฌํ•จ
    "next-env.d.ts" // Next.js์—์„œ ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ํƒ€์ž… ์ •์˜ ํฌํ•จ
  ],

  "exclude": [
    "node_modules", // ์˜์กด์„ฑ ํด๋” ์ œ์™ธ
    "jest.config.ts", // Jest ์„ค์ • ํŒŒ์ผ ์ œ์™ธ
    "src/**/*.spec.ts", // ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ œ์™ธ
    "src/**/*.test.ts"  // ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ œ์™ธ
  ]
}

๊ทธ ์™ธ ์ถ”์ฒœ ์˜ต์…˜

{
 "compilerOptions": {
	"strict": true,
	"strictNullChecks": true,       // null/undefined์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ฒดํฌ
	"noImplicitAny": true,          // ํƒ€์ž… ์ถ”๋ก  ์‹œ any ๋ฐฉ์ง€
	"strictFunctionTypes": true,    // ํ•จ์ˆ˜ ํƒ€์ž… ๋” ์—„๊ฒฉํžˆ ์ฒดํฌ
	"noUnusedLocals": true,      // ์„ ์–ธ๋งŒ ๋˜๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ๊ฒฝ๊ณ 
	"noUnusedParameters": true   // ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒฝ๊ณ 
	"noFallthroughCasesInSwitch": true //switch๋ฌธ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌ. break๋ฅผ ๋น ๋œจ๋ฆฌ๋Š” ์‹ค์ˆ˜ ๋ฐฉ์ง€ํ•ด์คŒ
	"exactOptionalPropertyTypes": true //optional ํ”„๋กœํผํ‹ฐ์—์„œ "์—†์Œ"๊ณผ "undefined"๋ฅผ ๊ตฌ๋ถ„
	"useUnknownInCatchVariables": true // ๊ธฐ๋ณธ์ ์œผ๋กœ catch (e)๋Š” any ํƒ€์ž…์ธ๋ฐ, ์ด๊ฑธ unknown์œผ๋กœ ๋ฐ”๊ฟ”์„œ ํƒ€์ž… ๋‹จ์–ธ์„ ์œ ๋„
  "checkJs": true, // ์ผ๋ฐ˜ js ํŒŒ์ผ์—์„œ๋„ ์—๋Ÿฌ์ฒดํฌ ์—ฌ๋ถ€ 
  "declaration": true, //์ปดํŒŒ์ผ์‹œ .d.ts ํŒŒ์ผ๋„ ์ž๋™์œผ๋กœ ํ•จ๊ป˜์ƒ์„ฑ (ํ˜„์žฌ์“ฐ๋Š” ๋ชจ๋“  ํƒ€์ž…์ด ์ •์˜๋œ ํŒŒ์ผ)
  "removeComments": true, //์ปดํŒŒ์ผ์‹œ ์ฃผ์„์ œ๊ฑฐ 
  "strictPropertyInitialization": true, //class constructor ์ž‘์„ฑ์‹œ ํƒ€์ž…์ฒดํฌ ๊ฐ•ํ•˜๊ฒŒ
  "noImplicitThis": true, //this ํ‚ค์›Œ๋“œ๊ฐ€ any ํƒ€์ž…์ผ ๊ฒฝ์šฐ ๊ฒฝ๊ณ 
  "noImplicitReturns": true, //ํ•จ์ˆ˜์—์„œ return ๋นผ๋จน์œผ๋ฉด ๊ฒฝ๊ณ 
 }
}

tsconfig.json์€ ์—ฌ๋Ÿฌ ๋ฒ„์ „์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ค์ •์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณต์‹์ ์œผ๋กœ ํŒŒ์ผ ์ด๋ฆ„์— ์ œ์•ฝ์€ ์—†๊ณ , ๊ด€๋ก€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฆ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-04-10 แ„‹แ…ฉแ„’แ…ฎ 8.39.31.png

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด ๋†“์€ ์„ค์ •๋“ค์€ tsc -p tsconfig.build.json ์œผ๋กœ ๋นŒ๋“œํ•  ๋•Œ ์ง€์ •ํ•ด์ฃผ๊ฑฐ๋‚˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ๋“ฑ๋กํ•ด๋‘๋ฉด ๋œ๋‹ค.

{
  "scripts": {
    "build": "tsc -p tsconfig.build.json"
  }
}

๐Ÿ“šย ESLint

์„ค์ •์ด ๋‹จ์ˆœํ•˜๊ฑฐ๋‚˜ ํŒ€ ๋‚ด ํฌ๋งท ์ผ๊ด€์„ฑ์ด ์ค‘์š”ํ•  ๋•Œ(์ฃผ์„์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ, ์ •์  ๊ตฌ์กฐ) โ†’ .eslintrc.json

์กฐ๊ฑด๋ถ€ ์„ค์ •, ํ™˜๊ฒฝ๋ณ„ ๋ถ„๊ธฐ, ๋™์  import๊ฐ€ ํ•„์š”ํ•  ๋•Œ(js์‚ฌ์šฉ ๊ฐ€๋Šฅ) โ†’ .eslintrc.js

eslintrc.json

nx๊ธฐ๋ฐ˜ ๋ชจ๋…ธ๋ ˆํฌ ๋ฃจํŠธ๋””๋ ‰ํ† ๋ฆฌ