Nest cli로 만들어진 폴더와 파일

songtofu·2022년 5월 23일
0

ft_transcendence

목록 보기
3/5

출처(공부한다고 따라썼음. 내용 같음)

1. 구조


+) 데코레이터가 뭔지 모른다면 클릭!

2. 폴더

2.1) dist (distribution)

Nest.js는 주로 Typescript 기반으로 작성.
따라서 src폴더의 Ts파일들을 Js파일로 컴파일한 결과물이 dist 폴더에 존재

2.2) node_modules

npm을 통해 모듈을 설치하면 실제로 저장되는 폴더.
설치하려는 모듈과 모듈이 의존하고 있는 모듈까지 함께 저장.

2.3) src

실제로 프로그램을 구현하는 폴더.

2.3.1) app.controller.spec.ts

  • 컨트롤러 단위 테스트용
  • 주로 Jest를 이용하여 단위 테스트를 실행.

2.3.2) app.controller.ts

  • 기본 컨트롤러(요청과 응답을 처리해주는 역할)
  • 그 외의 작업은 service 파일에서 처리.
  • Nest.js의 권장사항인 생성자를 이용한 의존성 주입(DI)를 통해 service를 불러오게 된다

    의존성 주입(DI)
    개발자가 정의한 코드들을 Nest.js가 대신 관리해주는것.
    제어의 역전(IoC)의 기술 중 하나.

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

2.3.3) app.module.ts

  • application의 root module
  • 후에 많은 폴더와 모듈들을 만들게 되는데, 각 모듈들을 이 파일에 import하게 된다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({ // @Module() 데코레이터가 imports, controllers, providers라는 세 가지 속성의 객체를 받는다. 
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {} // 실제로는 exports라는 속성까지 포함해 총 네 가지 속성

2.3.4) app.service.ts

  • 단일 메서드를 사용하는 기본 서비스
  • 컨트롤러에서 구현하지 않은 부분을 이곳에서 처리
  • @Injectable()을 통해 아래 AppService에 작성된 함수들은 의존성 주입(DI)의 대상이 되도록 지정
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

2.3.5) main.ts

  • NestFactory를 사용하여 Nest application 인스턴스를 작성하는 엔트리 파일(Nest JS의 진입점)

    NestFactory란?
    Nest JS의 핵심기능을 담당하며, Nest 기반의 애플리케이션을 생성하고 구동하는 역할을 하는 클래스.

  • Nest.js의 애플리케이션이 시작되는 파일.
  • 쿠키, Swagger, Cors 등 보통 전역적인 환경 설정.
import { NestFactory } from '@nestjs/core'; //@nestjs/core에서 라이브러리에서 NestFactory를 가져옴
import { AppModule } from './app.module'; //  AppModule은 아까 만들어진 app.module.ts 파일에서 가져옴

async function bootstrap() {
  const app = await NestFactory.create(AppModule); //해당 함수 내에서 NestFactory.create() 메서드가 AppModule를 인수로 받아서 Nest 어플리케이션 인스턴스를 생성
  await app.listen(3000); //생성된 Nest 어플리케이션 인스턴스에 listen() 메서드를 사용하여 3000번 포트를 사용하여 웹서버를 구동 , listen() 메소드가 Promise 객체를 반환하기 때문에 await를 사용한 것 -> 그래서 main.ts의 bootstrap 함수는 기본적으로 async로 선언
}
bootstrap();

async 키워드
- function 앞에 위치
- 항상 프라미스를 반환
await 키워드
- 프라미스가 처리될 때 까지 기다린다. 결과는 그 이후 반환된다.

2.4) test

  • app.controller.spec.ts 에선 단위 테스트를 했다면, test폴더 내에선 end-to-end 테스트를 하게 됩니다.
    Nest에선 Supertest 라이브러리를 사용하며, HTTP 요청을 쉽게 시물레이션 할 수 있습니다.
    (????)

3. 파일

3.1) .eslintrc.js

  • js 문법을 검토하여 에러가 있는 곳에 표시 해주는 ESLint라는 도구가 있다. ESLint를 수동으로 설치하여 실행하거나, Nest CLI를 실행하면 .eslintrc.js라는 파일이 생성, 이 파일은 ESLint의 설정파일 역할을 한다.
module.exports = {
  parser: '@typescript-eslint/parser',
  parserOptions: {
    project: 'tsconfig.json',
    tsconfigRootDir : __dirname, 
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint/eslint-plugin'],
  extends: [
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  root: true,
  env: {
    node: true,
    jest: true,
  },
  ignorePatterns: ['.eslintrc.js'],
  rules: {
    '@typescript-eslint/interface-name-prefix': 'off',
    '@typescript-eslint/explicit-function-return-type': 'off',
    '@typescript-eslint/explicit-module-boundary-types': 'off',
    '@typescript-eslint/no-explicit-any': 'off',
  },
};

3.1.1) parser

  • ESLint는 구문 분석을 위해 기본으로 Espree를 파서로 사용, Nest.js는 Typescript로 작성되므로 @typescript-eslint/parser를 선택

3.1.2) parserOptions

  • ESLint 사용을 위해 지원하려는 언어 옵션을 지정
  1. project: 타입 정보를 필요로 하는 규칙들을 사용하고 싶으면 설정해야하는 속성
  2. sourceType: parser의 export 형태

