본문 바로가기

Back-End/NodeJS

1. Node.js 개요

 새로운 스타트업에 이직을 하게 되었는데 이 곳은 Spring 대신 Node.js를 사용하고 있어 공부를 시작하게 되었습니다.


Node.js에 대한 이해를 위하여 Node.js 디자인패턴 ( Node.js design pattern ) 책 전체를 단원별로 리뷰해보려 합니다.



Node.js 플랫폼에 관하여

몇 가지 원칙과 디자인 패턴들을 보면, 그 자체로 Node.js 플랫폼과 그 생태계의 개발 기술을 알 수 있다고 합니다. 단원별로 차근차근 공부를 하게 되면 진짜 Node.js의 철학을 이해할 수 있겠죠.


Node.js 철학

경량 코어

코어 기능을 최소한으로 하고 나머지를 사용자의 몫으로 넘겼습니다. 이 덕에 유지보수 측면에서 편리해지고, 전체 생태계의 발전에 긍정적인 문화를 가져올 수 있었습니다.

경량 모듈

이 철학은 Node.js 제작자인 Ryan Dahl이 Unix 철학에서 따온 거라고 합니다.
  •  "작은 것이 아름답다"
  •  "각 프로그램이 각기 한 가지 역할을 잘 하도록 만든다"
이를 통해 Node는 재사용성을 극도로 높입니다. 따라서 한가지 기능만을 가진 패키지를 흔히 볼 수 있습니다.

작은 모듈의 또 다른 장점은
  • 이해하기 쉽고 사용하기 쉽다.
  • 테스트 및 유지보수가 훨씬 간단하다.
  • 브라우저와 완벽한 공유가 가능하다. (?)

작은 외부 인터페이스

최소한의 기능을 노출하라는 특성을 가지고 있습니다. 즉, 확장용도보다는 실제 사용하도록 만들어진다는 것입니다.

유연하지 않아 보일 수도 있지만, 실제로는 use-case를 줄이고, 구현을 단순화하며, 유지 관리를 용이하게 해줍니다.

간결함과 실용주의

이런 철학이야 직접 코드를 봐야 느낄 수 있기 때문에 공부하면서 느껴보겠습니다ㅎㅎ


Node.js 6와 ES2015(ES6)에 대한 소개

1. let, const

전역 스코프, 함수 스코프 외에 블록 스코프를 지원하기 시작하였습니다. 

한가지 특이한 점은 다른 언어와 다르게 상수로 할당된 객체 내부의 값을 변경할 수 있다는 것입니다.

const x = {};
x.name = 'Ted Kim';


 2. arrow function

간결한 구문으로 콜백을 정의할 때 유용하게 사용됩니다. 

const numbers = [2,6,7,8,1];
const even = numbers.filter( num => num%2 ===0 );

함수 본문에 코드 줄을 추가해야 하는 경우 return을 명시해 줘야 합니다.


const numbers = [2,6,7,8,1];
const even = numbers.filter( num =>
if(num%2 === 0){
console.log(num + 'is even');
return true;
}
);

그리고 또 다른 중요한 기능이 있습니다. arrow function은 Lexical scope로 바인드 됩니다. 즉, 함수 내부의 this 값은 부모의 블록의 값과 같습니다.


function DelayedGreeter(name){
this.name=name;
}

DelayedGreeter.prototype.greet = function(){
setTimeout( () => console.log('Hello'+this.name), 500);
}

const greeter=new DelayedGreeter('World');
greeter.greet(); // "Hello World"

3. 클래스 구문

클래스를 지원한다고 해서 자바스크립트 런타임 내부에서 객체 관리 방식이 변했다는 소리는 아닙니다. 기존처럼 프로토타입을 통해 속성과 함수를 상속합니다.

위에서 만들었던 DelayedGreeter를 다음과 같이 만들 수 있습니다.

class DelayedGreeter{
constructor(name) {
this.name =name;
}

greet(){
setTimeout(...)
}

}

이 뿐만 아니라 extend, super 키워드를 사용하여 프로토타입을 확장할 수 있습니다.


4. Map, Set collection

자바 개발자인 저에겐 너무나도 당연한 것이 였는데...


get, set, has, delete 4가지 함수를 가지고 있습니다.


5. WeakMap, WeakSet

위의 컬렉션과 비슷하지만 2가지의 차이점이 있습니다.
  1. 키로 사용된 객체에 대한 유일한 참조가 WeakMap 내에만 남아 있을 경우, 이 객체를 가비지 컬렉트 할 수 있습니다.
  2. 요소 전체를 반복 구문으로 탐색할 방법이 없으면, 객체 만을 키로 가집니다.
let obj = {};
const map = new WeakMap();
map.set(obj, {key: "some_value"});
console.log(map.get(obj));
obj = undefined; // 다음 가비지 컬렉트 사이클에서 맵에 관련된 객체와 데이터가 정리됨

6. Template 표기법

${expression}의 형식으로 사용하여 변수 또는 표현식을 삽입할 수 있습니다.

const text = `${name} was Ted.
He was born in ${birth.year}`

7. ES2015의 기타 기능들

조만간 이 기능들을 더 자세히 포스팅 하겠습니다.
  • 기본 매개 변수
  • 나머지 매개 변수
  • 전개 연산자
  • 비구조화
  • new.target
  • Proxy
  • Reflect
  • Symbols