내일배움캠프 TIL (230124)

Jiumn·2023년 1월 24일
0

http 모듈로 서버 만들기

node.js 주특기 과정이 본격적으로 시작된 후,
스파르타에서 제공해준 강의도 그렇고 팀 프로젝트도 그렇고
express.js만 사용했기 때문에 http 모듈을 제대로 사용해본 적이 없었다.

하지만 express.js 자체가 http 모듈을 쉽게 사용할 수 있게 만든 프레임워크이기도 하고, node.js를 주특기로 선택한 이상 http 모듈에 대해서도 기본적인 내용은 짚고 넘어가야 된다는 생각이 들었다.

그래서 간단히 정리해보는 http 모듈로 서버 만드는 소스 코드.

// node.js의 내장 모듈인 http 불러오기
const http = require("http");
// 파일 처리를 위한 내장 모듈 fs 불러오기
const fs = require("fs");

// http 서버 만들어서 server 변수에 담아주기
// 인수에 들어있는 함수의 요청을 실행하라는 설정 (화살표 함수)
const server = http.createServer((req, res) => {
  const url = req.url;
  const method = req.method;
  // url이 기본일 때 응답으로 보내는 html 코드
  if (url === "/") {
    res.setHeader("content-Type", "text/html");
    res.write("<html>");
    res.write("<head><title>Enter message</title></head>");
    res.write(
      "<body><form action='/message' method='POST'><input type='text' name='message'><button type='submit'>Send</button></form></body>"
    );
    res.write("</html>");
    return res.end();
  }
  // process.exit(); 프로세스 중지하고 싶을 때 사용하는 함수
  // url과 요청 메소드 지정
  if (url === "/message" && method === "POST") {
    const body = []; // body는 빈 배열이어야 함
    req.on("data", (chunk) => {
      // data 이벤트일 때 chunk 받아서 chunk 추가
      console.log(chunk);
      body.push(chunk);
    });
    return req.on("end", () => {
      // 데이터 다 받으면 다음 함수를 실행
      const parsedBody = Buffer.concat(body).toString(); // Buffer에 저장된 데이터를 문자열로 풀어줌
      const message = parsedBody.split("=")[1]; // = 이후의 데이터를 담음
      // writeFileSync: 동기화하는 코드 (파일 저장까지 다른 코드 실행 막음)
      fs.writeFile("message.txt", message, (err) => {
        // 담은 데이터를 txt 파일에 저장
        res.statusCode = 302;
        res.setHeader("Location", "/");
        return res.end();
      });
    });
  }
  res.setHeader("content-Type", "text/html");
  res.write("<html>");
  res.write("<head><title>My first Page</title></head>");
  res.write("<body><h1>Hello from my node.js Server!</h1></body>");
  res.write("</html>");
  res.end();
});

// 요청을 계속 들음(listen)
server.listen(3000);

데이터 스트림과 buffer 메모리

http 모듈로 서버를 만들면서 흥미로웠던 부분은 데이터 스트림과 관련된 코드였다.

req.on("data", (chunk) => {
  // data 이벤트일 때 chunk 받아서 chunk 추가
  console.log(chunk);
  body.push(chunk);
});

이 코드에서 data를 받을 때 chunk라는 것을 인수로 받게 되는데,
이때 chunk를 콘솔로 찍어보면 buffer 형태의 데이터가 나타난다.

node.js에서 서버는 켜져 있는 이상(listen) 데이터는 스트리밍 형태로 계속 들어오게 된다.

이때 얼마나 많은 데이터가 들어올지 알 수 없으므로 buffer 메모리에서 임시로 데이터를 처리하고 전달해주게 된다.

'버퍼링'이 걸린다는 말이 여기서 전해진 표현이다.
실제로 데이터는 전달되는 과정에서 buffer에서 임시적으로 데이터를 처리되고, 이 과정에서 버퍼링이 발생하는 것이다.

그리고 이 buffer는 이진수로 나타나기 때문에 사람이 이해할 수 있는 문자열로 변환을 해줘야 한다.

return req.on("end", () => {
      // 데이터 다 받으면 다음 함수를 실행
      const parsedBody = Buffer.concat(body).toString(); // Buffer에 저장된 데이터를 문자열로 풀어줌
      const message = parsedBody.split("=")[1];

문자열로 변환된 후에는 message=내용과 같은 형태로 나타나기 떄문에 split메서드를 사용해서 한번 더 가공해준다.

이렇게 http 모듈을 이용해서 데이터를 주고 받는 것은 꽤나 복잡하기 때문에 express를 사용한다는 것을 한번 더 깨달을 수 있는 시간이었다. ^~^

profile
Back-End Wep Developer. 꾸준함이 능력이다.

0개의 댓글