개발 이야기/Node 5

이벤트 구독 패턴 EventEmitter - 4

콜백 패턴 자바스크립트를 사용하다보면 콜백 패턴을 이용하게 된다. async/await 구문의 등장으로 과거보다 콜백 사용이 많이 줄었지만 여전히 콜백은 즐겨 사용되고 있다. 우리가 콜백을 사용할 때의 상황을 단순화 하면 다음과 같다. 특정 시점에, 콜백이 실행되기를 기대한다. 이것이 콜백의 핵심이자 전부다. 이벤트 구독 패턴 이벤트 구독 패턴은 콜백 패턴과는 다른 방식으로 콜백과 같은 핵심에 접근한다. 1. 특정 시점에 실행 되길 바라는 함수들은 이벤트를 구독한다. 2. 특정 시점이 되면 이벤트를 발생시킨다. 이렇게 두가지 레이어가 이벤트 구독 패턴에서는 명확하게 구분된다. Node에서는 기본적으로 이벤트 구독 패턴을 쉽게 사용할 수 있도록 EventEmitter 클래스를 제공한다. let em = n..

버퍼 Buffer - 3

자바스크립트는 문자열 처리에는 효과적이지만 바이너리 데이터는 잘 처리하지 못합니다. 하지만 문자열만 가지고 다양한 데이터를 처리하기란 매우 어렵습니다. 물론 일반적인 상황에서 Buffer 를 사용하는 일은 흔치 않을 것 입니다. 하지만 파일 업로드, 이미지 조작 등의 작업에 Node를 사용한다면 Buffer가 필요합니다. 개발자가 원하는 만큼의 메모리 할당이 필요한 경우에도 필요합니다. 버퍼 클래스의 경우 메모리가 자바스크립트 VM의 외부 힙에 지정되게 됩니다. 따라서 해당 데이터는 가비지 컬렉션으로 인해, 위치가 이동되지 않습니다. 이는 CPU 사용에 보다 효율적입니다. let x = new Buffer.from('Hello') console.log(x.toString()) // Hello let y ..

모듈 Module - 2

Node에서는 CommonJS 모듈 시스템을 사용했었다. 물론 13.2 버전부터는 특별한 옵션 없이도 ES6의 모듈 시스템을 사용할 수 있다. 하지만 여전히 많은 모듈들이 CommonJS의 형태로 이루어져 있으므로 사용 예시를 통해 가볍게 살펴보기로 하자. function Calc() { function add(a, b) { return a+b } return { add } } module.exports = Calc const calc = require('./calc') 모듈을 로딩하는 종류에는 몇 가지 경우가 있다. 코어 모듈 로드 const http = require('http') 노드가 미리 준비해둔 모듈을 코어 모듈이라 하며, 우선적으로 로드 된다. 파일 모듈 로드 const myModule = ..

노드 NodeJS - 1

개인적으로, 업무적으로 Node를 활용하는 일이 잦아지고 있다. 때문에 이번 기회에 NodeJS에 관해 깊이 있는 학습과 정리를 하고자 한다. 아주 오래전에 나온 책이지만, 프로페셔널 NodeJS를 활용할 계획이다. (절판된걸로 보인다.) I/O 블로킹 전통적인 프로그래밍은 I/O 작업을 블로킹 모델로 처리한다. 블로킹 모델은 각각의 사용자를 완벽하게 분리할 수 있지만, 너무 느리고 부담스럽다. 멀티스레딩은 이런 블로킹 모델의 대안 중 하나다. 스레드는 경량 프로세스로서 같은 프로세스 내의 다른 스레드와 메모리를 공유한다. 동시 스레드 실행을 통해, 하나의 스레드가 I/O 작업을 기다리는 동안 다른 스레드가 CPU를 사용할 수 있게 되었다. 늘 그렇듯 완벽한 대안은 없고, 멀티 스레딩도 마찬가지다. 특정..

NodeJS + Typescript + Mongoose

JS를 사용하다 보면, 서버도 Nodejs로 만들고 싶다는 욕망이 생깁니다. ㅎㅎ 서버와 프론트가 모두 TS로 이루어지면 타입을 공유할 수 있는 장점이 생깁니다. npm install --save-dev webpack webpack-cli typescript ts-loader @types/express nodemon ts-node npm install --save express 1. 늘 그렇듯이 모듈들을 설치해 줍시다. 웹팩과 타입스크립트, 웹팩에서 사용할 타입스크립트 로더, 노드 핫로더, 타입스크립트 변환 모듈입니다. // webpack.config.js const path = require('path'); module.exports = { entry: './app.ts', module: { rules..