본문 바로가기
제가 왜 백엔드 개발을 하고 있을까요?/Node.js

[Node.Js] 모놀리식 서비스 만들기_02 구현

by asj8000 2019. 5. 2.
반응형

이 게시물과 이어지는 글입니다.

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

 

반응형

댓글