🌊 HTTP모듈 서버 만들기
으악 어려워!
Node.js 공식문서의 HTTP 트랜잭션 해부를 뜯어보려 한다..
서버 생성
웹 서버 객체를 생성한다. 이 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한 번씩 호출 된다.
const http = require('http');
const server = http.createServer((request, response) => {
// 여기서 작업이 진행됩니다!
});
메서드, URL, 헤더
Node가 request
객체에 유용한 프로퍼티를 넣어두어 우리는 이 프로퍼티를 사용할 수 있다.
const { headers, method, url } = request;
const userAgent = headers['user-agent'];
헤더의 설정과 관계 없이 모든 헤더는 소문자로만 표현해야한다.
요청 바디
핸들러에 전달된 request
객체는 [MDN]ReadableStream 인터페이스를 구현하고 있고 이 스트림에 리스너를 등록하거나 다른 스트림에 연결 할 수 있다. 스트림의 'data
'와 'end
' 이벤트에 이벤트 리스너를 등록하여 데이터를 받을 수 있다.
각 data
이벤트에서 발생시킨 청크는 문자열 데이터이며, 이 데이터를 미리 설정한 body
배열에 추가한 다음 end
이벤트에서 문자열로 만드는 것이 가장 좋다.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
// 이 end에서 우리는 응답해주면 된다.
});
- chunk(청크) : 데이터의 조각
- buffer(버퍼) : chunk를 받아주는 용기. chunk들을 buffer에 채운 후 다 차면 buffer을 통째로 옮기고 새 buffer에 아직 옮기지 못한 데이터 조각을 다시 채우는 과정
- buffering(버퍼링) : 데이터 조각을 buffer에 채우는 일
- buffering(버퍼링) : 데이터 조각을 buffer에 채우는 일
- stream (스트림) : buffer가 다 차면 이를 전송하고 다시 buffer를 채우는 작업을 연속히 하는 것.
const http = require('http');
http.createServer((request, response) => {
const { headers, method, url } = request;
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// 여기서 헤더, 메서드, url, 바디를 가지게 되었고
// 이 요청에 응답하는 데 필요한 어떤 일이라도 할 수 있게 되었습니다.
});
}).listen(8080); // 이 서버를 활성화하고 8080 포트로 받습니다.
헤더 데이터 전송
writeHead 메서드를 이용하여 명시적으로 응답 스트림에 헤더를 작성할 수도 있다.
response.writeHead(200, /*HTTP 상태 코드*/ {
'Content-Type': 'application/json',//헤더
'X-Powered-By': 'bacon'
});
서버 실행
node 파일명.js
node 서버는 저장시 프로그램을 매번 다시 실행해줘야 하기 때문에 서버를 껐다 켜지 않아도 수정사항이 적용되는 nodemon
을 이용하였다.
nodemon 설치하여 npm start
로 서버 실행하기.
- 터미널에
npm install nodemon
입력하여 설치 - package.json의
"script"
에 nodemon에 사용할 명령어 추가
"start" : "nodemon 파일명.js"
Node.js 공식문서 를 참고하였습니다.
예시 코드는 공식문서에서 확인할 수 있습니다.
'🐣 STUDY > HTTP, WEB' 카테고리의 다른 글
[기술면접] (1) | 2023.04.10 |
---|---|
🌱 [Web Server/Node.js] Express - req.query, req.params (1) | 2023.04.05 |
🌱 [Web Server/Node.js] Express 프레임워크 (2) | 2023.04.05 |
🌱 [Web Server] CORS, SOP (2) | 2023.04.04 |
🌱 [HTTP/네트워크] REST API (12) | 2023.03.29 |