- 해당 글의 코드는 Postman을 이용해 테스트를 진행합니다.
Web Server 호출하기
http 모듈을 이용
// 모듈을 사용하기 위한 준비
const http = require("http");
// 요청을 받아와 응답하는 부분
// 첫 번째 인자로 사용자가 요청할 때 처리하는 콜백함수를 받는다.
http.createServer((req, res) => {
res.writeHead(200); // 응답코드를 200으로 설정
res.end("hello world"); // 요청을 끝냄
})
.listen(3000, () => {
console.log("server on : 3000 port");
});
- 콜백함수는 2개의 인자를 받는데 첫 번째가 요청 객체, 두 번째가 응답 객체입니다.
- listen 은 첫 번째 인자로 포트 번호를 설정합니다. 3000번 포트가 이미 열려있다면 에러가 발생됩니다.
- 정상적으로 웹 서버가 생성되었음을 포스트맨을 통해 확인할 수 있습니다.
요청 객체, 응답 객체
http로 서버를 만들 때 createServer에 클라이언트가 요청하면 실행되는 콜백함수를 만들었습니다.
콜백함수는 첫 번째 인자로 요청 객체, 두 번째 인자로 응답 객체를 받는다고 했습니다.
요청 객체 (request)
서버는 클라이언트의 요청에 따른 정확한 응답이 필요합니다. 즉, URL 의 형태와 method 에 따라 기능을 제공해야 합니다.
서버는 클라이언트의 요청사항을 해석하기 위해 요청 객체에 포함된 요청 method, URL, header, 요청 body 를 사용합니다.
- 위의 코드에서 요청객체를 출력하는 코드를 추가해보겠습니다.
const http = require('http');
http.createServer( (req,res) => {
// req, res 와 같은 이름은 중요하지 않습니다.
// 첫 번째 인자가 요청객체, 두 번째 인자가 응답객체인 것이 중요합니다.
console.log(req);
res.writeHead(200);
res.end('hello world');
}).listen(3000, () => {
console.log('server on : 3000port ');
});
)
해당 코드를 실행한 뒤 postman 을 통해 웹서버에 요청했을 때 출력되는 코드 중 저희에게 필요한 headers 와 url, method를 찾을 수 있습니다.
필요한 데이터만 가져오기 위해 다음과 같은 형태로 데이터를 가져올 수 있습니다.
let { url, headers, method } = req;
console.log(url, method, headers);
위 코드를 적용하여 postman 의 params 를 이용해 출력해보겠습니다.
const http = require("http");
http
.createServer((req, res) => {
let { url, headers, method } = req;
console.log(url, method);
res.writeHead(200);
res.end("hello world");
})
.listen(3000, () => {
console.log("server on : 3000port ");
});
)
이와 같이 요청 객체를 이용하면 클라이언트가 서버에 요청한 정보를 가져올 수 있습니다.
body 데이터의 경우에는 요청 객체에서 바로 가져올 수 없고 데이터가 포함되면 이벤트를 발생시켜 데이터를 받아와야 합니다. 클라이언트가 데이터를 보내면 서버는 데이터 이벤트를 감지하여 데이터를 받아야 합니다.
- Postman 요청과 출력창
)
req.on('data') 의 콜백은 클라이언트가 포함한 body 데이터를 인자로 받는데 해당 데이터는 버퍼 형태로 되어 있기 때문에 toString() 으로 문자열로 변환이 필요합니다.
클라이언트가 전송한 body 는 key=value 형태로 있기 때문에 우리가 사용하기 편하도록 JSON 형태로 변형하여 사용합니다.
데이터를 처리하는 중 에러가 발생하는 경우에는 on('error') 를 호출하면 됩니다.
error 이벤트는 에러 정보를 첫 번째 인자로 포함한 콜백함수를 실행하게 됩니다.
응답 객체
요청 객체를 이용해 사용자의 요청을 파악한 다음에는, 응답 객체를 이용해 사용자에게 원하는 형태로 응답해야 합니다.
이 때는 두 번째로 받은 인자를 활용합니다.
가장 먼저 응답 코드를 설정해야 합니다. 자주 사용되는 코드는 다음과 같습니다.
- 200 : 성공적으로 요청 처리
- 201 : 성공적으로 데이터를 추가
- 404 : 요청한 리소스가 없음
- 500 : 서버의 문제로 에러 발생
HTTP 응답코드에 대한 상세한 정보는 여기 에서 확인하실 수 있습니다.
응답 코드 설정
응답코드는 위에서 살펴본 바와 같이 요청 객체 res 에서 writeHead 를 호출해 헤더를 설정할 수 있습니다.
WriteHead 는 첫 번째 인자로 전달된 숫자로 응답 코드를 설정합니다.
다음과 같은 방법도 가능합니다.
res.statusCode = 200;
응답 헤더 설정
응답 헤더를 설정할 땐 응답 코드를 설정할 때처럼 writeHead 를 호출하거나 setHeader 를 호출합니다.
const http = require("http");
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'}); // 응답코드를 200으로 설정
res.end("hello world");
})
.listen(3000, () => {
console.log("server on : 3000 port");
});
writeHead 는 두 번째 인자로 헤더를 설정할 수 있습니다.
제공되는 데이터 형식에 따라 Content-Type 은 바뀔 수 있습니다.
응답 코드처럼 헤더도 setHeader 를 이용해 간편하게 바꿀 수 있습니다.
req.setHeader('Content-type' : 'text/plain')
데이터 전송
헤더와 응답 코드 설정이 완료되었으면 마지막으로 데이터를 전달해줘야 합니다. 이때는 end() 를 이용합니다.
전달해 줄 때 html 이나 파일 같은 것들을 응답할 때에는 헤더에서 content-type 을 다르게 보냅니다. 여기서 헤더 설정의 중요성을 알 수 있습니다.
const http = require("http");
http
.createServer((req, res) => {
let resData = '<html><body><h1>text/plain</h1></body></html>'
res.writeHead(200, { "Content-Type": "text/plain" });
// res.writeHead(200, { "Content-Type": "text/html" });
res.end(resData);
})
.listen(3000, () => {
console.log("server on : 3000 port");
});
text/plain
text/html
다음 글 에서는
GET, POST, 정적/ 동적 파일 제공의 주제를 다뤄보겠습니다.
참고도서 : 자바스크립트로 서버와 클라이언트 구축하기
'Study > Express(node.js)' 카테고리의 다른 글
express ) express-generator 프로젝트 생성하기 (0) | 2022.02.05 |
---|---|
express ) 미들웨어 (0) | 2022.02.04 |
express ) Router (0) | 2022.01.17 |
node.js ) package.json 파헤치기 (0) | 2022.01.16 |
node.js ) 웹서버 기초 (2) - GET, POST, 정적/동적 파일제공 (0) | 2022.01.16 |
댓글