본문 바로가기

Development/Web

Node.js의 라이브러리 http와 express로 구현한 서버와 이 둘의 차이점

들어가며

Node.js로 웹 서버를 구현하기 위한 대표적인 라이브러리는 express이다. Node.js의 내장 라이브러리인 http로도 웹 서버를 구현할 수 있는데, 대부분 express로 웹 서버를 구현한다. http와 express로 서버를 구현해보면서 이 둘의 차이와 왜 express가 사용되는지에 대해서 간단히 정리해보았다.

http로 구현한 서버

http는 Node.js의 내장 라이브러리로, 별도로 설치할 필요가 없다. 아래는 http로 구현한 Node.js 서버 코드이며, 먼저 코드를 살펴보자.

"use strict";

const http = require('http');
const app = http.createServer((req, res) => {
    if (req.url === "/") return res.end("메인 페이지");
    if (req.url === "/login") return res.end("로그인 페이지");
});

const port = 3000;
app.listen(port, () => {
    console.log(`http server running on port ${port}`);
});

http 라이브러리의 경우 모든 요청을 createServer 함수의 콜백함수 안에서 처리하기 때문에 코드 가독성이 떨어진다. 또한, 위와 같이 코드를 작성하는 경우 한글이 깨진다는 문제점이 생긴다.

이와 같은 문제를 해결하기 위해서는 헤더에 Content-Type을 명시해주어야 한다.

const headers = { "Content-Type": "text/html; charset=utf-8" };
res.writeHead(200, headers);

위 코드를 적용한 최종 코드는 아래와 같다.

"use strict";

const http = require('http');
const app = http.createServer((req, res) => {
    const headers = { "Content-Type": "text/html; charset=utf-8" };
    res.writeHead(200, headers);
    if (req.url === "/") return res.end("메인 페이지");
    if (req.url === "/login") return res.end("로그인 페이지");
});

const port = 3000;
app.listen(port, () => {
    console.log(`http server running on port ${port}`);
});

express로 구현한 서버

express로 서버를 구현하기 위해서는 먼저 express를 설치하여야 한다.

$ npm i express -s

express로 간단하게 웹 서버를 구현하면 아래 코드와 같다.

"use strict";

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    return res.send("메인 페이지");
});

app.get('/', (req, res) => {
    return res.send("로그인 페이지");
});

const port = 3000;
app.listen(port, () => {
    console.log(`express server running on port ${port}`);
});

위 코드를 보면 http로 구현한 서버 코드와는 다르게 요청 부분이 별도의 콜백 함수로 나뉘어 코드 가독성이 상대적으로 높아진 것을 확인할 수 있으며, http로 구현한 서버와는 다르게 별도의 설정을 하지 않아도 한글이 깨지지 않는다.

마치며

'웹 서버 구현 시 내장 라이브러리인 http가 아니라 express가 사용되는 이유는 무엇인가?'라는 질문의 답을 간단하게 말하자면 가볍고, 코드를 분리하기 편하고, 가독성이 높고, 편리하기 때문이라고 할 수 있겠다(아래 참고자료의 블로그에서 더욱 자세한 내용을 확인할 수 있으므로, 다른 내용은 언급하지 않겠다).