menu

ECMA2

promise

비동기 방식 함수는 콜백 함수가 필연적이다.
(정상이면 어떻게 할지, 비정상이면 어떻게 할지를 처리를 위해)
그렇지만 안타깝게도 비즈니스 로직을 만들다 보면 한가지 기능만을 가진 함수만 만들게 아니라

여러가지의 작업이 한번에 이뤄지는 함수도 만들어야 한다.
이런 경우 콜백이 계속 이뤄지는 이른바 콜백지옥이 나타나게 된다.

그래서 es6에 도입된 문법이 있는데 그것이 바로 promise이다

const condition = true;
const promise = new Promise((resolve, reject) => {
    if(condition) {
        resolve('성공')
    } else {
        reject('실패')
    }
});

promise
    .then((message) => {
       return message 
       // then에서 return은 다음 then 아규먼트로 바인드 된다.
    })
    .then((message) => {
        console.log(message) 
        // 성공(resolve)
    })
    .catch((error) => {
        console.error(error) 
        // 실패(reject)
    });

콜백이 계속 되며 깊어지는 문법에 비해서 promise는 가독성이 훨신 더 좋아진걸 알수 있다.

require / module

require 문법은 다른 JS파일에 자원을 가져올때 사용하는 문법이다
다른 라이브러리에서 가져올때는 require를 썼었지만 직접 module로서 내보내려면 export가 필요하다.

//정의 
const OK   = '성공'
const FAIL = '실패.
module.exports = {
    OK,
    FAIL
}

//사용
const { OK, FAIL } = require('정의.js');
console.log(Ok)
console.log(FAIL)

export 타입에 상관없이(객체, 원시타입 등등) 다 내보낼 수 있다.
export와 require로 인해 모듈화가 가능하다.
해당 사항들은 react에서도 많이 쓰이므로 알고 넘어가면 매우 좋다!

클러스터링

노드는 기본적으로 CPU의 코어수랑 상관없이 싱글스레드로 동작한다.
즉 자원이 많아도 사용 불가능 하다.
멀티스레딩 언어와는 다르게 태생(자바스크립트)부터 멀티스레드가 아닌 노드는 이부분을 멀티 프로세싱으로 극복한다.

  const cluster = require('cluster');
  const os = require('os');
  const cpus = os.cpus().length;
  const http = require('http')

  if (cluster.isMatser) {
     for(let i = 0; i < cpus; i+=1) {
        cluster.fork(i)
        // 워커(프로세스)를 생성한다
     }
  } else {
     http.createServer((req, res) => {
        res.end('response');
     }).listen(8888);
  }

  
  const cluster = require('cluster');
  const os = require('os');
  const numCPUs = os.cpus().length;
  const http = require('http')

  if (cluster.isMatser) {
     console.log('마스터 프로세스 아이디', process.pid);
     for(let i = 0; i < numCpus; i+=1) {
        cluster.fork(i)
     }
     cluster.on('exit', (worker, code, signal) =>{
        // 워커가 종료하면 뭐가 종료했는지 보여준다
        console.log(worker.process.pid, '워커가 종료되었습니다.')
     });
  } else {
     http.createServer((req, res) => {
        res.end('response');
        setTimeout(() => {
           process.exit(1);
        }, 1000);
     }).listen(8888);
     console.log(process.pid, '워커 실행')
  }