서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때. 요청의 본문에 치환할 데이터를 넣어 보낸다.
PATCH
서버 자원의 일부만 수정하고자 할 때. 요청의 본문에 일부 수정할 데이터를 넣어 보낸다.
DELETE
서버의 자원을 삭제하고자 할 때. 요청의 본문에 데이터를 넣지 않는다.
OPTIONS
요청을 하기 전에 통신 옵션을 설명하기 위해 사용한다.
예) GET 메서드의 /user 주소로 요청을 보내면 사용자 정보를 가져오는 요청이다.
예) POST 메서드의 /user 주소로 요청을 보내면 새로운 사용자를 등록한다.
이렇게 배운 REST 주소 체계를 따르는 서버를 RESTful하다고 한다.
실습에 앞서 먼저 대략적인 주소를 먼저 설계한다.
이 책의 저자의 깃허브 저장소의 코드를 가지고 실습한다.
JavaScript
req.method로 요청 메서드를 구분한다.
요청 메서드 종류를 구분하고나면 req.url로 요청 주소를 구분하여 해당하는 소스를 보내준다.
req.on('data'), req.on('end')처럼 사용하는 이유는 req, res도 내부적으로 스트림으로 되어있기 때문이다. 즉 데이터를 꺼내거나 수정할때 데이터가 스트림 형식으로 전달되기 때문에 이벤트처리를 해야 된다.
name 주소로 요청을 보낸다.
메서드는 요청의 종류를 나타내고 xhr은 AJAX 요청이라는 뜻이다.
이렇게 요청에 대한 응답 헤더, 본문을 살펴볼수 있다.
헤더는 요청/응답에 대한 정보를 가지고 있고 본문은 실제 서버와 클라이언트가 주고받는 데이터를 담아두는 공간이다.
Synapse Map Insight
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번 포트에서 서버 대기 중입니다!');});
const http =require('http');const server = http.createServer((req, res)=>{ res.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});// 헤더 설정을 통해 html 태그를 정확히 인식시킬 수 있고 한글도 인식가능하게 만듬 res.write('<h1>Hello Node!</h1>'); res.end('<p>Hello Server!</p>');});server.listen(8080);server.on('listening',()=>{ console.log('8080번 포트에서 서버 대기 중입니다!');});server.on('error',(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번 포트에서 서버 대기 중입니다!');});
// server2.html
<!DOCTYPEhtml><html><head><metacharset="utf-8"/><title>Node.js 웹 서버</title></head><body><h1>Node.js 웹 서버</h1><p>만들 준비되셨나요?</p></body></html>
// server2.jsconst http =require('http');const fs =require('fs').promises;http.createServer(async(req, res)=>{try{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/plain; charset=utf-8'}); res.end(err.message);}}).listen(8081,()=>{ console.log('8081번 포트에서 서버 대기 중입니다!');});
const http =require('http');const fs =require('fs').promises;const users ={};// 데이터 저장용http.createServer(async(req, res)=>{try{if(req.method ==='GET'){if(req.url ==='/'){const data =await fs.readFile('./restFront.html'); res.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});return res.end(data);}elseif(req.url ==='/about'){const data =await fs.readFile('./about.html'); res.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});return res.end(data);}elseif(req.url ==='/users'){ res.writeHead(200,{'Content-Type':'application/json; charset=utf-8'});return res.end(JSON.stringify(users));}// /도 /about도 /users도 아니면try{const data =await fs.readFile(`.${req.url}`);return res.end(data);}catch(err){// 주소에 해당하는 라우트를 못 찾았다는 404 Not Found error 발생}}elseif(req.method ==='POST'){if(req.url ==='/user'){let body ='';// 요청의 body를 stream 형식으로 받음 req.on('data',(data)=>{ body += data;});// 요청의 body를 다 받은 후 실행됨return req.on('end',()=>{ console.log('POST 본문(Body):', body);const{ name }=JSON.parse(body);const id = Date.now(); users[id]= name; res.writeHead(201,{'Content-Type':'text/plain; charset=utf-8'}); res.end('ok');});}}elseif(req.method ==='PUT'){if(req.url.startsWith('/user/')){const key = req.url.split('/')[2];let body =''; req.on('data',(data)=>{ body += data;});return req.on('end',()=>{ console.log('PUT 본문(Body):', body); users[key]=JSON.parse(body).name; res.writeHead(200,{'Content-Type':'text/plain; charset=utf-8'});return res.end('ok');});}}elseif(req.method ==='DELETE'){if(req.url.startsWith('/user/')){const key = req.url.split('/')[2];delete users[key]; res.writeHead(200,{'Content-Type':'text/plain; charset=utf-8'});return res.end('ok');}} res.writeHead(404);return res.end('NOT FOUND');}catch(err){ console.error(err); res.writeHead(500,{'Content-Type':'text/plain; charset=utf-8'}); res.end(err.message);}}).listen(8082,()=>{ console.log('8082번 포트에서 서버 대기 중입니다');});