Skip to content

[Docs] NestJS 학습 #20

@uk10105

Description

@uk10105

NestJS

Nest의 탄생배경

  • 최근 Nodejs로 인해 javascript를 이용한 풀스택(클라이언트+서버) 개발이 활발해짐
  • javascript라는 한가지 언어로 개발을 하기 때문에 생산성을 향상시키고 빠른 개발이 가능
  • 그러나 Node.js의 높은 자유도로 인해 Architecture 구성이 어렵고 효과적이지 못해서 이를 해결하기 위해 Angular의 아키텍처 사상을 기반으로 Nest가 만들어졌짐

Nest(NestJS)의 특징

  • Nest는 nodejs 서버 애플리케이션을 구축하기 위한 프레임워크
  • Node.js → Express.js 기반으로 위에서 움직임
  • Nest는Typescript를 사용, javascript도 코딩이 가능
  • unit 테스트와 e2e 테스트를 할 수 있는 툴이 내장되어 제공
  • Nest는 외부 모듈을 자유롭게 이용
  • Nest는 다음 요소를 포함
    • OOP - 객체지향 프로그래밍
    • FP - Functional 프로그래밍
    • FRP - Functional React 프로그래밍

Nest를 사용하면 좋은 점

  • Nest는 Java의 Spring과 같이 규칙을 제공해 개발자들이 아키텍처의 구성에 대해 고민해야 할 부분이 많이 줄어듦
  • 기본적으로 제공하는 라우팅, 보안등의 기능이 많이 탑재되어 있어 편리함
  • 외부모듈을 통한 확장이 얼마든지 가능
  • Java+Spring와 아키텍처 구조가 비슷
  • Angular와 기본적인 사용법이 동일

Nest.js 설치

@nestjs/cli 설치하기(Comment Line Interface)

npm i -g @nestjs/cli
nest new [새 프로젝트 이름]

npm 선택하면 install됨

package.json 파일의 start:dev를 실행시켜보기로 합시다.

npm run start:dev

npm run start 를 통해 실행시키면 3000번 포트로 서버가 열립니다.
npm run start:dev 를 입력하면, 변경사항이 감지되었을 경우 직접 서버를 다시 키지 않아도 이를 감지하여 서버를 자동으로 재시동합니다.

2

잘 돌아가는 중이고
3

포털에서 정상적으로 작동하는 것을 볼 수 있어요!!

Nest.js는 무조건 main.ts 파일을 가지며 이름은 절대로 변하면 안 된다. main에서 모든 걸 실행한다.

4

NestJS는 Root Module을 가지며 예시로 User Module, Order Module, Chat Module 처럼 최소 하나 이상의 모듈을 Root Module에 import하여 사용하는 형식을 가진다.

6

코드에서는 app.moduls 파일에 있는 AppModule이 rootModule이 되며, 이곳에서 모든 모듈을 불러와 애플리케이션에서 사용된다.

  • 모듈은 애플리케이션의 일부분이다. 한가지 역할을 하는 앱이라고 생각하면 된다.
    • 예시1) 인증을 담당하는 애플리케이션 → user 모듈
    • 예시2) 인스타그램 → photo 모듈, video 모듈
  • 각 모듈들은 Controller와 Provider로 구성된다.
  • NestJS는 컨트롤러와 로직을 분리시켜서 실행시킨다.
  • Controller : url을 가져오고 함수를 실행, http (express의 router 같은 존재)
    • 함수 실행, return
  • Provider : 실제 function을 가지는 부분. 비즈니스 로직을 실행하는 역할, db, controller를 연결해주는 객체다! (=Service)

@module는 controllers와 providers를 가지고 있으며 각각 AppController, AppService로 지정되어있다.

appController는 appService에서 AppService를 사용할 수 있게 설정되어 있고 @get 요청을 받아서 appService에 있는 getHello 함수를 호출한다.

appController의 요청을 받은 AppService는 ‘Hello World!’ 문자열을 return 한다.

  @Get('/hello')
  sayHello(): string {
    return 'Hello World!!';
  }

⚠️ 데코레이터는 꾸며주는 함수나 클래스랑 붙어있어야한다!!!

위와 같은 코드를 추가해봤다.

get으로 요청을 하고 sayHello()라는 이름의 함수와 반환타입을 string으로 설정하고 문자열을 return한다.

여기서 url은 /hello가 되는 것이다.

7

/hello 경로를 붙여주면 제대로 작동한다

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

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

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

  @Get('/hello')
  sayHello(): string {
    return 'Hello World!!';
  }
	@Post('/hello')
  sayHello(): string {
    return 'Hello World!!';
  }
}

Get → Post로 바꿔서 실행해본다면?
import에서 Post를 추가해줘야한다. (위의 빨간 Post로 추가해줌)

위의 내용을 다시 정리하면!!!
8
클라이언트의 request를 받아서
9
Controller가 Provider에게 요청을 보내고
10
Provider는 DB에서 처리한 내용을 다시 Controller에게 보내고
11
Controller가 response를 클라이언트한테 다시 보내는 형태다!


Nest.js 만들어보기

nest

nest 명령어로 어떤 명령어가 있는지 쉽게 확인할 수 있다.

13 12

그중 generate는 생성이라는 뜻으로 우리는 커멘드 라인으로 거의 NestJS의 거의 모든 걸 만들 수 있다 이거야~

Controller 만들어보기

nest g co

Service 만들기

nest g s

DTP

DTO란 무엇일까?

DTO는 "Data Transfer Object"의 약자로, 데이터를 전송하기 위한 객체를 뜻함.
간단히 말해, 서버와 클라이언트 사이에서 주고받는 데이터를 담는 상자라고 생각하면 된다~

왜 DTO를 사용할까?

  1. 데이터 구조를 정의하기 위해: 클라이언트가 서버에 데이터를 보낼 때, 어떤 형태로 보내야 하는지 미리 정해줄 수 있음
  2. 데이터 유효성 검사: 서버로 들어오는 데이터가 올바른지, 필요한 값이 빠지지 않았는지 등을 미리 검사할 수 있음
  3. 코드의 가독성과 유지보수성 향상: 코드의 가독성을 높이고, 유지보수를 쉽게 가능

예시

import { IsEmail, IsNotEmpty } from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty()
  username: string;

  @IsNotEmpty()
  password: string;

  @IsEmail()
  email: string;
}

이제 사용자가 username이나 password를 빈 값으로 보내거나, email을 올바른 이메일 형식이 아닌 값으로 보내면, NestJS가 자동으로 에러를 발생시켜준다!

Metadata

Metadata

Assignees

Labels

📄 문서문서화하기 위해 작성한 글

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions