Simple API server with http module(2)
위스타그램(Westagram) 웹 시스템을 개발해서 서비스하는 가상의 스토리를 가정한다.
Westagram Backend API 시스템 아키텍처:
Client의 요청을 받는 Node.js based API
+ MySQL based database
목적
위스타그램에 필요한 백엔드 API의 기능:
요약
ex) 클라이언트에게 Hello World!를 반환:
(1)
http 웹서버를 만들기 위해서 Node.js 내에 내장되어 있는 http 모듈을 require()로 불러온다.// app.js
const http = require('http'); // (1)
(2)
http 모듈에는 서버를 생성하는 기능(메서드)가 포함되어 있다 createServer([options], requestListener)
options
(선택) : client와 connection 유지 시간을 결정하는 keepAliveTimeout과 같음 requestListener
함수 (선택) : http request가 들어왔을 때, 실행되어야함. createServer() 메서드
를 호출할 때 인자로 전달해줘도 되지만, 나중에 등록해줄 수도 있다.(이하, 나중에 등록하는 방식)// HTTP 서버 객체 생성
const server = http.createServer(); // (2)
(3)
Client에서 HTTP 요청이 들어왔을 때, 실제로 실행되는 함수(requestListner
)를 정의한다.httpRequestListener
함수의 호출부 인자(arguments).// HTTP 요청(이벤트)이 발생하면 실행되는 Listener(함수) 정의
const httpRequestListener = function (request, response) { // (3)
response.writeHead(200, { "Content-Type": "application/json" }); // (4)
response.end(JSON.stringify({ message: "Hello World!" })); // (5)
};
서버
는 클라이언트의 http 요청을 http request 이벤트
로 인식한다!// http request가 발생하면 httpRequestListener가 실행될 수 있도록
// "request" 이벤트에 httpRequestListener(함수) 등록
server.on("request", httpRequestListener); // (6)
이벤트가 등록되는 순서⭐️
http.createServer()
메서드 실행 결과
반환된 서버 객체가 가지고 있는on()
메서드를 사용해 이벤트를 등록.on()
메서드를 호출 시, 인자로 "request"라는 문자열과httpRequestListener
함수를 전달.server.on(“request”, httpRequestListener)
메서드를 호출 시, server 객체에 "request" 이름으로 이벤트가 등록되게 된다.- 이후에 서버로 실제로 http 요청이 들어오면, "request" 이름으로 등록된
httpRequestListener
함수에 인자로 클라이언트의 요청에 대한 정보가 담긴request 객체
와 응답에 대한 정보가 담긴response 객체
를 넘겨주면서 내부 로직이 실행된다.- 그래서
httpRequestListener
함수의 블록({}
) 내부에서는request
와response
로 넘어오는 어떤 값을 사용할 수 있게 된다.- 이렇게 전달받은
response 객체
내부의 여러가지 메서드(wrtieHead, end, 등)를 호출해서 클라이언트에게 응답을 보낼 수 있다.
response 객체: 서버로 웹브라우저나 또는 앱으로 부터 어떤 요청이 있을 때 요청한 사용자 측으로 값을 반환해 줄 때 사용하는 객체.
(4)
response.writeHead() 메서드
response.writeHead(200, {'Content-Type':'application/json'}); // (4)
첫번째 200:
두번째 {'Content-Type' : 'application/json'}:
{ }
블럭에는 복수의 값을 담을 수 있다. (5)
response.end( ) 함수
response.end(JSON.stringify({ message: "Hello World!" }));
{ message: "Hello World!" }
객체를 response message의 body에 담아서 클라이언트에 반환한다. json
형태로 화면에 출력해 준다.request 객체: 요청을 보낸 클라이언트와 관련된 데이터가 담겨있는 객체
// app.js
const httpRequestListener = function (request, response) {
console.log(`request object : ${request}`) // 클라이언트 정보 획득
response.writeHead(200, { "Content-Type": "application/json" });
response.end(JSON.stringify({ message: "Hello World!" }));
};
request 객체를 출력해보고,
API 구현에 필요한 request.url, request.method 속성을 알아보자
컴퓨터와 컴퓨터가 통신하려면?
http://IP 주소:포트 번호
: 클라이언트에서 서버로 요청 보낼 때(7)
server.listen(포트 번호, IP 주소, 콜백함수) 메서드server.listen(8000, '127.0.0.1', function() { // (7)
console.log('Listening to requests on port 8000');
});
$ node app.js
Listening to requests on port 8000
httpie : http 요청을 보내는 개발용 클라이언트 도구
#Ubuntu $ sudo apt install httpie #Mac $ brew install httpie
$ http -v GET 127.0.0.1:8000
이 과정을 택배 배송에 비유한다면..
택배원(Client)이 배송 주소를 보고 물건(request)을 가지고 아파트(IP주소, 포트번호)까지 도달했고 이제 101동 1001호(엔드포인트)로 전달할 것이다
실행결과: