오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/NestJS 11

[NestJS] NestJS Websocket [1]

1. Gateway 설치 먼저 nest로 구현된 socket 관련 패키지를 다운로드 받아준다. npm i --save @nestjs/websockets @nestjs/platform-socket.io websocket 구현을 위해선 gateway가 필요하다. gateway를 생성해주자. cd ./src nest g ga 라고 작성하면 아래와 같은 질문이 뜬다. socket이라고 적어주자. socket.gateway.ts라는 파일이 아래와같은 내용이 채워져 있을것이다. import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets'; @WebSocketGateway() export class SocketGateway { @SubscribeMe..

[NestJS] Swagger에서 refs 안될 때

Swagger에서 DTO를 이용해 서버 응답 값을 정의하는 기능이 있는데 직접 가져오는게 아닌 경로를 작성해주면 해당 경로에 있는 클래스를 가져와 붙여주는 기능이 있다. 경로는 분명히 맞는데 안되는 경우가 있어서 정리해둔다. 해결 방법은 간단하다. 아래처럼 createDocument의 extraModels에 추가로 정의 해주면 된다. const document = SwaggerModule.createDocument(app, options, { extraModels: [ DogCreateDTO, DogUpdateDTO ], }); SwaggerModule.setup("api-docs", app, document, { swaggerOptions: { defaultModelsExpandDepth: -1, pe..

[NestJS] Mongoose Cache 적용

nestjs는 기본적으로 모듈화를 지향한다. 클라이언트(프론트 엔드 아님) 에서 사용할 부분만 보여주고 나머지 로직은 보여주지 않는 캡슐화를 지향하는 것이다. 그래서 기존에 작성되어 있는 NodeJS 패키지들을 NestJS에서 사용하기 위해 패키지를 다시 작성하거나 캡슐화를 하지않고 사용해야한다. 하지만 캡슐화를 하지 않고 사용하자니 도메인 로직 코드에 패키지에 대한 의존성이 끊임없이 전파되는 것을 보면 참을 수가 없는분노가 치밀어 오른다. 그렇다고 패키지를 모듈화 해서 다시 작성하자니 부담스러운게 사실이다. 오늘은 모듈화 하지않고 적당한 캡슐화를 할 수 있는 방법을 cachegoose 패키지를 통해 설명하려고 한다. 1. Mongoose Cache cachegoose는 mongodb로 날라가는 쿼리를 ..

[mongoose] 인덱스 생성 그런데 이제 NestJS에서

Mongodb index 생성 방법 정리해둔다. NestJS Mongoose 설정 방법은 아래 글을 참조하길 바란다. https://cocook.tistory.com/183 [NestJS] NestJS에서 MongoDB 연결하기 2020.12.12 - [Language/Javascript] - [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 Node.js + Mongodb 조합을 많이 사용한다.. cocook.tistory.com 아래처럼 생긴 모델일 때 인덱스 생성하기 @Schema() export class Friend { @Prop() category: string @Pro..

[NestJS] AWS Elastic BeanStalk 배포

NestJS를 배포하면서 꽤 많은 문제를 겪었다. 이때 찾아본 문서를 정리해둔다. 먼저 ELB(Elastic Beanstalk)에서 NodeJS용 이미지는 nginx와 같이 배포되었을 때 로컬의 8081포트와 80포트를 연결해준다. 무슨 말이냐면 80포드(일반적으로 http에서 사용하는 포트)에서 들어온 요청을 그대로 로컬의 8081포트에 연결해준다는 뜻이다. 그런데 NestJS는 기본포트가 3000이다. 따라서 포트를 변경해줘야하는데 다양한 방법으로 변경할 수 있다. 나는 주로 아래와 같은 방법을 선호한다. 환경변수로 PORT값을 설정해주는 방법이다. import { NestFactory } from "@nestjs/core"; import { AppModule } from "app.module"; a..

[NestJS] mongoose 다른 이름으로 populate하기

mongoose 네이밍 컨벤션중에 다른 collection을 참조하는 필드의 경우 id를 붙여주는 컨벤션이 있다. 의미상 당연히 ObjectId가 들어가기 때문에 적절한 컨벤션이라고 생각한다. 하지만 문제는 populate할 때 발생한다. populate는 일종의 RDBMS의 join과 같은 것으로 참조하는 collection에서 document를 묶어서 가져오는 메서드이다. 저장되는건 userId인데 실제로 populate한 이후에는 UserDocument가 되기 때문이다. 그래서 아래와 같은 상황이 매번 벌어진다 const order = this.orderRepository.getById(orderId).populate('userId') console.log(order.userId.name) cons..

[NestJS] 아직도 dotenv 사용함?

미안하다 ConfigModule 보여주려고 어그로 좀 끌었다. 일반적으로 데이터베이스의 호스트 및 유저, 비밀번호와 같은 정보는 앱내에 하드코딩해서 보관하지 않는다. 이런 정보들은 실수로라도 노출되면 서비스에 치명적인 공격으로 이어질 수 있기 떄문이다. 이런 상황을 막기 위해 일반적으로 따로 변수를 파일로 보관 후 런타임에서 가져다 사용하는 방식으로 구현한다. 이를 도와주는 대표적인 패키지가 바로 dotenv이다. dotenv가 지원하는 프레임워크가 많다. NestJS에서도 당연히 dotenv로 구현하려고 했지만 구글신에게 여쭤보니 NestJS에서 내부 패키지로 dotenv와 같은 기능을 지원하는게 있다고 한다. @nest/config 이다. 먼저 해당 패키지를 다운로드 해주자! yarn add @nes..

[NestJS] Mongoose pre, post hook 설정

import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { Order, OrderSchema, OrderDocument, } from './schemas/order.schma'; @Module({ imports: [ // 훅 없이 사용하고 싶다면 아래처럼 적어준다. /* MongooseModule.forFeature([{name:Order.name, schema: OrderSchema}]) */ MongooseModule.forFeatureAsync([ { name: Order.name, imports: [AnyModule], // pre, post 훅을 수행하기 위해 필요한 모듈를 ..

[NestJS] DTO(Data Transfer Object)를 이용한 Validation

npm install --save class-validator class-transformer 파이프 라인 설정 // main.ts import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from 'app.module'; async function bootstrap() { console.log(process.env.NODE_ENV); const app = await NestFactory.create(AppModule, { logger: ['log'], }); // 글로벌 파이프 설정 app.useGlobalPipes(new ValidationPipe()); ..