http module

클라이언트에서 서버로 요청(request)을 보내고 서버는 요청 내용을 처리한 뒤 클라이언트에게 응답(response)를 보낸다. 따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다. 요청과 응답은 이벤트 방식이라고 생각하면 된다. 클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다.

const http = require('http');
http.createServer((req, res) => {
  //응답할 내용 작성
})

http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있으므로 http 모듈을 사용한다. createServer 메소드가 있으며, 인수로 요청에 대한 콜백 함수를 넣을 수 있다. 요청이 들어올 때마다 매번 콜백함수가 실행된다.

const http = require('http');
http.createServer( (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
  res.write('<h1>Hello?</h1>');
  res.end('<p>http server..</p>');
}).listen(8080, () => {
  console.log('server start!');
})

포트?

createServer 메서드 뒤에 listen 메서드를 붙이고 클라이언트에 공개할 포트 번호와 포트 연결 완료 후 실행될 콜백 함수를 넣는다.

res.writeHead 메서드는 응답에 대한 정보를 기록하는 메서드이다. 첫 번째 인수로 성공적인 요청임을 의미하는 200을, 두 번째 인수로 응답에 대한 정보를 보내는데 콘텐츠의 형식이 HTML임을 알리고 있다. 한글 표시를 위해 charset을 utf-8로 지정했다. 이 정보기 기록되는 부분을 헤더(header)라고 부른다.

res.write 메서드의 첫 번째 인수는 클라이언트로 보낼 데이터이다. 위 소스는 HTML 모양의 문자열을 보냈지만 버퍼를 보낼 수도 있다. 또한 여러 번 호출해서 데이터를 여러 개 보내도 된다. 데이터가 기록되는 부분을 본문(body)이라고 부른다.

res.end 메서드는 응답을 종료하는 메서드이다. 만약 인수가 있다면 그 데이터도 클라이언트에 보내고 응답을 종료한다.

listen 메서드에 콜백 함수를 넣는 대신 이벤트 리스너를 붙여서 사용하는 방식도 가능하다.

const http = require('http');

const server = http.createServer( (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
  res.write('<h1>Hello?</h1>');
  res.end('<p>http server..</p>');
});
server.listen(8080);
server.on('listennig', () => {
  console.log('server start!');
})
server.on('error', (err) => {
  console.error(err);
})

한번에 여러 서버를 실행할 수도 있다.

const http = require('http');
http.createServer( (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
  res.write('<h1>Hello?</h1>');
  res.end('<p>http server..</p>');
}).listen(8080, () => {
  console.log('server start1!');
})

http.createServer( (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
  res.write('<h1>Hello?</h1>');
  res.end('<p>http server..</p>');
}).listen(8081, () => {
  console.log('server start2!');
})

html 파일을 fs 모듈로 읽어서 전송할 수도 있다.

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

const server = http.createServer( async (req, res) => {
  try {
    const html = fs.readFileSync('./server2.html');
    console.log(html); //버퍼로 담김
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8'});
    res.end(html);
  } catch (err) {
    console.error(err);
    res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8'});
    // res.end(err); //이건 에러 페이지도 안뜨고 서버에만 에러뜸
    res.end(err.message);
  }
})
server.listen(8080, () => {
  console.log('server start');
})

파일을 읽어 버퍼로 보낸다.

HTTP 상태 코드