express란?


  • express는 Node.js에서 가장 많이 사용되는 웹 서버 프레임 워크중 하나입니다. koa나 hapi같은 웹 서버 프레임워크도 있지만 express가 다운로드 수가 가장 많으며, 많은 사람이 사용하는 만큼 버그가 적고 기능 추가 및 유지보수가 가장 활발하게 일어나는 웹 서버 프레임 워크입니다.




express 시작


import express from "express";

const app = express();

app.set("port", process.env.PORT);

app.listen(app.get("port"), () => {});

  • express는 내부에 http 모듈이 내장되어 있기 때문에 위와같이 express 모듈을 import하고 express app 생성 후 listen 상태로 만들어서 웹 서버를 실행할 수 있습니다.




express 메서드


app.set(key, value)


  • app.set 메서드는 app에 key와 value를 저장할 수 있습니다. 그리고 나중에 app.get(key)을 통해서 저장했던 값을 가져올 수 있습니다.




app.get(주소, 라우터)


  • 라우터에 req,res,next를 인자로 받는 콜백 함수를 등록할 수 있으며, req에는 요청에 관한 정보가 들어있으며, res에는 응답에 관한 정보가 들어있습니다. next는 현재 콜백 함수가 최종 목적지가 아닐경우 next()를 호출하여 다음 middleware가 호출될 수 있도록 합니다.




GET, POST, PUT, PATCH, DELETE


  • express 메서드에는 HTTP 메서드와 맵핑된 메서드들이 있으며 이를 이용해서 요청된 HTTP 메서드에 따라서 get, post, put, patch, delete 등의 메서드가 호출됩니다.




app.use


  • app.use는 middleware를 등록하거나 라우터를 등록할 때 사용합니다.

  • 첫 번째 인자로 주소를 넣지 않는다면 해당 middleware는 모든 요청에서 실행됩니다.




middleware


  • express에서 middleware는 요청과 응답 중간에 위치하는 콜백 함수입니다. middleware를 통해서 요청과 응답을 조작하여 기능을 추가하거나 잘못된 요청을 걸러낼 수도 있습니다.

  • middleware에서 사용하는 인자는 (req, res, next) 입니다. next를 통해서 다음 미들웨어나 finaleware의 호출 여부를 결정짓습니다.

  • middleware는 app.use를 통해서만 등록할 수 있는 것은 아니며, get, post, put, delete 등의 http 메소드를 특정하여 해당 요청에서만 호출될 수 있도록 할 수 있습니다.




(err, req, res, next) middleware


  • 특정 middleware에서 error 가 발생되어 next 호출 시 error를 전달하였다면 (err, req, res, next)를 인자로 받는 middleware가 호출되어 에러를 핸들링 하도록 할 수 있습니다.




route


router
  .route("/abc")
  .get((req, res) => {})
  .post((req, res) => {});

  • route 메서드를 이용해서 동일한 Url로 요청한 메서드들을 가시성 있게 프로그래밍할 수 있습니다.




'Node.js' 카테고리의 다른 글

npm(node package manager)란?  (0) 2022.12.18
Node.js의 파일 시스템  (0) 2022.12.17
Node.js와 모듈  (0) 2022.12.11
Node.js란?  (0) 2022.12.11

npm(Node Package Manager)란?


  • npm은 다른 사람들이 개발하고 npm에 배포한 모듈을 간단한 명령어로 설치할 수 있게 도와주는 노드의 패키지 매니저입니다.




package.json


  • 개발하고 있는 또는 개발된 프로젝트를 다른 PC에서 설치하고 실행할 때 기존에 개발했던 PC에서와 동일하게 동작하려면 어떤 패키지를 설치했고 설치한 패키지의 버전을 알고 있어야합니다. 프로젝트 정보 및 필요한 패키지들의 정보를 관리하는 파일이 package.json입니다.

  • npm init 명령어를 통해서 package.json을 셋팅할 수 있습니다.




package.json 프로퍼티


  • name : 패키지의 이름입니다.

  • version : 패키지의 버전입니다.

  • main : 자바스크립트의 실행 파일 진입점입니다. 보통 module.exports를 하는 파일을 지정합니다.

  • scripts : 프로젝트 명령어를 정의할 수 있습니다.

  • author : 프로젝트 개발자입니다.

  • license : 해당 패키지의 라이센스입니다.




node_modules


  • npm i 명령어로 설치한 패키지 코드가 들어있는 폴더입니다. 패키지에 따라서 하나의 패키지가 다른 여러 패키지를 의존하고 있을 수 있기 때문에 하나의 패키지를 설치한다 해도 무수히 많은 다른 패키지가 node_modules에 설치될 수 있습니다.

  • node_modules는 package.json만 있으면은 언제든지 다시 설치할 수 있는 폴더입니다. 실제로 버전관리 툴로 버전을 관리할 때 node_modules는 제외하고 관리하는게 더 좋습니다.




