글

라벨이 Postman인 게시물 표시

NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -2

 이제 본격적으로 Cluster를 이용한 채팅앱 서버를 만들도록 하겠습니다. 처음 이글을 보시는 분들은 이전글을 참고해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1 제 컴퓨터는 12개의 코어를 갖고 있기 때문에 12개의 Workers를 만듭니다. 먼저 src경로에 'app-cluster.service.ts'를 만들어 줍니다. // src/app-cluster.service.ts import { Injectable } from '@nestjs/common' ; import * as os from 'os' ; const cluster = require ( 'cluster' ); // nodejs의 cluster를 사용 const numCPUs = os . cpus (). length ; // 현재 os의 cpu갯수 확인 @ Injectable () export class AppClusterService { static clusterize ( callback : Function ): void { console . log ( '총 cpu갯수 : ' , numCPUs ); if ( cluster . isMaster ) { console . log ( `Master server started on ${ process . pid } ` ); for ( let i = 0 ; i < numCPUs ; i ++) { cluster . fork (); } cluster . on ( 'exit' , ( worker , code , signal ) => { // 워커가 죽을시 console . log ( `Worker ${ worker . process . pi...

NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1

이미지
 채팅앱을 만드는 법은 이전글에도 설명을 했지만 멀티 Cluster를 사용하여 채팅앱의 효율을 극대화 하기 위해서 글을 작성합니다. 위 블로그는 이전에 작성한 채팅앱을 기준으로 프로그래밍을 합니다. 해당 자료는 아래 링크를 참고해 주시기 바랍니다. 링크0 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -0 링크1 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1 링크2 : NestJS Cluster를 이용하여 CPU최대로 활용하기 사진1) 개선된 채팅앱 백엔드 구조도  사진1을 확인할때 이전 채팅앱과 다른점은 서버가 1개 이상이라는 것입니다. 서버안에 Worker가 있는데 이것은 PID가 다른 NestJS프로그램입니다. 해당 서버의 CPU코어수에 따라 Worker를 생성할수 있으며 각각의 워커는 채팅앱 백엔드를 구성합니다.  만약 PubSub기능을 사용하지 않고 그대로 한다면 문제점이 생깁니다.  사진2) PubSub을 사용하지 않을시 문제점 사진2에서 SocketIO 1을 통해서 데이터가 Worker 1으로 전송이 되면 서버를 통해서 Redis에 저장도비니다. 그러면 Server1의 Worker1만 제외하고 나머지 Worker는 Redis의 데이터를 읽기전까지 데이터가 변경 된것을 모르게 됩니다. 사진3) PubSub을 적용후 데이터 흐름 사진2와 달리 사진3은 PubSub기능을 적용한 데이터 흐름도 입니다. SocketIO 1이 Worker1을 통해 Redis에 Publish합니다. 그러면 Redis는 이 데이터를 해당 채널에 SubScribe하는 Worker에 전달합니다. 필요시 Publish한 서버에도 전송합니다. 사진3에서 SubScribe 서버는 Server1과 Server2입니다. 즉 Server에 연결된 모든 Worker가 SocketIO1(Server1)의 Publish 한 데이터를 알수있습니다. 이전...

NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1

이미지
 안녕하세요. 이번에는 NestJS와 Redis의 Pub/Sub기능을 이용하여 채팅 채널을 만들도록 하겠습니다. 채팅 채널을 테스트히기 위한 툴로는 Postman을 사용할 것이며 자세한 내용은 아래 링크를 참고해 주시기 바랍니다. 링크 : Postman 소켓IO 테스트하기 그리고 이전글을 참고하실려면 아래 링크를 확인해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 백엔드 만들기 -0 일단 현재 블로그에서 작성하는 Node버전은 16.17.0이며 NestJS버전은 9.1.2입니다. 프로젝트를 생성(위 블로그에서는 nestjs-microservice-example)하고 필요한 npm모듈을 설치합니다. socketIO모듈을 설치할때는 아래 링크를 참고해 주시기 바랍니다. 링크 : NestJS SocketIO - 방을 선택해서 들어가는 채팅방 만들기 위 사항이 마무리 되면 microservice 모듈을 설치합니다. - @nestjs/microservices npm 설치 $ npm i --save @nestjs/microservices copy - redis바탕으로 microservices를 구상할때 설치 $ npm i --save ioredis copy 먼저 최상단 루트에 .development.env파일을 만들어주고 아래와 같이 작성합니다. NESTJS_PORT=4500 REDIS_PORT=6379 REDIS_HOST="localhost" NestJS_PORT가 4500이지만 추가로 실행할 서버는 포트번호를 다르가 하면서 추가하시면 됩니다. 사진1) 백엔드 구성 사진1은 개발할려는 기본적인 백엔드 구조 입니다. 모듈안에는 컨트롤러와 웹소켓 서버(socketio.gateway)가 있는데 기본적으로 웹소켓이 채팅앱입니다.  다만 Redis에서 데이터를 Subscribe는 socket_publish에서 받고나서 socketio.ga...

Postman 소켓IO 테스트하기

