-
Notifications
You must be signed in to change notification settings - Fork 1
Description
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:devnpm run start 를 통해 실행시키면 3000번 포트로 서버가 열립니다.
npm run start:dev 를 입력하면, 변경사항이 감지되었을 경우 직접 서버를 다시 키지 않아도 이를 감지하여 서버를 자동으로 재시동합니다.
포털에서 정상적으로 작동하는 것을 볼 수 있어요!!
Nest.js는 무조건 main.ts 파일을 가지며 이름은 절대로 변하면 안 된다. main에서 모든 걸 실행한다.
NestJS는 Root Module을 가지며 예시로 User Module, Order Module, Chat Module 처럼 최소 하나 이상의 모듈을 Root Module에 import하여 사용하는 형식을 가진다.
코드에서는 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가 되는 것이다.
/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로 추가해줌)
위의 내용을 다시 정리하면!!!

클라이언트의 request를 받아서

Controller가 Provider에게 요청을 보내고

Provider는 DB에서 처리한 내용을 다시 Controller에게 보내고

Controller가 response를 클라이언트한테 다시 보내는 형태다!
Nest.js 만들어보기
nestnest 명령어로 어떤 명령어가 있는지 쉽게 확인할 수 있다.
그중 generate는 생성이라는 뜻으로 우리는 커멘드 라인으로 거의 NestJS의 거의 모든 걸 만들 수 있다 이거야~
Controller 만들어보기
nest g coService 만들기
nest g sDTP
DTO란 무엇일까?
DTO는 "Data Transfer Object"의 약자로, 데이터를 전송하기 위한 객체를 뜻함.
간단히 말해, 서버와 클라이언트 사이에서 주고받는 데이터를 담는 상자라고 생각하면 된다~
왜 DTO를 사용할까?
- 데이터 구조를 정의하기 위해: 클라이언트가 서버에 데이터를 보낼 때, 어떤 형태로 보내야 하는지 미리 정해줄 수 있음
- 데이터 유효성 검사: 서버로 들어오는 데이터가 올바른지, 필요한 값이 빠지지 않았는지 등을 미리 검사할 수 있음
- 코드의 가독성과 유지보수성 향상: 코드의 가독성을 높이고, 유지보수를 쉽게 가능
예시
import { IsEmail, IsNotEmpty } from 'class-validator';
export class CreateUserDto {
@IsNotEmpty()
username: string;
@IsNotEmpty()
password: string;
@IsEmail()
email: string;
}이제 사용자가 username이나 password를 빈 값으로 보내거나, email을 올바른 이메일 형식이 아닌 값으로 보내면, NestJS가 자동으로 에러를 발생시켜준다!

