본문 바로가기
NodeJS/NestJS

[NestJS] 표준모드와 모노레포 및 CLI 속성 살펴보기

by 검은냥냥이 2023. 6. 7.

프로젝트 구조

Nest에서는 표준 모드와 모노레포 모드 두 가지 구조로 프로젝트를 관리할 수 있습니다. 표준 모드는 "nest new"를 실행하여 생성된 기본 프로젝트 구조로, 컴포넌트를 추가하며 작업할 수 있습니다.

모노레포 모드는 여러 프로젝트와 라이브러리를 관리하기 위한 대체 구조로, 빌드 프로세스를 단순화하는 장점이 있습니다. 나머지 Nest 기능과 문서는 두 모드에 동일하게 적용되며, 필요에 따라 표준 모드에서 모노레포 모드로 전환할 수 있습니다.

 

기능 표준 모드 모노레포 모드
다중 프로젝트 별도의 파일 시스템 구조 단일 파일 시스템 구조
node_modules 및 package.json 별도의 인스턴스 모노레포 내에서 공유
기본 컴파일러 tsc webpack
컴파일러 설정 개별적으로 지정 모노레포 기본값을 프로젝트별로 재정의 가능
.eslintrc.js, .prettierrc 등의 구성 파일 개별적으로 지정 모노레포 내에서 공유
nest build 및 nest start 명령어 컨텍스트 내의 (유일한) 프로젝트를 자동으로 대상으로 설정 모노레포 내의 기본 프로젝트를 대상으로 설정
라이브러리 수동으로 관리 (일반적으로 npm 패키징) 경로 관리 및 번들링을 포함한 내장 지원

 

표준 모드(Standard Mode)란?

Standard Mode Structure

개별 프로젝트에 중점을 둔 응용 프로그램을 구축하는 데 유용하며, 해당 프로젝트에 독립적인 종속성과 설정을 갖고 있으며, 모듈 공유나 복잡한 빌드 최적화가 필요하지 않은 경우에 적합합니다. (기본 모드)

 

모노레포 모드(Monorepo Mode)란?

Monorepo Mode Structure

모노레포 모드는 가볍고 모노레포 구조로 코드 아티팩트를 다루며, 개발자 팀이나 다중 프로젝트 환경에서 유용합니다. 모듈화 된 컴포넌트를 쉽게 생성하고 조합할 수 있도록 자동화된 빌드 프로세스를 제공하며, 코드 재사용을 촉진하고 통합 테스트를 용이하게 만들고, 프로젝트 전체에서 공유되는 설정과 규칙을 관리할 수 있습니다.

모노레포 모드는 Nest의 기능과 독립적으로 작동하며, 프로젝트 구성과 빌드 아티팩트 생성 방식만 다릅니다. 모노레포 모드는 표준 모드에서 프로젝트를 추가하여 전환할 수 있으며, 이를 통해 여러 프로젝트를 쉽게 관리할 수 있습니다.

 

 

CLI 속성 살펴보기

Nest는 표준 및 모노레포 구조의 프로젝트를 구성, 빌드 및 배포하기 위해 필요한 메타데이터를 "nest-cli.json" 파일에 유지합니다. Nest는 프로젝트를 추가할 때 자동으로 이 파일을 추가하고 업데이트하므로 일반적으로 직접 편집할 필요가 없습니다. 그러나 수동으로 변경해야 할 설정이 있을 수 있으므로 파일에 대한 개요적인 이해가 도움이 됩니다.

모노레포(monorepo)를 생성하기 위해 위의 단계를 실행한 후 "nest-cli.json" 파일은 다음과 같습니다.

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "apps/my-project/src",
  "monorepo": true,
  "root": "apps/my-project",
  "compilerOptions": {
    "webpack": true,
    "tsConfigPath": "apps/my-project/tsconfig.app.json"
  },
  "projects": {
    "my-project": {
      "type": "application",
      "root": "apps/my-project",
      "entryFile": "main",
      "sourceRoot": "apps/my-project/src",
      "compilerOptions": {
        "tsConfigPath": "apps/my-project/tsconfig.app.json"
      }
    },
    "my-app": {
      "type": "application",
      "root": "apps/my-app",
      "entryFile": "main",
      "sourceRoot": "apps/my-app/src",
      "compilerOptions": {
        "tsConfigPath": "apps/my-app/tsconfig.app.json"
      }
    }
  }
}
속성 설명
collection 컴포넌트 생성에 사용되는 스키매틱 컬렉션을 가리킵니다.
sourceRoot 표준 모드 구조에서는 단일 프로젝트의 소스 코드 루트를 가리킵니다.
compilerOptions 컴파일러 옵션을 지정하는 키와 해당 옵션 설정을 지정하는 값으로 구성된 맵입니다.
generateOptions 전역 생성 옵션을 지정하는 키와 해당 옵션 설정을 지정하는 값으로 구성된 맵입니다.
monorepo 모노레포 모드 구조에서는 이 값이 항상 true입니다.
root 기본 프로젝트의 프로젝트 루트를 가리킵니다.

 

전역 컴파일러 옵션(Global Compiler Options)

"nest build" 또는 "nest start"의 일부로 발생하는 컴파일 단계에 영향을 주는 다양한 옵션과 함께 사용할 컴파일러를 지정합니다. 컴파일러는 tsc 또는 webpack인지에 상관없이 모든 컴파일 단계에 영향을 줍니다.

속성 속성 타입 설명
webpack boolean true인 경우 webpack 컴파일러를 사용합니다. false이거나 존재하지 않으면 tsc를 사용합니다. 모노레포 모드에서는 기본값이 true입니다 (webpack 사용), 표준 모드에서는 기본값이 false입니다 (tsc 사용). 자세한 내용은 아래를 참조하세요.
tsConfigPath string (모노레포 전용) nest build 또는 nest start에 프로젝트 옵션 없이 호출될 때 사용할 tsconfig.json 설정이 포함된 파일을 가리킵니다.
(EX: 기본 프로젝트를 빌드하거나 시작할 때)
webpackConfigPath string webpack 옵션 파일을 가리킵니다. 지정되지 않으면 Nest는 webpack.config.js 파일을 찾습니다.
deleteOutDir boolean true인 경우 컴파일러가 실행될 때 먼저 컴파일 출력 디렉토리를 제거합니다.
(기본값은 tsconfig.json에서 설정한대로 ./dist입니다)
assets array 컴파일 단계가 시작될 때 TypeScript가 아닌 에셋을 자동으로 분배할 수 있도록 활성화합니다.
(증분 컴파일의 경우 --watch 모드에서는 에셋 분배가 발생하지 않습니다). 자세한 내용은 아래를 참조하세요.
watchAssets boolean true인 경우 모든 TypeScript가 아닌 에셋을 감시하는 watch 모드로 실행됩니다.
manualRestart boolean true인 경우 서버를 수동으로 재시작하는 rs 단축키를 활성화합니다.
기본값은 false입니다.

 

웹팩 옵션(Webpack Options)

webpack 옵션 파일에는 표준 webpack 구성 옵션이 포함될 수 있습니다. 예를 들어 webpack에 node_modules(기본적으로 제외됨)를 묶도록 지시하려면 "webpack.config.js"에 다음을 추가합니다.

module.exports = function (options) {
  return {
    ...options,
    externals: [],
  };
};

 

자산(Assets)

Assets는 TypeScript 컴파일이 자동으로 컴파일러 출력 (.js 및 .d.ts 파일)을 지정된 출력 디렉토리로 분배하는 기능입니다. 또한 ".graphql", 이미지, ".html" 파일 및 기타 자산과 같은 TypeScript가 아닌 파일을 분배하는 것이 편리할 수 있습니다. 이를 통해 nest build (및 초기 컴파일 단계)를 가벼운 개발 빌드 단계로 취급할 수 있으며, TypeScript가 아닌 파일을 편집하고 반복적으로 컴파일하고 테스트할 수 있습니다. Assets은 src 폴더에 위치해야 복사됩니다.

Assets 키의 값은 분배할 파일을 지정하는 요소로 구성된 배열이어야 합니다. 요소는 글로브와 유사한 파일 스펙을 가진 간단한 문자열일 수 있습니다. 예를 들어:

  • .graphql 파일
  • 이미지
  • .html 파일 등

Assets 키의 값은 배포할 파일을 지정하는 요소의 배열이어야 합니다. 요소는 glob과 같은 파일 사양을 가진 간단한 문자열일 수 있습니다. 예를 들면 다음과 같습니다.

"assets": ["**/*.graphql"],
"watchAssets": true,
속성 속성 타입 설명
include string, array 분배할 자산을 지정하는 글로브와 유사한 파일 스펙입니다.
exclude string, array include 목록에서 제외할 자산을 지정하는 글로브와 유사한 파일 스펙입니다.
outDir string Assets이 분배될 경로를 지정하는 문자열입니다. 루트 폴더를 기준으로 상대 경로로 지정합니다. 컴파일러 출력에 구성된 동일한 출력 디렉토리가 기본값입니다.
watchAssets boolean true인 경우 지정된 자산을 감시하는 watch 모드로 실행됩니다.

 

예제

"assets": [
  { "include": "**/*.graphql", "exclude": "**/omitted.graphql", "watchAssets": true },
]
주의할점 : 최상위 compilerOptions 속성에서 watchAssets를 설정하면 assets 속성 내의 모든 watchAssets 설정이 재정의됩니다.

 

728x90
사업자 정보 표시
레플라 | 홍대기 | 경기도 부천시 부일로 519 화신오피스텔 1404호 | 사업자 등록번호 : 726-04-01977 | TEL : 070-8800-6071 | Mail : support@reafla.co.kr | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기