Node.js

[Node.js] http 모듈로 서버 구축하기(1) - http 모듈, fs 모듈

gamzaggang7 2024. 3. 4. 15:32
728x90

서버는 클라이언트에서 요청을 받고, 요청의 내용을 처리한 뒤 클라이언트에 응답을 보낸다. 따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다. 클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다.

이벤트 리스너를 가진 노드 서버를 만들어 볼 것이다.

 

728x90

 

http 모듈 / createServer()

http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있으므로 http 모듈을 사용한다.

http 모듈의 createServer 메서드는 인수로 요청에 대한 콜백 함수를 넣을 수 있으며, 요청이 들어올 때마다 매번 콜백 함수가 실행된다. 따라서 이 콜백 함수에 응답을 적으면 된다.

server.js 파일을 만들고 코드를 작성한다.

 

const http = require('http');

http.createServer((req, res) => {})

 

createServer의 콜백 부분을 보면 req와 res 매개변수가 있다. 요청에 대한 응답과 서버 연결을 추가해보자.

 

const http = require('http');

http.createServer((req, res) => {
    res.write('<H1>hello</H1>');
}).listen(8080, () => {
    console.log('8080번 포트 서버 대기 중');
})

 

코드를 실행시키면 콘솔에 위와 같은 문장이 출력된다. 성공적으로 연결되었으니 http://localhost:8080/로 접속한다.

 

 

listen 메서드에 콜백 함수를 넣는 대신 서버에 listening 이벤트 리스너를 붙여도 된다.

 

const http = require('http');

const server = http.createServer((req, res) => {
    res.write('<H1>hello</H1>');
});
server.listen(8080);

server.on('listening', () => {
    console.log('8080번 포트 서버 대기 중');
});
server.on('error', (error) => {
    console.error(error);
})

 

error 이벤트 리스너도 붙였다.

 

 

여러 서버 동시 실행

creaeteServer를 원하는 만큼 호출하여 한 번에 여러 서버를 실행할 수도 있다.

 

const http = require('http');

http.createServer((req, res) => {
    res.write('<H1>hello</H1>');
}).listen(8080, () => {
    console.log('8080번 포트 서버 대기 중');
})

http.createServer((req, res) => {
    res.write('<H1>hello2</H1>');
}).listen(8081, () => {
    console.log('8081번 포트 서버 대기 중');
})

 

 

이때 포트 번호가 같으면 EADDRINUSE 에러가 발생하기 때문에 포트 번호는 다르게 해야 한다.

 

 

fs모듈과 HTML파일

res.write에 HTML을 적지 않고 HTML파일을 따로 만들고 fs 모듈로 읽어 전송할 수 있다.

server.js와 같은 경로에 index.html파일을 만들었다.

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Node.js 웹 서버</title>
</head>

<body>
    <h2>안녕하세요</h2>
    <h2>gamzaggang7입니다</h2>
</body>
</html>
const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
    const data = fs.readFile('./index.html');
    res.end(data);
}).listen(8080, () => {
    console.log('8080번 포트 서버 대기 중');
});

 

요청이 들어오면 먼저 fs 모듈로 HTML파일을 읽고, data 변수에 저장된 버퍼를 그대로 클라이언트에 보낸다.

그런데 이렇게만 작성하면 아래와 같은 에러가 발생한다.

 

TypeError [ERR_INVALID_ARG_TYPE]: The "cb" argument must be of type function. Received undefined
    at maybeCallback (node:fs:178:3)

 

fs.readFile 메서드의 콜백 함수가 누락되었기 때문에 발생하는 것이다. fs.readFile은 비동기적으로 파일을 읽고 콜백 함수를 호출하는데, 이 콜백 함수는 error와 data 두 개의 매개변수를 받아야 한다. 이를 해결하기 위해서는  콜백 함수를 사용하지 않고 fs.promises 모듈을 사용하여 readFile을 프로미스 기반으로 사용하고, await를 이용해 동기식으로 파일을 읽을 수 있다.

 

const http = require('http');
const fs = require('fs').promises;

http.createServer(async (req, res) => {
    try {
        const data = await fs.readFile('./index.html');
        res.end(data);
    } catch (error) {
        console.log(error);
        res.end(error.message);
    }
}).listen(8080, () => {
    console.log('8080번 포트 서버 대기 중');
});

 

이렇게 Node.js로 http서버를 구축해 보았다. 하지만 지금은 모든 요청에 대해 한 가지 요청밖에 할 수 없다.

요청별로 다른 응답을 하는 방법은 다음 게시물로,,~

728x90