이 게시물과 이어지는 글입니다.
https://asj8000.tistory.com/entry/NodeJs-모놀리식-서비스-만들기_01
파일 하나로 API를 만들어 비즈니스 로직과 I/O 처리 기능을 분리한다.
그리고 회원 관리와 데이터 관리의 모듈을 별도로 구성한다.
REST API는 기본적으로 http서버를 사용한다.
기본적인 nodejs의 http 서버에 메소드와 URI를 추가해보자.
아래는 기본적인 서버구조이다.
const http = require('http');
var server = http.creatServer((req,res) {
}).listen(8000));//기본 지정 포트인 8000번을 사용
메소드와 URI는 전부 http.creatServer의 리퀘스트에서 불러올 수 있다.
URI를 얻어올 수 있게 소스를 추가해보자.
const http = require('http');
const url = require('url'); //URI 모듈
const querystring = require('querystring');//쿼리스트링 모듈
var server = http.createServer((req, res) => {
var method = req.method; //메소드와
var uri = url.parse(req.url, true);
var pathname = uri.pathname; //URI를 불러온다.
}).listen(8000);
간단하게 URI를 조회하는 소스를 제작했다.
http 프로토콜은 메소드에 따라 파라미터를 얻어오는 방법이 다르다.
예시를 들어보자면, POST와 PUT는 data이벤트와 end이벤트, Get과 Delete는 parse 기능을 이용해야 한다.
파라미터를 얻어와 보자.
//monol.js
const http = require('http');
const url = require('url');
const querystring = require('querystring');
var server = http.createServer((req, res) => {
var method = req.method;
var uri = url.parse(req.url, true);
var pathname = uri.pathname;
if (method === "POST" || method === "PUT") {
//메소드가 POST 또는 PUT이면 실행
var body = "";
//데이터를 불러온다.
req.on('data', function (data) {
body += data;
});
req.on('end', function () {
var params;
if (req.headers['content-type'] == "application/json") {
//헤더의 타입이 json이면 실행
params = JSON.parse(body);
} else {
params = querystring.parse(body);
}
onRequest(res, method, pathname, params);
});
} else { //Get이나 Delete이면 쿼리의 값을 불러온다.
onRequest(res, method, pathname, uri.query);
}
}).listen(8000);
불러온 데이터를 파라미터로 가지게 되는 onRequest 함수를 만들어서 모든 호출을 한 곳에서 처리한다.
구조가 완성되었으니 메소드나 URI 별로 기능을 구현한다.
get이나 delete 메소드에 파라미터를 전달하는 방법이 두가지 있다.
URI에 파라미터 포함 ex) http://localhost/admin/qwerty
URI뒤에 쿼리로 전달 ex) http://loaclhost/admin?data=qwerty
쉬운 구분을 위해 쿼리 전달 방식으로 소스를 작성했다.
onRequest안에 소스를 추가해 기능을 맡아서 동작할 js파일을 연결시켜주자.
const http = require('http');
const url = require('url');
const querystring = require('querystring');
const members = require('./monol_members.js');
const data = require('./monol_data.js');
//각 기능을 담당할 js파일을 불러온다.
var server = http.createServer((req, res) => {
var method = req.method;
var uri = url.parse(req.url, true);
var pathname = uri.pathname;
if (method === "POST" || method === "PUT") {
var body = "";
req.on('data', function (data) {
body += data;
});
req.on('end', function () {
var params;
if (req.headers['content-type'] == "application/json") {
params = JSON.parse(body);
} else {
params = querystring.parse(body);
}
onRequest(res, method, pathname, params);
});
} else {
onRequest(res, method, pathname, uri.query);
}
}).listen(8000);
function onRequest(res, method, pathname, params) { //각 기능별로 불러온다.
switch (pathname) {
case "/members":
members.onRequest(res, method, pathname, params, response);
break;
case "/data":
data.onRequest(res, method, pathname, params, response);
break;
default: //이 외의 데이터를 전부 404로 넘긴다.
res.writeHead(404);
return res.end();
}
}
function response(res, packet) { //json 형식의 응답 방식.
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(packet));
}
이제 핵심 소스코드를 완성시켰다.
이제 전 포스팅에서 설명한 maria db와 연동하기 위해 mysql 모듈을 사용하자.
전 포스팅에 적었던 DB 구축 내용을 바탕으로 소스를 작성한다.
const mysql = require('mysql');
const connec = {
host: 'localhost',
user: 'root',
password: '1234',
database: 'monolithic'
};
var connection = mysql.creatConnection(connec);
connection.connect();
connection.query("query", (error, results, fields){
});
connectcion.end();
mysql의 createConnection 함수에 connec의 정보를 전달해 connection 객체를 생성한다. DB에 접속하고 원하는 쿼리를 실행하면 콜백으로 결과가 전달된다.
으앍
수정중입니다.
최종 수정 : 2019.5.7 pm 10:21
'제가 왜 백엔드 개발을 하고 있을까요? > Node.js' 카테고리의 다른 글
bull queue 동시성(concurrency) 설정 이슈. - 설정한 값보다 훨씬 많은 job이 실행되는 이슈 (0) | 2024.06.02 |
---|---|
[Node.Js] 모놀리식 서비스 만들기_01 설계 (0) | 2019.05.02 |
[동아리 사이트 제작 - 07] 웹 백엔드 개발 - 마무리 (0) | 2019.04.22 |
[동아리 사이트 제작 - 06] 웹 프론트 개발_05 이미지 디자인 (0) | 2019.04.22 |
[동아리 사이트 제작 - 05] 웹 프론트 개발_04 JS소스파일 (0) | 2019.04.22 |
댓글