라벨이 multi인 게시물 표시

NestJS Cluster를 이용하여 CPU최대로 활용하기

이미지
 NodeJS은 기본적으로 Single Thread입니다. 따라서 하나의 NodJS작업에 많은 작업량이 주어지면 작업량 초과로 에러가 발생할 가능성이 있습니다. 이를 위해 작업량을 분산시켜줄 필요가 있는데 이때 nodejs에서 지원해주는 cluster를 사용합니다. 참고링크 : https://nodejs.org/api/cluster.html#cluster 위 글은 NestJS와 cluster를 이용하여 하나의 서버에서 여러개의 동일한 NestJS를 만들어서 업무를 분산할 것입니다. 새로운 포트를 통해 만드는 것이 아닌 하나의 포트에서 여러개의 동일한 NestJS 쓰레드가 업무를 분산해서 작업을 하는 것입니다. 사진1) cluster 구조 사진1에서와 같이 4개의 코어로 이루어진 CPU가 있는데 각각의 코어에 NestJS1~4까지 실행이 되고 있습니다. 해당 NestJS는 같은 API의 같은 Port으로 연결될수 있습니다. 이때 Client가 API를 통해서 요청을 하면 CPU중 하나의 코어를 선택해서 작업을 수행후 Client으로 응답을 줍니다. 다수의 Client로부터 요청을 받을때 하나의 스레드를 사용하는 것보다 각각의 코어에서 스레드를 생성해서 분산작업하는것이 더욱 안정적입니다.  // 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 { con...

DBMS MySQL - SQL7: MIN, MAX 최대, 최소 및 중복 쿼리문 사용하기(2개이상)

이미지
DBMS MySQL - SQL6 : UPDATE MANY -> 여러개의 레코드를 한 쿼리에 UPDATE하기  안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 최대값과 최소값, 그리고 2개이상의 중복 쿼리를 사용해 보도록 하겠습니다. 1. MIN, MAX MIN은 최소값, MAX은 최대값을 찾습니다. 위 쿼리를 사용하면 해당 Column에서 최대 혹은 최소값을 찾습니다. $ SELECT MIN([Column Name]) FROM [Table Name];  copy 2. 중복 쿼리  중복 쿼리는 SQL안에 또 다른 SQL이 있는 것입니다. 내부의 SQL을 먼저 실행하고 끝나고 나면 바깥쪽의 SQL문이 실행이 됩니다. $ SELECT [Column Name1], [Column Name2] FROM books WHERE [Column Name3]=([SQL]); copy 문제는 더블 SQL을 하용하게 되면 DB에 부하를 주게 되어 있습니다. 따라서 중복 SQL을 사용하기 보다는 가능한 하나의 SQL문으로 사용하는 것이 효율에 좋습니다.

Redux - axios,fetch을 통한 action

이미지
  이전에 작성한 글들은 동기화 action입니다. action이 되면 바로 state에 반영되어서 적용이 되었습니다. 하지만 비동기인 상황에서는 대기시간이 걸립니다. 예로들어 API를 이용하여 데이터를 fetch하는 경우 입니다. 통신 상태에 따라 시간이 불규칙적으로 걸릴수 있기 때문입니다.  이번에는 axios 또는 fetch을 이용하여 코드를 짜보도록 하겠습니다. 일단 fetch을 하여 최종적으로 redux storage에 저장하는 것이 목적입니다. 그러기 위해서는 가장먼저 state를 설계해야 합니다. 내용과 구조는 아래와 같습니다. loading : API를 통해서 데이터를 다운로드 받고 있는 중일때 true, 완료 혹은 error는 false data : fetch(혹은 axios)를 통해 받은 데이터를 저장(여기서는 유저정보) error: fetch도중 에러가 발생시 error메세지 저장 State = {      loading : true,       data : [ ],      error: '' } 이제 action.type을 결정해야 합니다. 여기서 설정할수있는 action은 3가지 입니다. 내용은 아래와 같습니다. FETCH_USERS_REQUEST : users 리스트를 fetch합니다. FETCH_USERS_SUCCESS : fetch가 성공적으로 마무리 됬습니다. FETCH_USERS_FAILURE : fetch도중 error가 발생. 이제 reducer를 설정해야 하는데 위의 action을 이용하여 설정할수 있습니다. action.type FETCH_USERS_REQUEST   - loading : true FETCH_USERS_SUCCESS - loading : false - users : data (해당 API를 통해 다운) FETCH_USERS_FAILURE - loading : false - err : ...

Redux - Middleware(미들웨어)

이미지
이 글을 작성하면서 express의 middleware와 기능적인 면에서 비슷하다는 것을 알았습니다. 아래 링크를 참고해 주시기 바랍니다. 링크 : node.js Express Middleware 사용법 Redux의 middleware장점 1. 커스텀 기능을 확장할수 있는 방법 2. dispatching와 action사이에 제 3자 extension 접점을 제공하고 reducer에 도달한다. 3.  logging, 에러 리포트 등등 middleware에 사용이 가능하다. 일단 이번 예제에서는 Logger를 middleware에 사용하겠다.  Redux에 사용할 logger npm 사이트 https://www.npmjs.com/package/redux-logger 위 사진처럼 redux-logger를 설치한다. // 로거를 생성하기 위한 require const reduxLogger = require ( 'redux-logger' ); const logger = reduxLogger . createLogger (); 이전에 사용한 코드 맨 위쪽에 가서 위 2줄을 추가해 준다. 이렇게 하면 logger의 설정은 마무리가 됬다. // middleware추가하기 const applyMiddleware = redux . applyMiddleware ; 이제 middleware를 추가하기 위해서 위 코드를 작성해 줍니다. // 1. app의 state를 갖고 있는다. (인자로 reducer) // createStore를 이용하여 storage를 생성 // 다른 reducer가 합쳐진 rootReducer를 인자로 갖습니다. // createStore의 두번째 인자로 middleware가 추가 됬고 middleware의 인자는 logger이다. const storage = createStore ( rootReducer , applyMiddleware ( logger )); 저번 글의 마지막에서 2개의 reducer를 combineRe...

Redux - 여러개의 state

이미지
 저번에 장난감가게를 비유로 간단한 Redux를 만들어 봤습니다. 이제 이 사장은 쿠기(cookie)를 팔려고 계획중입니다. 그래서 기존 직원을 교육시켜 쿠키도 팔수 있도록 훈련을 시켰습니다. 훈련이 완료된후 판매을 시작했습니다. 이 그림에서 보연 알다싶이 직원이 이제 2가지 행동(action)을 하는것을 알수 있습니다. 이 점을 기억하시고 코드를 살펴봐 주시기 바랍니다. // Action const BUY_TOY = 'BUY_TOY' ; // type을 설정한다(문자열) const BUY_COOKIE = 'BUY_COOKIE' ; // type을 설정한다(문자열) function buyToy (){ // 고객이 장난감을 살때 return { type : BUY_TOY , info : 'First step of redux action' }; }; function buyCookie (){ // 고객이 쿠키를 살때 return { type : BUY_COOKIE , info : 'First step of redux action' }; }; 저번에 1개의 function만 있었다면 이번에는 buyCookie가 추가됬습니다. 이 action은 고객이 쿠키를 살때 사용할 function입니다. // 초기 state상태 const initialState = { numOfToy : 10 , // 초기에 장난감이 10개 numOfCookie : 15 } 당연히 초기상태에 이제 쿠키의 갯수(15개)가 state에 추가됬습니다. 이제 initialState에는 초기 장난감과 쿠기의 갯수가 각각 저장되어 있습니다. const reducer = ( state = initialState , action ) =...