'전체 글'에 해당되는 글 17건

  1. 2020.04.12 http basic authentication
  2. 2019.10.15 ECMAScript 예제
  3. 2019.10.15 Node.js 핵심개념정리
posted by JakeYeom 2020. 4. 12. 22:30

basic authentication은  http를 사용하는 agent가 서버에 요청할때 username과 password 제공하는 방법으로, http header Authorization 필드에 username과 password 를 결합하여 base64 encoding 한 값을 value로 설정한다.

ex) Authorization: Basic ${encodingUsernamePassword}

 

웹 리소스에 대한 가장 간단한 인증 기능을 제공하지만, http를 통해 전달되는 텍스트가 base64를 활용하여 누구나 복호화 할 수 있는 기법이므로 basic authentication 만을 사용하는것은 절대로 안전하지 않기때문에 민감정보나 귀중한 정보를 다룰때는 사용하지 않는 것이 좋으며 사용한다고 하더라도 HTTPS / TLS가 함께 사용하여야 한다.

 

posted by JakeYeom 2019. 10. 15. 14:16

es2015

javascript 모듈 문법

import { odd, even } from './var';

function checkOddOrEven(num) {
  if(num%2) {
    return odd;
  }
  return even;
}

export default checkOddOrEven;

위의 문법은 node.js 에서 제공하는 require / module.exports 와는 차이가 있다.

 

es2018

Promise.all 을 대체할 수 있는 async/await 문법 

const promise1 = Promise.resolve('성공1');
const promise2 = Promise.resolve('성공2');
(async () => {
  for await (promise of [promise1, promise2]) {
    console.log(promise);
  }
})();

 

 

posted by JakeYeom 2019. 10. 15. 11:02

JavaScript 런타임

"Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다." Node.js는 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다. Node.js 패키지 모듈 매니저인 npm은 세게에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.

런타임은 프로그램을 실행할 수 있게 해주는 환경입니다. 기존에는 javascirpt 프로그램을 인터넷 브라우저위에서만 실행할 수 있엇습니다.

브라우저 외의 환경에서는 속도의 문제때문에 호응을 얻지 못했고 2008년 구글이 V8엔진을 사용하여 크롬을 출시하자 좋은반응을 얻었습니다.

노드는 V8과 더불어 libuv라는 라이브러리를 사용합니다.

V8 과 libuv는 C와 C++로 구현되어 있고 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있습니다.  노드의 내부 구조는 다음과 같습니다.

Node.js Core Library
Node.js Bindings
V8 (자바스크립트 엔진) libuv (비동기 I/O)

 

이벤트 기반

이벤트기반은 이벤트가 발생할 때 미리 지정해준 작업을 수행하는 방식을 의미합니다. 

이벤트 기반 시스템에서는 이벤트가 발생할때 수행할 일들을 미리 등록해 놓아야 합니다. 이런일들을 이벤트리스너, 콜백 함수를 등록한다고 표현합니다. 

 

 

이벤트루프

non-blocking i/o를 위해 사용하는 libuv에서 이벤트 루프를 제공하며 아래와 같이 동작한다.

(출처: http://stackoverflow.com/questions/10680601/nodejs-event-loop)

이벤트큐 (태스크큐)는 콜백들이 대기하는 큐(FIFO)형태의 배열이고, 이벤트 루프는 호출스택이 비워질 때마다 큐에서 콜백함수를 꺼내와 호출스택에 넣고 실행하는 역할을 해줍니다.  

 

+ 태스크큐는 nextTick(우선순위 1)과 promise(우선순위 2)를 다루는 마이크로태스크 큐와 타이머(우선순위 2보다 낮음)등의 콜백을 지원하는 태스크 큐로 나뉩니다.

 

이벤트기반 시스템의 실행 예시

동작주체

이벤트루프: 이벤트 발생시 호출할 콜백 함수들을 관리, 실행순서를 결정. 서버 종료시 까지 루프

태스크 큐: 이벤트 발생후 콜백함수들이 실행되기전 대기하는 배열

백그라운드: 타이머나 I/O작업 콜백 또는 이벤트 리스너들이 대기하는 곳

코드: 

function test() {
	console.log('3초 후 실행');
}
console.log('start');
setTimeout(run, 3000);
console.log('end');

 

(참조: Node.js 교과서 조현영 지음 )

 

1. 호출스택에 main함수, setTimeout함수 순서로 쌓입니다 (LIFO)

2. setTimeout이 먼저 실행되고 호출스택에서 집니다. 그리고 run + 타이머 3초 가 백그라운드로 보내집니다.

3. 백그라운드에서 3초가 지난뒤에 run은 태스큐 큐에 보내집니다.

4. 호출스택에서 main함수가 실행이되고 호출스택이 모두 비워지면 이벤트큐가 태스크큐에 있는 작업중 가장 첫번째로 할 작업인 run함수를 호출스택으로 보냅니다.

5. 호출스택에서 run함수가 실행되고 실행 완료 후 호출 스택에서 비워집니다.

6. 이벤트 루프는 태스크 큐에 함수가 들어올때 까지 계속 대기하게 됩니다.

 

 

비동기 API의 컨텍스트 실행

$('.btn').click(function() { // (A)
    try {
        $.getJSON('/api/members', function (res) { // (B)
            // 에러 발생 코드
        });
    } catch (e) {
        console.log('Error : ' + e.message);
    }
});

(출처: https://meetup.toast.com/posts/89)

node.js 환경에서는 비동기 함수 사용에 대해 유의해야 합니다.

A와 B코드를 비동기로 수행할때 A와 B모두 이벤트 기반 시스템 동작으로 실행되는데 A에서 작성된 try-catch 구문이 B에게는 전혀 영향을 주지 않는것을 명심해야합니다. 좀 더 자세히 설명하자면 A가 먼저 호출스택에 들어가서 수행되고 호출스택에서 제거됩니다. A가 제거되고 난후 B가 태스크 큐에 들어간 후 호출스택에 쌓여서 실행되기 때문에 A에서 사용된 context와 B의 context는 독립적인 컨텍스트 환경에서 전혀 영향을 받지 않습니다.

 

 

논블로킹 I/O

(출처: https://medium.com/prod-io/understanding-the-basics-of-node-js-99e01c5d844f)

논블로킹이란 이전작업이 완료될때까지 멈추지 않고 다음 작업을 수행하는것을 말합니다.

이벤트루프, 태스크큐에서 논블로킹 방식으로 작업을 처리하게 되면 오래걸리는 작업들을 나중에 수행하고 먼저 수행할 작업들을 빠르게 숭행할 수 있기때문에 작업을 효율적으로 수행할 수 있습니다.

 

 

싱글 스레드

싱글 스레드는 주어진 작업을 혼자서 처리하는것을 말합니다. 싱글스레드를 블로킹 방식으로 처리하게 되면 현재작업을 완료할때 까지 다음 작업은 무기한 대기해야하는 상황이 생겨서 비효율적입니다. node.js 에서는 싱글스레드에서 논블로킹 방식을 사용하고 있기 때문에

이전작업이 끝날때까지 기다리지 않고 작업을 요청받고 순서를 정한뒤 수행합니다.

 

'백엔드 > Node.js' 카테고리의 다른 글

Best Pratices of Node.js Error Handling  (0) 2019.09.17