3.1.3) plugins

  • ESlink의 플러그인을 지정할 수 있습니다. 규칙들의 집합이라 볼 수 있습니다.
  • @typescript-eslint/eslint-plugin는 Typescript 코드 베이스에 대한 린트 규칙을 제공하는 ESLint 플러그인

3.1.4) extends

  • 위의 plugins에서 사용할 규칙을 정합니다.
  • @typescript-eslint/recommended과 prettier/recommended는 각 플러그인에 대한 모든 권장 규칙을 활성화

3.1.5) root

  • 한 프로젝트 안에 여러개의 .eslintrc.js 파일이 있을 수 있습니다.
  • ESLint는 root가 true일 경우 상위폴더 검색을 중지합니다.
  • package.json 파일과 같은 폴더에 있다면, .eslintrc.js가 우선순위

3.1.6) env

3.1.7) ignorePatterns

  • 제외하고 싶은 파일이나 폴더를 입력

3.1.8) rules

  • 프로젝트에서 사용하는 규칙을 수정
  1. off / 0 : 규칙을 사용하지 않음
  2. warn / 1 : 규칙을 경고로 사용
  3. error / 2 : 규칙을 오류로 사용

3.2) .gitignore

  • .gitignore 파일에 적혀진 파일 혹은 폴더는 git add에 포함되지 않고 무시

3.3) .prettierrc

  • 코드 스타일을 예쁘게 함. 이 Prettier의 옵션을 .prettierrc에서 설정.
{
  "arrowParens": "avoid", // 화살표 함수 괄호 사용 방식
  "bracketSpacing": false, // 객체 리터럴에서 괄호에 공백 삽입 여부 
  "endOfLine": "auto", // EoF 방식, OS별로 처리 방식이 다름 
  "htmlWhitespaceSensitivity": "css", // HTML 공백 감도 설정
  "jsxBracketSameLine": false, // JSX의 마지막 `>`를 다음 줄로 내릴지 여부 
  "jsxSingleQuote": false, // JSX에 singe 쿼테이션 사용 여부
  "printWidth": 80, //  줄 바꿈 할 폭 길이
  "proseWrap": "preserve", // markdown 텍스트의 줄바꿈 방식 (v1.8.2)
  "quoteProps": "as-needed" // 객체 속성에 쿼테이션 적용 방식
  "semi": true, // 세미콜론 사용 여부
  "singleQuote": true, // single 쿼테이션 사용 여부
  "tabWidth": 2, // 탭 너비 
  "trailingComma": "all", // 여러 줄을 사용할 때, 후행 콤마 사용 방식
  "useTabs": false, // 탭 사용 여부
  "vueIndentScriptAndStyle": true, // Vue 파일의 script와 style 태그의 들여쓰기 여부 (v1.19.0)
  "parser": '', // 사용할 parser를 지정, 자동으로 지정됨
  "filepath": '', // parser를 유추할 수 있는 파일을 지정
  "rangeStart": 0, // 포맷팅을 부분 적용할 파일의 시작 라인 지정
  "rangeEnd": Infinity, // 포맷팅 부분 적용할 파일의 끝 라인 지정,
  "requirePragma": false, // 파일 상단에 미리 정의된 주석을 작성하고 Pragma로 포맷팅 사용 여부 지정 (v1.8.0)
  "insertPragma": false, // 미리 정의된 @format marker의 사용 여부 (v1.8.0)
  "overrides": [ 
    {
      "files": "*.json",
      "options": {
        "printWidth": 200
      }
    }
  ], // 특정 파일별로 옵션을 다르게 지정함, ESLint 방식 사용
}
//출처 https://heewon26.tistory.com/262

+) https://prettier.io/docs/en/options.html

3.4) nest-cli.json

  • Nest는 프로젝트를 빌드하고 배포하는데 필요한 메타데이터를 nest-cli.json파일에 보관
{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src"
}

3.4.1) collection

  • 구성 요소를 생성하는 데 사용되는 스키마 컬렉션의 포인트입니다. 일반적으로 이 값을 변경하면 안 됩니다.

3.4.2) sourceRoot

  • 프로젝트 소스 코드의 루트

3.4.3) compilerOptions

  • 컴파일러 옵션을 지정하는 키와 옵션 설정을 지정하는 값이 있는 맵

3.4.4) generateOptions

3.5) package-lock.json

  • package.json의 version range를 대신해 정확한 version을 명시해 의존성을 보장
  • package.json은 주로 "^" 를 사용해 버전의 범위를 나타냅니다.
    하지만 정확한 버전이 아니기에 협업중에 버전으로 인한 오류가 생길 수 있습니다.
    따라서 package-lock.json에 정확한 버전을 입력하여 의존성에 대한 정보를 모두 가지고 있습니다.
  • package-lock.json은 node_modules 나 package.json이 수정되는 경우 생성되거나 업데이트 됩니다.

3.6) package.json

  • 프로젝트의 정보를 정의하고, 의존하는 패키지 버전을 명시하는 파일
  • 보통 npm init을 사용해 package.json 파일을 만든다.
  • 현재 package.json 파일에는 nest.js에 필요한 모듈이나 script 명령어들이 저장되어 있어, 테스트를 하거나 빌드를 할 때 명령어를 통해 콘솔에서 쉽게 실행할 수 있다.

3.6.1) name & version

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글