[TIL] Node.js - Basics

7464 단어 TILTIL

Today I Learned

Node.js란

  • Node.js는 브라우저 밖에서도 JS를 사용할 수 있도록 해 주는 (Chrome V8 엔진 기반) JS 런타임 환경이다. Node.js를 사용하면 JS로 서버를 포함한 일반 애플리케이션 개발이 가능하다.
  • Node.js의 특징 : 싱들 스레드 & 이벤트 루프 기반 비동기 방식 => 논블로킹I/O
    - Node.js는 싱글 스레드지만 이벤트 루프를 사용해 논블로킹I/O(요청을 처리하는 동안 다음 요청을 받을 수 있음)가 가능하다.
  • Node.js를 사용한 서버 개발의 장점
    • 클라이언트와 서버를 모두 JS로 개발하기 때문에 러닝 커브가 낮다
    • 이벤트 기반 비동기 방식이라 서버 무리가 적다
    • npm을 통해 다양한 모듈(패키지)을 제공한다
    • 내장 HTTP 서버 라이브러리를 포함하여 웹 서버에서 별도의 소프트웨어 없이 동작할 수 있다
  • Node.js를 사용한 서버 개발의 단점
    • 싱글 스레드이기 때문에 연산이 오래 걸리는 작업을 하면 전체 서버의 성능이 저하된다

전역 객체 (Global Objects)

  • 모든 모듈에서 별도의 모듈 로딩 없이 사용할 수 있는 내장 객체

  • global 변수를 사용해 파일 간 데이터 공유가 가능하긴 하지만 유지보수가 어려우니 모듈 형태로 쓸 것을 권장한다

  • setImmediate() : 즉시 콜백 함수 실행

  • clearImmediate() : setImmediate() 취소

  • setInterval() : 주어진 시간마다 콜백 함수 반복 실행

  • clearInterval() : setInterval() 취소

  • setTimeout() : 주어진 시간 후 콜백 함수 실행

  • clearTimeout() : setTimeout() 취소

  • console : 디버깅하기 위해 주로 사용됨

글로벌 스코프처럼 보이지만 모듈 스코프인 변수들 :

  • __dirname : 현재 모듈의 디렉토리 이름 절대 경로
  • __filename : 현재 모듈의 파일 이름 절대 경로
  • exports : module.exports의 레퍼런스
  • module : 현재 모듈에 대한 레퍼런스
  • require() : 모듈을 import할 때 사용

Modules

  • Node.js에서는 기능별로 별도의 파일(모듈)로 분할할 수 있으며 각 모듈은 독립적인 스코프를 가지게 된다.
  • 모듈은 module.exports 또는 exports 객체로 외부에 공개되며 공개된 모듈은 require()로 import할 수 있다.
  • require()로 특정 파일 모듈을 불러올 때는 경로를 명시해 주어야 한다.
  • 코어모듈(Node.js에 기본적으로 포함된 모듈)을 사용할 때는 경로를 명시하지 않아도 된다. npm으로 설치한 외부 모듈(패키지) 또한 경로를 명시하지 않아도 된다.
// foo.js
module.exports.foo = function () {...}
// OR
exports.fas = function () {...}

// app.js
const { foo, fas } = require('./foo.js');

Stream & Buffer

  • Stream : 스트림은 데이터를 다루는 방법으로, 데이터는 한 번에 chunck(buffer) 단위로 세분화 되어 전송된다. 주로 네트워크 통신에서 파일을 읽거나 쓸 때 메모리/시간 효율을 높이기 위해 쓰인다.
  • Buffer Class : 원시이진데이터(raw binary data) 스트림을 다루기 위해 고안된 Node.js API.
// Buffer.from(data) : data로 새로운 Buffer 생성
const buf = Buffer.from('Hello');
console.log(buf); // <Buffer 48 65 6c 6c 6f>
// buffer.toString() : Buffer를 문자열로 변환
console.log(buf.toString()); // Hello
const fs = require('fs');
// READ STREAM
const readStream = fs.createReadStream('./docs/post1.txt');
// WRITE STREAM
const writeStream = fs.createWriteStream('./docs/post2.txt');

// * .on('data', callback) : data 이벤트 리스너, 스트림에서 buffer가 전달될 때마다 트리거된다
readStream.on('data', (chunk) => {
  // * post1.txt 파일을 읽어서 post2.txt 파일 생성 
  writeStream.write(chunk.toString());
});

// 위의 코드처럼 readable stream을 받아 writable stream으로 데이터를 전송하는 경우 pipe를 사용해 간단하게 표현할 수 있다.
// readStream.pipe(writeStream);

좋은 웹페이지 즐겨찾기