๊ฐœ์ธ๊ณต๋ถ€/TDD

Typescript, Jestํ™˜๊ฒฝ์—์„œ alias์ ์šฉํ•˜๊ธฐ (์ ˆ๋Œ€๊ฒฝ๋กœ import)

soon327 2021. 10. 31. 22:08


๐Ÿง ์ ˆ๋Œ€๊ฒฝ๋กœ import ?

๋ณดํ†ต ๋””๋ ‰ํ† ๋ฆฌ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•˜์ง€ ์•Š๋‹ค๋ฉด import ์‹œ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•ด๋„ ํฐ ๋ถˆํŽธํ•จ์ด ์—†๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ• ์ˆ˜๋ก ์ƒ๋Œ€๊ฒฝ๋กœ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณด๊ธฐ ์•ˆ์ข‹์•„์ง€๊ฒŒ ๋˜๋Š”๋ฐ,
๋‚˜์˜ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ importํ•  ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ฒŒ๋˜์—ˆ๋‹ค.
๋””๋ ‰ํ† ๋ฆฌ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

โ”œโ”€โ”€ _test/
         ใ„ด_reducer/
              ใ„ด todo.test.ts
         ใ„ด components/
         ใ„ด hooks/
          ...
โ”œโ”€โ”€ src/
         ใ„ด _reducer/
              ใ„ด todo.ts
         ใ„ด components/
         ใ„ด hooks/
          ...

srcํด๋”์™€ ๊ฐ™์€ deps์— _testํด๋”๊ฐ€ ์กด์žฌํ•˜๊ธฐ๋•Œ๋ฌธ์—
_testํด๋”์˜ ํŒŒ์ผ์—์„œ srcํด๋”์˜ ํŒŒ์ผ๋“ค์„ importํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์กฐ๊ธˆ์€ ์–ด์ง€๋Ÿฌ์šด ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์•ผํ–ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋ฅผ ๊ฐ„๋‹จํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ importํ•˜๋Š” alias ์„ค์ •์„ ์ฐพ์•„๋ดค๋‹ค.


๐Ÿ˜Ž Alias ์„ค์ •ํ•˜๊ธฐ

react์—์„œ alias๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€

  1. ์ง์ ‘ ๋ฐ”๋ฒจ,์›นํŒฉ์„ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์™€
  2. CRA๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ
    ์— ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ webpack์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ์„ค์ •ํ•˜๋ฉด ๋˜์ง€๋งŒ,
CRA์—์„œ webpack์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ˆ˜์ •์„ ์œ„ํ•œ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์—ฌ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” CRA์—์„œ Alias๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

webpack ์ˆ˜์ • ๋ชจ๋“ˆ - craco

webpack ์ˆ˜์ •์„ ์œ„ํ•œ ๋ชจ๋“ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ craco๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•ด๋ณด๋„๋กํ•˜๊ฒ ๋‹ค.
craco๋ฅผ ํ†ตํ•ด webpack์„ ์ˆ˜์ •ํ•˜๊ธฐ์œ„ํ•ด ์ด๋ฅผ ์„ค์น˜ํ•ด์ฃผ์ž.

npm install --save-dev @craco/craco craco-alias

1. tsconfig.paths.json ํŒŒ์ผ ์ƒ์„ฑ
๋ฃจํŠธ์œ„์น˜์— tsconfig.paths.json์„ ์ƒ์„ฑํ•œ๋‹ค.
tsconfig.json์˜ path๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์‹œ, ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ธฐ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ pathsํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

// tsconfig.paths.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

paths์— ์›ํ•˜๋Š” alias๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ../../../src/components/TodoList.tsx๋ฅผ @/components/TodoList.tsx๋กœ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. craco.config.js ํŒŒ์ผ ์ƒ์„ฑ
๋ฃจํŠธ์œ„์น˜์— craco.config.js๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

// craco.config.js
const CracoAlias = require('craco-alias');

module.exports = {
  plugins: [
    {
      plugin: CracoAlias,
      options: {
        source: 'tsconfig',
        tsConfigPath: 'tsconfig.paths.json',
      },
    },
  ],
};

3. tsconfig.jsonํŒŒ์ผ์— extends๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

// tsconfig.json
{
  "extends": "./tsconfig.paths.json",
  "compilerOptions": {
        ...
      }
    ...
  }

4. jest์„ค์ • ์ถ”๊ฐ€
ํ…Œ์ŠคํŠธํŒŒ์ผ์—์„œ๋„ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด jest.config.js์˜ moduleNameMapper์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

module.exports={
    ...
    moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
}

5. package.json ํŒŒ์ผ ์ˆ˜์ •
craco์„ค์ •์„ ์ ์šฉํ•˜๊ธฐ์œ„ํ•ด package.jsonํŒŒ์ผ์˜ react-scripts๋ฅผ craco๋กœ ์ˆ˜์ •ํ•œ๋‹ค.

"scripts": {  
    "start": "craco start",  
    "build": "craco build",  
    "test": "jest --env=jsdom",  
    "eject": "craco eject"  
}  

๐Ÿ‘ ๊ฒฐ๊ณผ

ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ ํ”„๋กœ์ ํŠธ ํด๋”์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

import prepareReduxWrapper from '@/lib/prepareReduxWrapper';
import TodoFilters from '@/components/TodoFilters';

๐Ÿ™ ์ฐธ๊ณ