NestJS 에서 path alias 설정하기 (feat. TypeORM, Jest)

modolee·2020년 11월 3일
13
post-thumbnail

alias 설정 이유

  • 상대 경로로 지저분하게 설정되어 있는 경로를 깔끔하게 정리하기 위해서 alias를 사용합니다.

alias 설정 전

import { AuthResDto } from '../../src/auth/dto/response.dto';
import { AuthService } from '../../src/auth/auth.service';

alias 설정 후

import { AuthResDto } from '@auth/dto/response.dto';
import { AuthService } from '@auth/accounts.service';

프로젝트 구조

  • NestJS를 이용해서 만든 프로젝트의 기본 구조의 대략적으로 아래와 같습니다.
./
├── package.json
├── src
│   ├── auth
│   │   ├── auth.service.ts
│   │   └── auth.service.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   └── ormconfig.ts
├── test
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.json
├── tsconfig.paths.json
└── tsconfig.paths.json

tsconfig.paths.json

  • 기본적인 소스코드에 적용되는 alias 설정
{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@root/*": ["./src/*"],
      "@auth/*": ["./src/auth/*"]
    }
  }
}

tsconfig.json

  • tsconfig.paths.json을 상속 받아서 사용
{
  "extends": "./tsconfig.paths.json",
  
  ... (나머지 설정)
  
}
  • 이렇게 2가지만 설정해도 일반적으로 사용하는데에는 문제가 없습니다.

package.json

TypeORM을 위한 설정

  • TypeORM CLI를 이용해서 Migration 명령을 사용하고 있다면 추가 설정이 필요 할 수도 있습니다.
  • 저는 ormconfig.ts 파일에서 alias를 사용하기 때문에 아래와 같이 옵션을 추가했습니다.
  • yarn 또는 npm 을 통해서 typeorm cli를 실행 시킬 때 추가 하는 기본적인 명령에 -r tsconfig-paths/register 옵션을 추가합니다.
// package.json
{
  ...
  
  "scripts": {
    "typeorm": "node -r tsconfig-paths/register -r ts-node/register ./node_modules/typeorm/cli.js --config src/ormconfig.ts",
    "migration:create": "yarn typeorm migration:create",
    "migration:run": "yarn typeorm migration:run",
    "migration:revert": "yarn typeorm migration:revert",
  }
  
  ...
}

Jest Unit 테스트를 위한 설정

  • yarn test를 이용해 unit 테스트 할 때 에러가 발생한다면, 아래 설정을 추가해야 합니다.
  • 설정을 추가하면 src/auth/auth.service.spec.ts 파일과 같은 unit 테스트 파일에서 alias를 사용할 수 있습니다.
  • package.json과 살짝 다르니 주의하세요.
  • 경로에 src가 빠진 이유는 rootDir이 기본적으로 src로 설정되어 있기 때문입니다.
// package.json
{
  ...
    
  "jest": {
     ...
     
    "rootDir": "src",
    "moduleNameMapper": {
      "^@root/(.*)$": "<rootDir>/$1",
      "^@auth/(.*)$": "<rootDir>/auth/$1"
    }
    
    ...
  }

  ...
}

jest-e2e.json

  • Jest End-to-End 테스트를 위한 설정
  • yarn test:e2e 실행 시 기본적으로 이 파일의 설정을 따릅니다. 그래서 e2e 테스트에 alias를 사용하려면 해당 파일에 설정을 추가해야합니다.
  • Unit 테스트를 위한 설정과 약간 다릅니다.../src가 추가 된 이유는 e2e 테스트 파일에서의 rootDirtest 디렉터리를 의미합니다. 그래서 실행 코드가 있는 src 디렉터리를 가리키기 위해 ../src을 추가해 줘야 합니다.
{
  ...
  "rootDir": ".",
  "moduleNameMapper": {
    "^@root/(.*)$": "<rootDir>/../src/$1",
    "^@auth/(.*)$": "<rootDir>/../src/auth/$1"
  }
  
  ...
}

Build 후 d.ts 파일의 alias 처리하기 (2021.04.29 추가)

  • yarn build 실행 후 dist 디렉터리에 나오는 파일 중 .d.ts 파일에는 alias가 그대로 있는 것을 확인할 수 있다.
  • 아래 설정 추가 후 build 시 alias가 상대 경로로 수정되어 있는 것을 확인할 수 있다.

tsc-alias 설치

yarn add -D tsc-alias

package.json 파일 수정

  "scripts": {
    "build": "nest build && tsc-alias",
  },

참고

profile
기초가 탄탄한 백엔드 개발자를 꿈꿉니다.

8개의 댓글

comment-user-thumbnail
2020년 11월 15일

허허 nest 쓰시는 분 발견했네요 ㅎㅎ 한국에서도 있군용 !!

1개의 답글
comment-user-thumbnail
2020년 11월 19일

글 잘 읽고 있습니다 :p 근데 e2e 가 뭔가요 ?

1개의 답글
comment-user-thumbnail
2021년 7월 19일

글 잘 읽었습니다 :)
궁금한 것이 하나 있는데 혹시 vsc에서 auto import될 때 tsconfig path에서 설정한대로 할 수 있게 하는 방법이 있을까요?
relative path는 자동으로 알아서 해주는데 tsconfig path 설정으로 자동 임포트하게 하는 방법을 못찾겠네요 ㅎㅎ;; 아니면 이런경우에 다들 손으로 직접 경로를 작성하시나요?

1개의 답글
comment-user-thumbnail
2023년 10월 16일

혹시나 저와 같은 삽질을 겪고 계실 분들을 위해 댓글 남깁니다.(아 다시 생각해도 멍청 ㅠㅠ)

저는 타입스크립트 사용을 좋아해서 타입스크립트 최신버전을 적용하려고 시도 했었는데요.
단순하게 yarn upgrade typescript@latest 로 최신 버전(@5.x.x)을 설치했고
nest start를 통해 실행한 결과 paths를 인식하지 못해 start시 수행하는 build가 경로 오류로 인해 실행되지 못하는 상황을 겪고 있었습니다.

여러 삽질을 했지만 결론은 간단했습니다.
저처럼 yarn을 쓰신다면
@nestjs/cli의 버전을 전역(global), 프로젝트(local) 둘다 체크를 해보시고 8.x.x 버전을 사용하고 계시다면
전역에선 yarn global upgrade-interactive --latest 를 통해 @nestjs/cli를 선택적으로 업그레이드 해주시고
로컬에선 yarn upgrade-interactive --latest를 통해 @nestjs/cli, @nestjs/schematics, @nestjs/testing 를 업그레이드 해주시면 잘 돌아갈 겁니다.

언제 설치 했는지는 기억이 잘 안나지만 1년 반쯤 전에 nest 공부하려다 설치해둔 버전이 8.x.x 버전이었고
이버전을 저는 그대로 사용하는 바람에 nest new 명령어로 프로젝트를 생성했더니 8.x.x 버전대로 설치가 되었던 겄이 었습니다.

아 참 바보 멍청이 같은 ...

부끄럽지만 다른 분들에게 아니 단한 분이라도 도움이 될수 있었으면 좋겠습니다.

답글 달기