npm i -g @nestjs/cli
nest new project-name
"dependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/core": "^10.0.0",
"@nestjs/platform-express": "^10.0.0",
"reflect-metadata": "^0.1.13", // @ 사용 시 사용되는 패키지
"rxjs": "^7.8.1", // 리눅스, 맥에 rm -rf 명령어를 윈도우에서도 사용가능하게 해주는 패키지(특정 파일, 폴더 삭제 시 사용하는 메소드임)
"typeorm": "^0.3.17" // 이벤트 기반 프로그래밍을 작성하기 위한 라이브러리이다.
nest g co cats // cats.controller.ts
nest g s cats // cats.service.ts
nest g mo cats //cats.module.ts
* 의존성 주입 : controller에서 service를 사용하기 위해 해주는것이고 이렇게 하는 이유는 유지보수, 가독성, 디자인 패턴에 맞게 하기위해서이다.
cats.controller.ts
import { Delete, Patch } from '@nestjs/common'
import { Controller, Get, Post, Put } from '@nestjs/common'
import { CatService } from './cats.service'
@Controller('cat')
export class CatsController {
constructor(
private readonly catsService : CatsService) {}
// cats/
@Get()
getAllCat() { return 'all cat' }
// cats/:id
@Get(':id')
getOneCat() { return 'one cat' }
// cats/
@Post()
createCat() { return 'create cat' }
@Put(':id')
updateCat() { return 'update cat' }
@Patch(':id')
updatePartialCat() { return; }
@Delete(':id')
updatePartialCat() { return 'delete cat' }
}
* provider :
모듈을 생성하고, 의존성 주입 컨테이너에 추가할 클래스 인스턴스 또는 값의 배열.
주로 서비스와 리포지토리 등이 여기에 포함된다.
캡슐화가 되어있어(은닉화 되어서) 다른 모듈에서 기본적으로는 사용할 수 없다. 다른 모듈에서 접근할 수 있도록 exports 해주면 은닉화 된 것을 퍼블릭으로 바꿔주어 다른 모듈에서 사용할 수 있다.
import { Module } form '@nestsj/common'
import { CatsController } form './cats.controller'
import { CatService } form './cats.service'
@Module({
imports:[],
controller: [CatController],
providers: [CatService],
exports: [CatService]
})
export class CatModule
CLI를 통해 미들웨어 만들어주기
nest g middleware logger
app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { LoggerMiddleware } from './common/middleware/logger.middleware';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*'); // * 사용하면 전체 endpoint에 대해서 로거 미들웨어가 실행된다.
}
}
logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
pivate logger = new Logger('HTTP') // http 프로토콜에 관한 로거를 사용할 수 있게함.
use(req: Request, res: Response, next: NextFunction) {
// (1) console.log(req.ip, req.originalUrl); Request 안에는 요청하는 대상의 정보가 담겨있음
// (2) this.looger.log(req.ip, req.originalUrl)
// (3) this.logger.log(`${req.ip}, ${req.method},`,req.originalUrl);
// 미들웨어 → 라우터 → response 순 인데 response의 결과값도 같이 로깅을 해주자.
// res.on('finish' ()=> {}) finish 이벤트를 이용해 response가 완료가 됬을 때라는 이벤트를 등록해주는것임.
res.on('finish', () => {
this.logger.log(
`${req.ip}, ${req.method}, ${res.statusCode}`, req.originalUrl, );
});
next();
}
}
정말 좋은 글 감사합니다!