Nodejs 성능 최적화

pa324·2019년 11월 15일
0

1. json serialization 라이브러리 사용

자바스크립트에서는 기본적으로 json format을 serializatino하는 기능을 제공한다.
하지만, json에 많은 데이터가 들어가게 되면 성능이 많이 떨어지게 된다.

const json = JSON.stringfy(obj);
https://github.com/fastify/fast-json-stringify

fast-json-strinfy 라는 라이브러리를 사용했을때, JSON.stringfy()를 사용했을때를 성능을 비교한 결과이다.

2. 비동기 처리

개발을 진행하다 보면, 각 Array에 대한 item을 비동기 처리해야 하는 경우가 있다.

const students = [
  {
  	"id"  : "1",
    "name" : "tim"
  },
  {
   "id" : "2",
    "name" : "alvin"
  }
]

async function process(students) {

	students.forEach(async student => {
    	await getStudentCourse();
    })
}

하지만, forEach문의 경우 해당 loop가 종료되는 것에 대한 결과를 기다려주지 않고, function 내용만 처리하기 때문에 정상적으로 비동기처리가 이뤄지지 않는다. 따라서, 'for ...of' 를 이용해야 정상적으로 비동기처리가 가능하다.

const students = [
  {
  	"id"  : "1",
    "name" : "tim"
  },
  {
   "id" : "2",
    "name" : "alvin"
  }
]

async function process(students) {

	for(const student of students) {
    	await getStudentCourse();
    }
}

또다른 방법으로는, Promise.all()을 사용하는 방법이 있다. array의 고차함수인 map으로 묶어서 promise 배열을 반환하도록 만들고, Promise.all()을 이용해서 병렬로 순차처리를 하는 방법이 있다.


const students = [
  {
  	"id"  : "1",
    "name" : "tim"
  },
  {
   "id" : "2",
    "name" : "alvin"
  }
]

async function process(students) {

	const promises = students.map((student) => {
    	return getStudentCourse(student).then((res) => {
        	return res;
        })
    });
  	await Promise.all(promises);
}

// bad
async function getUserInfo(id) {
    const profile = await getUserProfile(id);
    const repo = await getUserRepo(id)
    return { profile, repo }
}

// good
async function getUserInfo(id) {
    const [profile, repo] = await Promise.all([
        getUserProfile(id),
        getUserRepo(id)
    ])
    return { profile, repo }
}
profile
안녕하세요

0개의 댓글