NestJS/NestJS 기본강의

NestJS 기본강의 - 1. 시작

PHM 2022. 7. 7. 15:22

Nest JS 란?

- 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션을 구축하기 위한 프레임 워크

- 프로그레시브 JavaScript를 사용하고 TypeScript로 빌드되고 완벽하게 지원

- OPP( Object Oriented Programming ), FP ( Functional Programming ) 및 FRP ( Functional Reactive Programming ) 요소를 사용 가능

- Express를 토대로 만들어짐


- nestjs 설치

npm i -g @nestjs/cli

- nest프로젝트 생성

nest new project-name

NestCLI로 생성한 프로젝트 기본 구조

eslintrc.js - 개발자들이 특정한 규칙을 가지고 코드를 깔끔하게 짤수있게 도와주는 라이브러리
- 타입스크립트를 쓰는 가이드 라인 제시, 문법 오류가 나면 알려주는 역할 등등
prettierrc - 주로 코드 형식을 맞추는데 사용
- 작은따옴표를 사용하지 큰따옴표를 사용할지, Indent 값을 2로 줄지 4로 줄지 등등, 에러 찾는 것이 아닌 코드 포맷터 역할
nest-cli.json nest 프로젝트를 위해 특정한 설정을 할 수 있는 json 파일
tsconfig.json 어떻게 타입스크립트를 컴파일 할지 설정
tsconfig.build.json - tsconfig.json의 연장선상 파일이며, build를 할 때 필요한 설정들
- "excludes" 에서는 빌드할 때 필요없는 파일들 명시
package.json - build : 운영환경을 위한 빌드
- format : 린트에러가 났을지 수정
- start : 앱 시작
src 폴더 main.ts 앱을 생성하고 실행
app.module.ts 앱 모듈을 정의

Nest JS 모듈이란?

- 모듈은 @Module () 데코레이터로 주석이 달린 클래스이다.

- @Module () 데코레이터는 Nest가 애플리케이션 구조를 구성하는 데 사용하는 메타 데이터를 제공

- 모듈은 밀접하게 관련된 기능 집합으로 구성 요소를 구성하는 효과적인 방법 ( 기능별로 만듬 )

- 같은 기능에 해당하는 것들은 하나의 모듈 폴더안에 넣어서 사용

- 모듈은 기본적으로 싱글 톤이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유

 

-  모듈 생성 명령어

nest g module boards

 

Controller 란?

- 컨트롤러는 들오는 요청을 처리하고 클라이언트에 반환

- 컨트롤러는 @Controller 데코레이터로 클래스를 데코레이션하여 정의

- 데코레이터는 인자를 Controller에 의해서 처리되는 "경로"로 받는다

 

Handle 란?

- 핸들러는 @Get, @Post, @Delete 등과 같은 데코레이터로 장식된 컨트롤러 클래스 내의 단순한 메서드

 

- controller 생성

nest g contoller boards --no-spec

1. CLI는 먼저 boards 폴더를 찾는다

2. boards 폴더 안에 controller 파일 생성

3. boards 폴더 안에 module 파일 찾기

4. module 파일 안에다가 controller 넣어주기

 

Providers 란?

- 프로바이더는 Nest의 기본 개념이다

- 대부분의 기본 Nest 클래스는 서비스, 리포지토리, 팩토리, 헬퍼 등 프로바이더로 취급될 수 있다

- 프로바이더의 주요 아이디어는 종속성으로 주입이 가능

- 즉, 객체는 서로 다양한 관계를 만들 수 있으며, 객체의 인스턴스를 "연결"하는 기능은 대부분 Nest 런타임 시스템에 위임될 수 있다.

 

Service 란?

- 서비스는 소프트웨어 개발내의 공통개념

- @Injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 애플리케이션 전체에서 사용

- 서비스는 컨트롤러에서 데이터의 유효성 체크를 하거나 데이터베이스에 아이템을 생성하는 등의 작업을 하는 부분을 처리한다.

 

- Provider 등록하기

: module파일에 providers 항목안에 해당 모듈에서 사용하고자 하는 Provider를 넣어준다. 

 

- Service 만들기

nest g service boards --no-spec

 

DI

@Controller
export class BoardsController {
    boardsService: BoardsService;
    
    constructor(boardsService: BoadsService) {
        this.boardsService = boardsService;
    }
}

- Typescript의 도움을 받는다면?

@Controller
export class BoardsController {
    constructor(private boardsService: BoadsService) {}
}

- 자바스크립트에서는 private 같은 접근 제한자(Access modifier)를 사용할 수 없지만 TS에서는 가능

- 접근 제한자(public, protected, private)을 생성자(constructor) 파라미터에 선언하면 접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언 

 

 

NestJS에서는 @Body body를 이용해서 가져온다

- 이렇게하면 모든 request에서 보내온 값을 가져올 수 있으며, 하나씩 가져오려면 @Body('title') title 혹은 @Body('description') description 이런식으로 가져오면 된다.

 

 

DTO ( Data Transfer Object ) 는 무엇인가?

- 계층간 데이터 교환을 위한 객체

- DB에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체

- DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체

- interface나 class를 이용해서 정의될 수 있다 ( 하지만 클래스를 이용하는 것을 NestJS에서는 추천 )

( 클래스는 인터페이스와 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용 )

 

DTO를 쓰는 이유

- 데이터 유효성을 체크하는 효율적

- 더 안정적인 코드, 타입스크립트의 타입으로도 사용

 

쿼리스트링 받기

findOne(@Param() params: string[])	// 쿼리스트링 여러개
findOne(@Param('id') id: string)	// 해당 이름의 쿼리스트링