이미지
 안녕하세요. 알렉스입니다. 이번에 postman에서 소켓IO를 테스트 할수 있는 기능을 추가했습니다. 하지만 이 기능은 베타(2022.07.04기준)이기 때문에 버그나 기능을 수정하고 있습니다.  소켓IO를 테스트 하기 위한 서버는 아래 링크를 참고해 주시기바랍니다. 해당 서버를 Postman 소켓IO테스트에 사용할 예정입니다. 링크 : NestJS SocketIO - 방을 선택해서 들어가는 채팅방 만들기 사진1) Postman 메인 사진2) 새로운 Tab생성 사진3) New Tab 선택창(WebSocket Request 선택) 사진4) Socket.IO 선택 사진5) 소켓서버 실행 사진5) 소켓주소 입력후 Connect클릭 사진6) SocketIO입력 방법은 JSON타입 선택 사진7) 전송할 JSON데이터 및 Listenting할 방을 작성 사진8) join을 subscribe하여 방을 생성한다. 사진8에서 'join'뿐만 아니라 참여할려는 방도 갖이 Listeners을 해야 합니다. 여기서는 'num1'입니다. 사진9) 서버에서 유저가 참여후 Broad Cast 사진10) 유저 Alex가 채팅 작성 사진11) 같은방 유저도 갖이 메세지 확인 Postman socketIO는 현재 베타버전이기 때문에 동작이 제대로 안되는 경우가 있습니다. 이때 Postman을 재시작 하거나 PC를 재시작 하는 것을 추천 드립니다.

nest js -12 Turn Your Server url http to https2 : Apply to your code

이미지
 저번시간의 연장선으로 이번에는 nestjs에 https프로토콜을 적용하도록 하겠습니다.  위 화면은 key, cert.pem파일이 포함된 코드 입니다. NestJS에서 코딩하는 부분과 실행하는 부분이 다르기 때문에 src에 있는 .pem파일은 dist쪽으로 옮겨줘야 합니다.  $ mv cert.pem ../dist/ $mv key.pem ../dist/ // main.ts : /src/ import { NestFactory } from '@nestjs/core' ; import { AppModule } from './app.module' ; // NodeJS에 있는 모든 FileSystem을 // fs로 import 한다. import * as fs from 'fs' ; async function bootstrap () { // https옵션을 저장할 변수 // httpsOption을 생성한다. const httpsOptions = { // key, cert의 해당경로를 통해 read한다. // __dirname은 디렉토리 경로를 나타낸다. key : fs . readFileSync ( __dirname + '/key.pem' ), cert : fs . readFileSync ( __dirname + '/cert.pem' ), } const app = await NestFactory . create ( AppModule , { httpsOptions }); await app . listen ( 3000 ); } bootstrap (); 이제 main.ts부분의 코드를 추가하겠다. 일단 httpsOptions변수가 추가됬다. 이 변수안에는 key, cert 두개의 키값이 존재하는데 파일경로를 통해 읽은 문자열을 갖고있다. 파일경로는 cli로 옮긴 파일 경로를 작성하면 된다. ...

nest js -11 Turn Your Server url http to https1 : create certificate(key, cert.pem)

이미지
 안녕하세요. 기존의 NestJS는 http로 되어있습니다. 그대로 사용할수 있지만 보안이 중요한 웹사이트 같은경우는 위험할수 있습니다. 그래서 이번에는 지금까지 작성한 NestJS서버를 https프로토콜로 변경하도록 하겠습니다.  - 위 코드는 nest js - 1번 부터 10번까지 코딩한 자료를 바탕으로 만들었습니다. 자세한 코드는 블로그 글을 참고해 주시기 바랍니다. 일단 https프로토콜을 적용하기 위해서는 인증서가 필요합니다. 이번 글에서는 mkcert를 사용하여 인증서를 생성하도록 하겠습니다.  $ sudo apt install libnss3-tools $ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 $ chmod +x mkcert $ sudo cp mkcert /usr/local/bin/ 이제 위와같이 cli작성이 마무리 되면 key, cert.pem파일을 생성할수 있다. 일단 인증발급기관을 추가합니다. 여기서는 mkcert입니다. $ mkcert -install 이제 해당 인증서를 생성합니다.  $ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1 이제 해당 프로젝트 안에 key, cert.pem파일이 생긴것을 확인 할수 있습니다. 다음 글에서는 이걸로 실제 https프로토콜을 적용하고 사용을 하도록 하겠습니다.

nest js -10 Delete Particular member(parameter) in DB Record with TypeORM(DELETE)

이미지
// member.repository.ts : /src/members import { Member } from './member.entity' ; import { EntityRepository , Repository } from 'typeorm' ; // 내부에 에러가 발생시 사용. import { BadRequestException , InternalServerErrorException } from '@nestjs/common' ; // Member entity를 불러서 DB의 테이블 생성 @ EntityRepository ( Member ) export class MemberRepository extends Repository < Member > { // members.service.ts에 사용할 method생성 // Member를 생성한다. async createMember ( name : string , password : string , email : string , age : number , ) : Promise < Member > { // member record 생성 const member = new Member () // service에서 받은 정보를 record에 작성 member . name = name ; member . password = password ; member . email = email ; member . age = age ; try { // 작성한 record를 DB에 저장. await member . save (); } catch ( e...

nest js -9 Update Particular member(parameter) in DB Record with TypeORM(PUT)

이미지
이번 글에서는 존재하는 member의 정보를 수정하도록 하겠습니다. 이때도 memberId가 필요하고 params를 통해 받습니다. // member.repository.ts : /src/members import { Member } from './member.entity' ; import { EntityRepository , Repository } from 'typeorm' ; // 내부에 에러가 발생시 사용. import { InternalServerErrorException } from '@nestjs/common' ; // Member entity를 불러서 DB의 테이블 생성 @ EntityRepository ( Member ) export class MemberRepository extends Repository < Member > { // members.service.ts에 사용할 method생성 // Member를 생성한다. async createMember ( name : string , password : string , email : string , age : number , ) : Promise < Member > { // member record 생성 const member = new Member () // service에서 받은 정보를 record에 작성 member . name = name ; member . password = password ; member . email = email ; member . age = age ; try { // 작성한 record를 DB에 저장. await m...