Nest.js는 주로 Typescript 기반으로 작성.
따라서 src폴더의 Ts파일들을 Js파일로 컴파일한 결과물이 dist 폴더에 존재
npm을 통해 모듈을 설치하면 실제로 저장되는 폴더.
설치하려는 모듈과 모듈이 의존하고 있는 모듈까지 함께 저장.
실제로 프로그램을 구현하는 폴더.
의존성 주입(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();
}
}
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라는 속성까지 포함해 총 네 가지 속성
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
NestFactory란?
Nest JS의 핵심기능을 담당하며, Nest 기반의 애플리케이션을 생성하고 구동하는 역할을 하는 클래스.
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 키워드
- 프라미스가 처리될 때 까지 기다린다. 결과는 그 이후 반환된다.
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',
},
};
{
"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
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src"
}