[Node.js] 요청과 응답

서버는 클라이언트의 요청(request)을 읽고 처리한 뒤, 응답(response)을 보냅니다.
클라이언트로부터 요청이 왔을 때, 어떤 작업을 수행할 지 이벤트 리스너를 미리 등록해두어야 합니다.

1. 이벤트 리스너를 가진 노드 서버 만들기

1-1. http createServer()

  • http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있습니다.
  • createServers(콜백 함수): 요청이 들어올 때마다 매번 콜백 함수가 실행됨.
    • res.writeHead
      : 응답에 대한 정보를 기록하는 메서드
      : 이 정보가 기록되는 부분을 헤더(Header)라고 부름
    • res.write
      : 클라이언트로 보낼 데이터
      : body라고 부름
    • res.end
      : 응답을 종료하는 메서드
      : 인수가 있다면 그 데이터도 클라이언트로 보낼 응답을 종료
const http = require('http');

http.createServer((req, res) => {
	//여기에 어떻게 응답할 지를 적습니다.
  
  	// 200: 성공적인 요청임
        // {'Content-Type': 'text/html; charset=utf-8'}: 응답에 대한 정보를 보내는데 콘텐츠의 형식이 HTML임, 한글 표시: utf-8
  	res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  	// HTML 모양의 문자열을 보냄 or 버퍼 가능
  	res.write('<h1>Hello Node!</h1>');
  	res.end('<p>Hello Server!</p>');
})
  .listen(8080, () => {
    console.log('8080번 포트에서 서버 대기 중 입니다!');
  });

<서버에 listening 이벤트 리스너 붙이기>

const http = require('http');

const server = http.createServer((req, res) => {
	//여기에 어떻게 응답할 지를 적습니다.
  	res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  	res.write('<h1>Hello Node!</h1>');
  	res.end('<p>Hello Server!</p>');
});
server.listen(8080);

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

<한 번에 여러 서버도 실행 가능>

const http = require('http');

http.createServer((req, res) => {
	//여기에 어떻게 응답할 지를 적습니다.
  	res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  	res.write('<h1>Hello Node!</h1>');
  	res.end('<p>Hello Server!</p>');
})
  .listen(8080, () => {
  console.log('8080번 포트에서 서버 대기 중 입니다!');
  });

http.createServer((req, res) => {
	//여기에 어떻게 응답할 지를 적습니다.
  	res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
  	res.write('<h1>Hello Node!</h1>');
  	res.end('<p>Hello Server!</p>');
})
  .listen(8081, () => {
  console.log('8081번 포트에서 서버 대기 중 입니다!');
  });

localhost와 포트

  • localhost : 현재 컴퓨터의 내부 주소
    자신의 컴퓨터에서만 접근 가능하며 외부 접근 불가능 (서버 테스트 시 사용)
  • 127.0.0.1 = 숫자 주소 = IP(Interner Protocol) = localhost
  • 포트: 서버 내에서 프로세스를 구분하는 번호
    • 서버는 HTTP 요청을 대기하는 것 외에도 다양한 작업을 함
    • 이때 서버는 프로세스에 포트를 다르게 할당하여 들어오는 요청을 구분
    • 포트 번호는 IP 주소 뒤에 콜론(:)과 함께 붙혀서 사용
    • 포트 하나에 서비스 하나만 사용이 가능
    • 실제 배포시에는 80 or 443번 포트를 사용
      • 리눅스, 맥의 경우 1024번 이하의 포트에 연결할 때 관리자 권한이 필요하므로, 명령어 앞에 sudo를 붙혀야 함.

1-2 HTML 파일을 fs 모듈로 읽어서 전송하기

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Node.js 웹 서버</title>
</head>
<body>
    <h1>Node.js 웹 서버</h1>
    <p>만들 준비되셨나요?</p>
</body>
</html>
const http = require('http');
const fs = require('fs').promises;

http.createServer(async (req, res) => {
	try{
      	// data 변수에 버퍼를 저장하고 클라이언트에게 보내줍니다.
        const data = await fs.readFile('./server2.html');
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
        res.end(data);
    } catch(err) {
        console.error(err);
        res.writeHead(500, {'Content-Type': 'text/html; charset=utf-8'});
        res.end(err.message);
    }
})
  .listen(8081, () => {
  console.log('8081번 포트에서 서버 대기 중 입니다!');
  });

HTTP 상태 코드
res.writeHead에 첫 번째 인수로 상태 코드를 넣었는데, 브라우저는 서버에서 보내주는 상태 코드를 보고 요청이 성공했는지 실패했는지를 보여줌

  • 2XX
    : 성공을 알리는 상태코드.
    : 200(성공), 201(작성됨)
  • 3XX
    : 리다이렉션(다른 페이지로 이동)을 알리는 상태코드. 어떤 주소를 입력했는데 다른 주소의 페이지로 넘어갈 때 이 코드가 사용됨.
    : 301(영구 이동), 302(임시 이동)
    : 304(수정되지 않음: 요청의 응답으로 캐시를 사용했다는 의미)
  • 4XX
    : 요청 오류 (요청 자체에 오류가 있음)
    : 400(잘못된 요청), 401(권한 없음), 403(금지됨), 404(찾을 수 없음)
  • 5XX
    : 서버 오류 (요청은 왔지만 서버에 오류가 생겼을 때 발생)
    : 예기치 못한 에러 발생 시 서버가 알아서 5XX대 코드를 보냄
    : 500(내부 서버 오류), 502(불량 게이트웨이), 503(서비스를 사용할 수 없음)

좋은 웹페이지 즐겨찾기