node.js 의 문서인 HTTP 트랜잭션 해부를 기반에 둠
→ https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
node
를 이용하여 서버를 작성하는 경우, 웹 서버 객체를 이용하여 만든다.const http = require('http');
const server = http.createServer((request, response) => {
// 서버 내부를 구현한다.
});
request
로 전달되고, 해당 요청에 대한 응답을 위한 메소드
는 response
객체에 작성되어있다.request
객체가 전달되면 해당 객체 내부에 method
와 url
값이 함께 전달된다.const {method, url} = request
로 각각의 변수에 할당하거나, request.method
와 request.url
로 직접적으로 불러 올 수 있다.// www.someurl.com/userinfo 에 GET 요청을 한 경우.
const http = require('http');
const server = http.createServer((request, response) => {
const {method, url} = request
console.log(`${url} 로 ${method} 요청이 전달 됐습니다.`)
// '/userinfo 로 GET 요청이 전달 됐습니다.'
});
url
로 특정 요청(HTTP 메소드)
들어온 경우를 분기하여 원하는 값을 전달 해 줄 수 있다.request
객체에서 바로 body
를 받아올 수는 없다.EventEmitter
를 사용하여 해당 데이터를 받을 수 있다.Emiiter.on(Event, Listener)
으로 사용하며, 해당 요소에 이벤트가 발생하면 리스너의 내용을 실행 시킨다.node.js
의 이벤트를 기준으로 한다.body
를 받아 올 수 있다.let body = [];
request.on('data', (chunk) => {
// data 라는 이벤트가 발생했을때, 그 인자를 chunk 로 받는다.
// 이때 chunk 는 buffer의 형태를 가진다.
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// end 라는 이벤트가 발생하면 Buffer에 body 내부의 버퍼값을 넣고,
// 문자열로 바꾼다. => .toString()
});
request
객체 뿐만 아니라, response
객체도 불러오게 되는데, 이를 응답과정에서 사용하게 된다.response.statusCode = 상태코드
로 요청에 대한 응답 코드를 설정 할 수 있다.response.setHeader(헤더이름, 헤더내용)
으로 응답의 헤더를 설정 할 수 있다.response.statusCode = 200
response.setHeader('Access-Control-Allow-Origin', '*')
response.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS')
// 요청에 대한 상태코드를 200으로 표시하고, 헤더에 아래의 내용을 포함시켜 응답한다.
response.writeHead(상태코드, {헤더이름 : 헤더내용})
으로 한번에 작성이 가능하다.response.writeHead(200, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS'
})
// 위의 내용과 같다.
response.write(내용)
으로 내용을 응답의 body
로 전달 할 수 있다.response.end(내용)
으로 body
의 마지막을 명시함과 동시에 작성된 내용을 전달 할 수 있다.response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
response.end()
는 내부의 내용을 전달 할 수 있으므로, 위의 내용을 아래와 같이 축약 할 수 있다.response.end('<html><body><h1>Hello, World!</h1></body></html>');
body
로 전달된 데이터를 대문자로 바꾸어 다시 응답으로 전달하는 경우const http = require('http');
const server = http.createServer((request, response) => {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// 요청의 body 내용을 문자열화 시킨다.
response.writeHead(200, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
})
// 상태코드와 헤더를 설정한다.
response.end(body.toUpperCase());
// 응답의 body에 요청의 body의 내용을 대문자로 변경하여 전달한다.
}
상태코드
, 헤더
, body
가 모두 작성되어야 한다!console.log
를 트리구조로 확인 할 수 있다.