본문 바로가기

전체 글

(181)
Factory Pattern (팩토리 패턴) 팩토리 패턴 예시부터 보겠습니다. const createImage = (name) => { if (name.match(/\.jpeg$/)) { return new Jpeg(name); } else if (name.match(/\.gif$/)) { return new Gif(name); } else if (name.match(/\.png$/)) { return new Png(name); } else { throw new Error('Not supported format'); } }; 누군가가 보기엔 이건 팩토리 패턴이 아니라 그냥 전략 패턴이 아니냐 라고 할 수 있긴 합니다만.. 팩토리 패턴은 이름 그대로 객체를 생성하는 공장으로 받아들이면 심플하며, 객체를 생성하는 책임을 다른 무언가로 분리하는 것입니다..
스트림 (Stream) 이벤트 기반 플랫폼인 Node.JS 에서 I/O 를 처리하는 효율적인 방법은 실시간으로 입력을 바로 사용하고 출력을 즉시 내보내는 것이며, 이는 스트림을 사용해 아주 쉽게 구현할 수 있습니다. Node.JS 에서 대부분의 비동기 API 는 버퍼를 사용합니다. 모든 데이터를 버퍼에 수집하고 모두 읽은 후 콜백에 전달하는 방식이죠. 하지만 스트림은 도착한 리소스를 버퍼에 기다리지 않고 바로 처리할 수 있어 굉장히 효율적입니다. const fs = require('fs'); const zlib = require('zlib'); const file = '---'; console.time('buffer'); fs.readFile(file, (err, buffer) => { zlib.gzip(buffer, (err..
제네레이터 (Generator) 지금의 Node.JS 프로그래밍에선 비동기를 처리할 때 제네레이터(Generator) 를 사용하는 일은 거의 없을 겁니다. 오히려 이게 뭔지도 모르는 개발자가 있을 수도 있습니다. ES2017 부터 나온 async - await 사용이 너무도 간편해졌기 때문이죠. 다만 제네레이터는 async - await 구문이 동작하게 하는 배경이므로 이 동작부터 이해를 해야 할 것 같습니다. 아직도 ts build 를 할 때 target 설정을 ES2015 로 하면 async - await 구문이 래핑된 제네레이터로 떨어지는걸 볼 수 있듯이 말이죠. - 제네레이터 (Generator) 제네레이터는 * 연산자와 yield 키워드를 사용해 일시적으로 실행 흐름을 중지시켰다가, 다시 시작시킬 수 있습니다. function..
Promise & Promisify - 프라미스 (promise) 이미 JS 혹은 Node.js 로 프로그래밍을 꽤 해오신 개발자분들이라면 좀 진부할 수 있지만, 프라미스(Promise) 에 대해 약간 적어볼까 합니다. 프라미스는 Javascript 에서 콜백 패턴에 대한 대안으로 현재는 굉장히 많이 쓰이며, Node.js 에서도 Node4 이후부터 기본 사용이 가능해졌습니다. 단어가 담고 있는 뜻 처럼 프라미스는 비동기 작업의 최종 결과를 나타낸다는 것을 약속합니다. 비동기 작업이 아직 완료되지 않았을 땐 pending, 성공적으로 끝나면 fulfilled(이행된), 실패하면 rejected(거부된) 라 부르고, 성공하거나 끝난 상태를 settled(처리된) 로 간주합니다. fulfill 된 값이나 reject 된 에러를 받기 위해선 t..
Observer Pattern in Node.js 관찰자 패턴(Observer Pattern)은 Node.js 에서 중요하고 기본적인 패턴이며, reactive 특성을 모델링하면서 콜백을 보완하는 패턴이라고 할 수 있습니다. 관찰자 패턴은 Node.js 에서만 사용되는 패턴은 아닌데, 일반적으로 객체의 상태 변화를 메서드등을 통해 관찰자에게 알릴 수 있도록 객체를 정의하는 것입니다. pub/sub 모델에 쓰이기도 하며 최근엔 분산 이벤트 시스템에도 많이 쓰이는 것 같습니다. Node.js 에서 일반적인 콜백 스타일은 결과를 하나의 대상에게만 전파할 수 있으나 관찰자 패턴에선 여러 관찰자들에게 알릴 수 있어 콜백을 보완한다고 할 수 있습니다. - EventEmitter 다른 언어들과 다르게 Node.js 의 코어에는 이미 관찰자 패턴이 내장되어 있고, E..
모듈 시스템 Node.js 로 작업을 하다보면 굉장히 많은 모듈을 만들게 되는데요. 어플리케이션을 구성하기 위한 작은 조각에서부터 사내에서 공통으로 사용하기 위한 공통 모듈까지 명시적으로 export 해서 많이 사용합니다. 혹은 그와 반대로 export 하지 않은 것들을 비공개로 유지해 정보 은닉화에 사용되기도 하죠. - Revealing module pattern 노출식 모듈 패턴이라고도 불리는 이 기법은 상당히 보편적인 방식입니다. 아래 예시 코드를 보도록 하겠습니다. const testModule = (() => { const privateTest1 = () => { console.info('private test1'); }; const exported = { test1: () => { console.info(..
Nginx - forward proxy 로 활용하기 업무간 대부분의 프로젝트에서 nginx 를 reverse proxy 로 사용하고 있는데, forward proxy 서버를 구축해야 할 일이 생겨 nginx 를 사용했던 부분은 짧게 남겨보려 합니다. - forward proxy ? 일반적으로 프록시란 두 호스트가 서로 통신을 할 때 직접 하지 않고 중간에 위치해 통신을 도와주는 역할을 하는 것을 지칭합니다. 보통 forward proxy, reverse proxy 이렇게 두 종류로 나뉘는데, 프록시 서버라고 부르는 경우는 대게 forward proxy 를 가리킵니다. forward proxy 란 클라이언트가 서버로 무언가의 요청을 보낼 때 프록시 서버가 요청을 대신 받아서 서버로 요청을 전달해주고, 응답 또한 서버로부터 대신 받아서 클라이언트에 전달해주는..
Callback 패턴 Node.JS 에서 callback 은 Reactor 패턴의 핸들러를 구현한 것입니다. (관련 포스팅) callback 은 작업 결과를 전달하기 위해 호출되는 함수이며, 비동기 작업을 처리할 때 반드시 필요합니다. Javascript 에선 함수가 일급 객체여서 변수에 할당허간, 인수로 전달되거나, 다른 함수 호출에서 반환되거나 자료구조에 저장될 수 있기 때문에 callback 을 아주 잘 표현할 수 있습니다. - 직접 스타일 function add(x, y) { return x + y; } 동기 함수에서 return 을 통해 결과를 전달하는 아주 흔한 방식이며, 이를 직접 스타일이라고 합니다. 하지만 callback 은 이러한 형태와 약간 다릅니다. - 연속 전달 방식(Continuation-Passin..