package-lock.json


  • node_modules에 들어있는 패키지들의 정확한 버전과 의존 관계가 작성된 파일입니다. npm으로 패키지를 설치, 수정, 삭제할 때마다 패키지들 간의 내부 의존 관계를 해당 파일에 저장합니다.




dependencies와 devDependencies


dependencies


  • 프로젝트 실행에 필요한 패키지들이 작성된 파트이며 npm i (패키지 명)를 통해 패키지를 설치하면 dependencies에 정의됩니다.




devDependencies


  • 프로젝트 개발할 때 필요한 패키지들이 작성된 파트이며 npm i (패키지 명) -D를 통해 패키지를 설치할 때 devDependencies에 정의됩니다. 그리고 devDependencies에 정의된 패키지들은 실제 배포시에는 사용되지 않는 패키지들입니다.




'Node.js' 카테고리의 다른 글

express 프레임 워크란?  (0) 2022.12.18
Node.js의 파일 시스템  (0) 2022.12.17
Node.js와 모듈  (0) 2022.12.11
Node.js란?  (0) 2022.12.11

파일 시스템을 이용한 읽기, 쓰기

 

// 동기
import fs from "fs";

const fileUrl = "./upload/readme.txt";

fs.writeFileSync(fileUrl, "Hello World~");
const data = fs.readFileSync(fileUrl);
console.log(data.toString());

 

// 비동기
import fs from "fs/promises";

(async () => {
  const fileUrl = "./upload/readme.txt";

  try {
    await fs.writeFile(fileUrl, "Hello World");
    const data = await fs.readFile(fileUrl);
    console.log(data);
    console.log(data.toString());
  } catch (error) {
    console.log(error);
  }
})();

 

  • 읽을 파일의 경로를 지정할 때 기준은 현재 파일의 기준이 아니라 node 명령어를 실행하는 콘솔 기준이라는 점에서 유의해야 합니다.

 

  • async/await을 사용하려면 fs가 아닌 fs/promises를 import 해야 합니다.




스트림 방식으로 파일 읽기, 쓰기

 

읽기

 

import fs from "fs";

const fileUrl = "./upload/readme.txt";

const readStream = fs.createReadStream(fileUrl, { highWaterMark: 12 });
const data = [];

readStream.on("data", (chunk) => {
  data.push(chunk);
  console.log(`data : ${chunk}, ${chunk.length}`);
});

readStream.on("end", () => {
  console.log(`end : ${Buffer.concat(data).toString()}`);
});

readStream.on("error", (error) => {
  console.log(`error : ${error}`);
});

 

  • readStream이 12Byte 단위로 읽을 때마다 "data" 이벤트에 등록한 콜백 함수가 호출되어 읽은 데이터를 사용할 수 있습니다.




쓰기

 

import fs from "fs";

const fileUrl = "./upload/readme.txt";

const writeStream = fs.createWriteStream(fileUrl);
writeStream.on("finish", () => {
  console.log("파일 쓰기 완료");
});

writeStream.write("Hello ");
writeStream.write("World");
writeStream.end();

 

  • writeStream을 생성하고 .end()가 호출되면 "finish" 이벤트에 등록한 콜백 함수가 호출되어 작업의 종료를 알립니다.




기타 fs 메서드

 

fs.access

 

  • 폴더나 파일에 접근할 수 있는지를 체크하는 메서드입니다.




fs.mkdir

 

  • 폴더를 만드는 메서드입니다. 이미 폴더가 있다면 에러가 발생하므로 먼저 access 메서드를 호출해서 확인해야 합니다.




fs.open

 

  • 파일의 아이디(fd 편수)를 가져오는 메서드이며 파일에 어떤 작업을 할지 설정할 수 있습니다.




fs.rename

 

  • 파일의 이름 및 경로를 변경하는 메서드입니다.




fs.unlink

 

  • 파일을 지우는 메서드입니다. 파일이 없다면 에러가 발생합니다.




fs.rmdir

 

  • 비어있는 폴더를 지우는 메서드입니다. 폴더가 비어있지 않다면은 에러가 발생합니다.




'Node.js' 카테고리의 다른 글

express 프레임 워크란?  (0) 2022.12.18
npm(node package manager)란?  (0) 2022.12.18
Node.js와 모듈  (0) 2022.12.11
Node.js란?  (0) 2022.12.11

Node.js와 모듈

 

// var.js 파일

const odd = "홀수";
const even = "짝수";

module.exports = {
  odd,
  even,
};

 

// func.js 파일

const { odd, even } = require("./var");

function checkOddOrEven(num) {
  if (num % 2) {
    return odd;
  } else {
    return even;
  }
}

