Backend (126) 썸네일형 리스트형 스트림 (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(.. Callback 패턴 Node.JS 에서 callback 은 Reactor 패턴의 핸들러를 구현한 것입니다. (관련 포스팅) callback 은 작업 결과를 전달하기 위해 호출되는 함수이며, 비동기 작업을 처리할 때 반드시 필요합니다. Javascript 에선 함수가 일급 객체여서 변수에 할당허간, 인수로 전달되거나, 다른 함수 호출에서 반환되거나 자료구조에 저장될 수 있기 때문에 callback 을 아주 잘 표현할 수 있습니다. - 직접 스타일 function add(x, y) { return x + y; } 동기 함수에서 return 을 통해 결과를 전달하는 아주 흔한 방식이며, 이를 직접 스타일이라고 합니다. 하지만 callback 은 이러한 형태와 약간 다릅니다. - 연속 전달 방식(Continuation-Passin.. lockfile 주의점 이번 포스팅에선 패키지 매니저를 사용할 때 필수적으로 따라오는 lockfile 과 관련해 업무간 겪었던 이슈를 얘기하며 왜 lockfile 이 중요한지에 대해 얘기해보도록 하겠습니다. - lockfile ? 대부분 Node.js 로 개발을 할 때 npm 혹은 yarn 등의 패키지 매니저를 사용하고 있을 겁니다. 각각 package-lock.json 과 yarn.lock 이라는 lockfile 이 포함되어 있는데, 개발간 팀원과의 협업 또는 배포, ci 환경에서 패키지들의 의존성에 문제가 생기지 않도록 이 파일을 이용해 의존성 트리를 관리하게 됩니다. - 문제 상황 문제가 발생했던 패키지는 nest-winston 이었습니다. nest-winston 은 로거용 패키지인 winston 을 Nest.js 용으로.. Node.JS - Reactor 패턴 Reactor 패턴이라는 것은 Node.js 비동기 특성의 핵심입니다. 단일 스레드에서의 non-blocking I/O 와 함께 Reactor 패턴에 대해 알아보도록 하겠습니다. - I/O 일반적으로 I/O 작업으로는 로컬 파일 시스템에서 파일을 읽고 쓰거나, 네트워크 상에서 웹페이지를 여는 등의 작업을 들 수 있습니다. 이러한 작업들을 I/O bounded process 라고 부르기도 하며, 대척점에 있는 개념은 아니지만 CPU bounded process 와 종종 비교를 합니다. 간단히 말해 데이터 입출력에 대한 작업은 I/O, hash 나 압축 등 연산과 관련된 작업은 CPU 로 보고있죠. I/O 는 컴퓨터의 기본적인 동작 중에서 가장 느립니다. 또한 일부 경우에 대해 입력 이라는 부분은 사람에 의.. 이전 1 ··· 3 4 5 6 7 8 9 ··· 16 다음