카테고리 없음
NestJS vol.1
곽빵
2023. 1. 14. 21:03
개요
NestJS를 배우면서 남기는 기록
시작하기
npm i -g @nestjs/cli
cli를 깔면 nest 코맨드를 사용할 수 있게된다.
nest new nest-typeorm
핫 리로드
https://docs.nestjs.com/recipes/hot-reload
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
Module
- NestJS에서 모듈은 관련 기능을 함께 그룹화하여 프로젝트을 구성하는 방법(모듈은 DDD에 근거하여 구성해 나가면 좋다)
- 보통 하나의 컨트롤러 그리고 여러개의 서비스와 DTO를 가질 수 있다.
- 모듈의 각각의 기능(Service)는 Provider로 다른 모듈에 공유할 수 있으며, 공유할 수 있는 스코프도 Nest에서 관리해 준다.
- 전부 공유가능하게 하는것 비추천! 하고 있다
Controller
- Controller는 클라이언트의 요청을 받고 그리고 응답을 반환하는 역할을 한다.
- Controller는 @Controller라는 데코레이터를 가지며 이는 nest에게 이 파일이 controller라는걸 알리고 자동으로 routing 설정을 하거나 다른 컨트롤러용 데코레이터(@Get @Post)들도 사용할 수 있게된다.
- @데코레이터를 사용해서 IOC(제어의 역전)을 볼 수 있다. 여기서 말하는 제어의 역전이란 우리가 직접 routing을 연결하는게 아니라 nest가 @데코레이터를 보고 알아서 route를 만들어 연결시켜준다는 것
- 밑의 코드의 appService는 AppService 타입과 app.module.ts에서 등록한 Provider로 인해 appService에서는 자동으로 객체가 주입된다 (DI)
- 이러한 DI의 구조 덕분에 테스트가 상당히 용이해지는데 그 이유는 외부에서 주입받는다는 구조가 결합도를 낮추는게 되서 테스트할때도 그냥 appService를 간단하게 mock으로서 생성해서 주입하면된다. 결합도가 높은? 코드는 Controller에서 new Service해서 서비스 객체를 내부에 생성하게되면 테스트가 하기가 힘들고 결합도가 강한 코드가 된다.
밑의 getHello라는 함수는 /api/hello GET을 받는 함수가 된다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller('api')
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello')
getHello(): string {
return this.appService.getHello();
}
}
Service
- 비지니스 로직을 두는 곳
- @Injectable 이라는 데코레이터를 가지며, 이는 nest에게 이 파일이 Service라는걸 알리며 DI(의존성 주입)이 가능한 상태로 만들어 다양한 곳에서 갖다 쓸 수 있는 상태가 된다.
- 트랜잭션 단위로 함수를 두면 좋다.
- 서비스는 클라이언트의 요청과 응답에 대해서는 처리하지 않는다는 전제이다.
- Controller에서 전부 처리하지 않고 Service를 두는 이유는 비즈니스 로직을 재활용 할 수 있으며, 테스트 코드 작성이 용이하다. req res를 목킹이 필요없으니..!
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
Repository
- TypeORM을 사용하여 데이터베이스와의 상호작용을 관리
- Entity를 기반으로 CRUD작업을 처리한다.
- Entity 클래스를 데이터베이스의 테이플과 매핑
// post.repository.ts
import { EntityRepository, Repository } from 'typeorm';
import { PostEntity } from './post.entity';
@EntityRepository(PostEntity)
export class PostRepository extends Repository<PostEntity> {}