module.exports = checkOddOrEven;

 

  • 노드는 파일안의 코드를 모듈로 만들 수 있다는 점에서 브라우저의 자바스크립트와 다릅니다.( 모듈이란 특정한 기능을 하는 함수나 변수들의 집합입니다. )




ES6에서의 모듈

// var.js 파일

export const odd = "홀수";
export const even = "짝수";

 

// func.js 파일

import { odd, even } = from "./var";

function checkOddOrEven(num) {
  if (num % 2) {
    return odd;
  } else {
    return even;
  }
}

export default checkOddOrEven;

 

  • ES6 부터는 require, modules를 사용하지 않고 export, import & from, default를 사용하여 모듈을 가져오거나 내보낼 수 있습니다.

 

  • export는 내보낼 코드의 타입 앞에 적어주면되고, import, import & from은 require 대신에 사용합니다. 그리고 default는 모듈 내에서 하나의 값에 대해서 사용할 수 있으며 import 하는 쪽에서 원하는 이름으로 import 할 수 있습니다.




'Node.js' 카테고리의 다른 글

express 프레임 워크란?  (0) 2022.12.18
npm(node package manager)란?  (0) 2022.12.18
Node.js의 파일 시스템  (0) 2022.12.17
Node.js란?  (0) 2022.12.11

Node.js란?

 

  • Node.js는 Javascript 런타임( 런타임은 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻합니다. )입니다. 따라서 노드는 Javascript 프로그램을 브라우저가 아닌 환경에서 실행할 수 있도록 도와주는 런타임입니다.




Node.js와 V8엔진

 

  • 과거에는 브라우저에서만 Javascript를 실행할 수 있었으며, 브라우저 외의 환경에서 실행하고 싶어도 성능의 문제 때문에 어려움이 있었습니다. 하지만, 2008년 구글의 V8 엔진이 공개되고 V8 엔진의 높은 성능 덕분에 라이언 달( Ryan Dahl )이 2009년 V8 엔진 기반의 노드 프로젝트를 시작하여 현재의 Node.js를 완성할 수 있었습니다.




이벤트 기반, 논 블로킹 I/O 모델

 

  • Node.js는 V8과 더불어 libuv라는 라이브러리를 사용합니다. V8과 libuv는 C/C++로 구현되어 있으며 우리가 작성한 Javascript코드를 Node.js가 알아서 V8과 libuv에 연결해줍니다. libuv는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있습니다.




이벤트 기반( event-driven )

 

  • 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 즉, 클릭이 발생했을 때 이에 대응하는 콜백 함수가 실행될 수 있도록 지정하는 것을 말합니다. 이벤트 기반 모델에서는 이벤트 루프( event loop ), 백그라운드( background ), 테스크 큐( task queue )라는 개념이 있습니다.




이벤트 루프( event loop )

 

  • 이벤트 발생 시 호출할 콜백 함수들을 관리하고 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프( loop )라고 합니다.




백그라운드( background )

 

  • setTimeout과 같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 됩니다. 여러 작업이 동시에 실행될 수 있습니다.




테스크 큐( task queue )

 

  • 이벤트 발생 후 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냅니다. 테스크 큐는 여러 개로 이루어져 있으며 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부릅니다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 합니다.




이벤트 처리 과정

 

function run() {
  console.log("3초 후 실행");
}

setTimeout(run, 3000);

 

  1. anonymous가 호출되고 setTimeout()을 호출 후 역순으로 호출스택에서 제거됩니다.
  2. 백그라운드에서는 3초를 센 후 run 함수를 테스크 큐로 보냅니다.
  3. 이벤트 루프가 호출스택이 비어있다는 것을 확인하고 테스크 큐에서 run 함수를 호출스택에 넣고 실행합니다.( 이벤트 루프는 호출 스택이 비어있을 때만 테스크 큐에 있는 함수를 호출 스택으로 가져옵니다. )




Node.js와 논 블로킹 I/O

 

  • Node.js는 non-blocking I/O를 이용해서 I/O 작업을 백그라운드로 넘겨 동시에 처리합니다.




Node.js와 싱글 쓰레드

 

  • 노드는 싱글 쓰레드라고 불리지만 엄밀히 따지면 싱글 쓰레드가 아닙니다. 노드를 실행하면 여러 쓰레드를 생성합니다. 다만, 노드 개발자가 제어할 수 있는 쓰레드는 하나뿐입니다.( 노드 12버전부터는 노드에서 멀티 쓰레드를 사용할 수 있습니다. )




'Node.js' 카테고리의 다른 글

express 프레임 워크란?  (0) 2022.12.18
npm(node package manager)란?  (0) 2022.12.18
Node.js의 파일 시스템  (0) 2022.12.17
Node.js와 모듈  (0) 2022.12.11

+ Recent posts