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호(엔드포인트)로 전달할 것이다
실행결과:
