라벨이 nestjs인 게시물 표시

NestJS SSE(Server Side Event) 구현

이미지
  SSE(Server Side Event)란 서버에서 클라이언트로 실시간 데이터를 보내는 기술이다. HTTP 통신은 일회성 요청이기 때문에 이후의 서버에서 데이터를 클라이언트로부터 요청받기 전까지는 응답할수 없다.  하지만 SSE를 이용하면 서버에서 클라이언트로 데이터를 실시간으로 응답할수 있다. 해당 데이터 흐름은 서버에서 클라이언트로 이동하는 단방향 통신이며 역으로는 통신할수 없다.  장점 1. WebSocket, Poling, LongPoling를 이용하지 않고도 서버에서 클라이언트에 데이터를 전송할수 있다. 2. HTTP의 GET요청을 이용해서 보내기 때문에 기존의 HTTP 프로토콜을 이용하면 된다. 3. 네트워크가 종료 되어도 다시 자동으로 연결을 시도한다. 4. HTTP의 GET요청을 이용해서 지연시간을 조절할수 있다. 예로들어 SSE의 시간을 1시간으로 하면 1시간 후에 SSE가 해제된다. 단점 1. SSE로 응답하는 클라이언트가 많을경우 서버에 부하가 가해진다. 2. GET 메소드만 지원해서 전달 가능한 파라메타가 제한이 된다. 3. 클라이언트에서 페이지를 닫아도 서버에서 알수가 없다. 4. 한번 보낸 데이터는 취소가 불가능하다. 위와 같은 장단점을 갖고있다. 그래도 WebSocket, SocketIO를 이용해서 작성하는 것보다 SSE가 더 간단히 작성할수 있는 장점이 크다. Postman을 이용해서 테스트가 가능하다. 먼저 "localhost:3000/sse/1"로 GET요청을 한다. 여기서 숫자 1은 클아이언트에서 수신받을 ID이고 이 ID로 서버가 SSE응답을 한다. // /src/sse/sse.controller.ts import { Controller , Get , MessageEvent , Param , Sse } from '@nestjs/common' ; import { EventEmitter2 } from '@nestjs/event-emi...

NestJS TypeORM(SQLite) 을 이용한 One to Many(일대다)

이미지
이번 블로그 글은 일대다(One To Many)를 다루어 볼 것입니다. 위 사진처럼 일대다 테이블을 구성할 예정입니다. 사진1) users table 사진2) posts table 3) Swagger - 유저 조회 3-1) 유저ID를 이용해서 DB조회 4) Swagger - 게시글 조회 4-1) post ID를 이용해서 작성자 정보까지 DB에서 조회 자세한 코드는 아래 GitHub를 참고해 주시기 바랍니다. GitHub Link

NestJS 정적인(static) 웹사이트(website) 응답하기

이미지
 NestJS는 백엔드 프레임워크이지만 가끔 직접 클라이언트에 HTML을 직접 전달하는 경우가 있습니다. 1. Handlerbars를 사용하기 위해서 패키지 설치 $ npm install @nestjs/serve-static hbs copy           ├── src           │   ├── app.module.ts           ├── views           │   ├── test.hbs (API로 응답할 HTML 파일)           └── public               └── styles.css                └── index.html 해당 에러를 확인하면 default엔진이 제대로 제공되지 않은것을 알수 있다. main.ts에 엔진 및 경로를 설정해준다. 에러가 발생하는데 이것은 Index.html을 찾는 NestJS 에러이다.  index.html을 만들면 해결 된다. Build시 views, public폴더가 dist안에 들어가게 하기 위해서 아래 코드를 추가 작성해야 한다. nest-cli.json 코드 추가 추가로 dist파일에 view폴더도 복사해 넣고 싶다면 nest-cli.json에 추가 코드를 넣는다.  GitHub Link

NestJS Swagger 문서의 Body Element중 배열 타입 적용하기

이미지
해당 글을 사용하기 전에 참고하면 좋은 글 nest js - install & Create Project from Linux or Ubuntu NestJS에 Swagger(스웨거) Document(문서)를 적용 NestJS http로 들어오는 파라메타, 쿼리, Body값들에 대해서 Global Validation Pipe 만들기   Swagger를 이용해서 API문서를 만들다 보면 단일 Class를 한꺼번에 생성하기 위해서 배열로 받아야 하는 상황이 있습니다. 이를 위해서 기존 Class를 배열로 적용하다보면 Swagger에서 다르게 표시되는 경우가 있습니다. 사진1) 한개의 DTO사용 위의 2개의 num, str을 배열 {num : number, str : string}[]로 저장할수 있는 API를 만들도록 하겠습니다. import {   Body,   Controller,   Get,   HttpCode,   HttpStatus,   Post, } from '@nestjs/common'; import { ApiOkResponse, ApiOperation } from '@nestjs/swagger'; import { AppService } from './app.service'; import { CreateManyTest1ArrayDto, CreateOneTest1Dto } from './dto/test1.dto'; @Controller() export class AppController {   constructor(private readonly appService: AppService) {}   @Get()   getHello(): string {     return this.appService.getHello();   }   @Post('element/one')   @ApiOperation({   ...

NestJS Backend Firebase Push HTTP v1 - 2 Development Backend Server

이미지
이전글 :  NestJS Backend Firebase Push HTTP v1 - 1 Setting 이전 글에서 해당 json파일을 다운 받으면 이제는 서버를 개발해야 합니다. 해당 gitHub에서 코드를 clone 합니다. gitHub 링크 :  https://github.com/Alex-Choi0/firebase_push_server_nestjs 해당 json파일을 루트 프로젝트 경로로 옮깁니다. 해당 json파일은 firebase.json으로 변경합니다. "npm install" 이후에 "npm run start:dev"를 실행합니다. 그러면 3000 port에서 아래와 같은 Swagger 페이지가 나타납니다. 해당 API를 이용하여 푸시를 보낼수 있습니다. 궁금하신 사항은 댓글로 알려주시기 바랍니다.

NestJS Backend Firebase Push HTTP v1 - 1 Setting

이미지
2024년 6월 20일에 regacy push messaging은 사용이 불가능하다. 따라서 향후에는 오직 V1만 지원이 된다. 따라서 기존 및 향후에 개발되는 모든 코드는 firebase를 사용하면 코드를 수정해야 한다. Firebase의 새 API(V1)를 적용하기 위해서는 몇가지 필요한 사항이 있다. 1. Firebase에 프로젝트가 생성되 있어야 한다. 만약 HTTP 푸시를 사용하고 있다면 이미 해당 프로젝트는 존재할 것이다. 사진1) Firebase 프로젝트 2. GCP에 접속해서 "Firebase Cloud Messaging API"를 활성화 한다. 사진1에서 "서비스 계정 관리"에 들어가면 GCP에 접속하게 된다. 이때 오른쪽 위에 "탐색메뉴"에서 "API 및 서비스"를 선택한다. "사용 설정된 API 및 서비스"메뉴에 들어가면 아래쪽에 여러개의 API 서비스들이 나온다. 이때 "Firebase Cloud Messaging API"를 선택한다. 사진2) 서비스 API 선택 사진3) 서비스 상태 사진3에서 "상태"가 "사용 설정됨"이 되어 있어야 한다. 만약 안되어 있다면 활성화를 하면 된다. 3. 서비스 계정 추가 사진1에서 "서비스 계정 관리"에 들어가면 아래와 같은 사진이 나온다. 사진4) 서비스 계정 관리 사진4에서 "서비스 계정 만들기"를 클릭한다. 사진5) 계정생성 1단계 사진6) 역할 부여 사진7) 계정 생성 사진8) 계정 세부정보 사진9) 키 추가(새 키 만들기) 해당 파일 내용. {   "type": "",   "project_id": "",   "private_key_id": "",   "pri...

docker-compose 도커를 이용하여 개발하기 - 모듈 동기화

이미지
저번작업에 이어 이번에는 node_modules를 동기화 하겠습니다. 자세한 내용은 이전 글을 참고해 주시기 바랍니다. 이전글 : docker-compose 도커를 이용하여 개발하기 - 코드 동기화 1. module을 동기화하기 저번과 마찬가지로 NestJS을 이용하여 도커 개발환경을 구성하는데 이번에는 node_modules를 실시간으로 동기화 하는 작업을 하겠습니다.  먼저 .dockerignore 파일을 작성합니다. # ./.dockerignore node_modules package.json package-lock.json npm-debug.log dist 그리고 기존의 도커파일(Dockerfile)을 수정합니다. # ./Dockerfile # Base 이미지를 사용합니다. FROM node : 18.18.0 # Docker Container안의 디렉토리를 설정합니다. 설정을 안할시 Root리렉토리로 설정됩니다. WORKDIR /nestjs # package.json을 도커 이미지에 복사합니다. # COPY package.json /nestjs # COPY package-lock.json /nestjs # package데이터를 근거로 npm을 설치한다. # RUN npm install # 해당 디렉토리에 있는 모든 파일, 폴더를 도커 이미지로 복사합니다. # .dockerignore에 있는것은 제외 COPY . /nestjs # 해당 도커 이미지에서 build를 해서 dist폴더를 생성합니다. # RUN npm run build # 해당 이미지의 포트를 EXPOSE합니다. # 표시만 할뿐 실제 도커 컨테이너의 포트가 노출되지 않는다. EXPOSE 3000 # 도커 이미지를 이용하여 컨테이너를 생성시 nodejs 자동 실행(development mode) CMD [ "npm" , "run" , "start:dev" ] 다음은 docker-compose.yaml파일을 수정합니다. ...

docker-compose 도커를 이용하여 개발하기 - 코드 동기화

이미지
개발을 진행할때 도커를 이용하다보면 build를 진행하는 시간이 길다는 것을 알수 있습니다. 이때 개발이 완료될때마다 매번 build를 하지 않고 실시간으로 도커 컨테이너안의 코드와 개발IDE의 코드를 동기화 합니다. 필요시 확장 파일들도 동기화 할수 있습니다. 일단 코드를 동기화 하는 법에 대해서 확인해 보겠습니다. 1. 코드를 동기화하기 이번에 사용할 프로그래밍 언어는 TypeScript이며 NestJS를 이용하여 간단한 서버를 구성할 것입니다. 자세한 내용은 아래 공식 사이트를 참고해 주시기 바랍니다. 공식 NestJS 사이트 링크 프로젝트를 생성후 Dockerfile을 만들어서 작성합니다. # ./Dockerfile # Base 이미지를 사용합니다. FROM node : 18.18.0 # Docker Container안의 디렉토리를 설정합니다. 설정을 안할시 Root리렉토리로 설정됩니다. WORKDIR /nestjs # package.json을 도커 이미지에 복사합니다. COPY package.json /nestjs COPY package-lock.json /nestjs # package데이터를 근거로 npm을 설치한다. RUN npm install # 해당 디렉토리에 있는 모든 파일, 폴더를 도커 이미지로 복사합니다. # .dockerignore에 있는것은 제외 COPY . /nestjs # 해당 도커 이미지에서 build를 해서 dist폴더를 생성합니다. RUN npm run build # 해당 이미지의 포트를 EXPOSE합니다. # 표시만 할뿐 실제 도커 컨테이너의 포트가 노출되지 않는다. EXPOSE 3000 # 도커 이미지를 이용하여 컨테이너를 생성시 nodejs 자동 실행(development mode) CMD [ "npm" , "run" , "start:dev" ] 이제 이 도커파일을 사용할 docker-compose.yaml파일을 만듭니다. ...

NestJS TypeORM(^0.2.45) Migration DB 생성 및 첫 Migration진행 -1

이미지
 위 블로그 글은 TypeORM ^0.2.45버전을 기준으로 작성한 글입니다. npm 설치시 typeorm은 ^0.2.45버전 입니다. // src/db/ormconfig.ts import { TypeOrmModuleOptions } from '@nestjs/typeorm' ; require ( 'dotenv' ). config (); export const typeOrmModuleOptions : TypeOrmModuleOptions = { type : 'postgres' , host : process . env . PG_HOST , port : + process . env . PG_PORT , username : process . env . PG_USERNAME , password : process . env . PG_PASSWORD , database : process . env . PG_DATABASE , autoLoadEntities : true , synchronize : process . env . PG_CHANGE === 'true' , }; export const OrmConfig = { ... typeOrmModuleOptions , migrationsTableName : 'migrations' , entities : [ 'dist/**/*.entity.js' ], migrations : [ 'dist/db/migrations/*.js' ], cli : { migrationsDir : './src/db/migrations' , }, }; export default OrmConfig ; # .env PG_HOST = "localhost" PG_PORT =5434 PG_USERNAME = "a...

NestJS TypeORM Migration Table 수정 및 삭제 -3

이미지
 이번에는 TypeORM에서 migration을 셋팅하고 이후 글에서는 동작을 하도록 하겠습니다. 이전글 : NestJS TypeORM Migration DB 생성 및 첫 Migration진행 -2 진행을 위해서는 NestJS가 설치 되어 있어야 합니다. 아래 링크를 참고해 주시기 바랍니다. 링크 : nest js - install & Create Project from Linux or Ubuntu 해당 글에서는 Postgres을 사용합니다. 다만 진행의 편리성을 위해 Docker Container를 이용하여 사용합니다. 아래 링크를 참고해 주시기 바랍니다. 링크 : Docker-Compose yaml파일을 이용하여 PostgreSQL를 Local로 구축하기 이제 해당 users테이블에 name컬럼을 추가하겠습니다.  1. users테이블에 name추가 // src/users/entities/user.entity.ts import { Column , Entity , PrimaryGeneratedColumn } from 'typeorm' ; @ Entity ( 'users' ) export class User { @ PrimaryGeneratedColumn ( 'increment' ) // 기존 Column id : number ; @ Column ({ unique : true }) // 기존 Column email : string ; @ Column () // 추가된 컬럼 name : string ; } 2. migration:generate를 진행합니다. - migration파일을 생성합니다. $ npm run migration:generate -- [migration 경로] copy migration 경로 : migration파일이 생성될 경로입니다. 처음에 db폴더안에 생성하면 됩니다. 기존 파일과 구분짓기 위해서 migration폴더를 생성...