본문 바로가기

Etc/Js

[NodeJS] NodeJS로 MariaDB와 연결한 서버 만들기 - 1

https://gps-homepage.tistory.com/9

 

[MariaDB] MariaDB 외부 연결 허용시키기

https://webdock.io/en/docs/how-guides/database-guides/how-enable-remote-access-your-mariadbmysql-database How to enable Remote access to your MariaDB/MySQL database on Ubuntu Bionic or MariaDB < v10..

gps-homepage.tistory.com

 

일단 이 글은 위의 "MariaDB 외부 연결 허용" 작업의 연장선이다.

 

클라우드 Ubuntu서버에 MariaDB를 생성하고 외부에 연결할 수 있게 했으니, 이제 Unity에서 DB를 접근하여 간단하게 로그인하는 시스템을 만들어 보려고 한다. 그런데 WebGL 빌드시 unity에서 직접 DB에 접근할 수 없다. 이에 대한 건, 좀 더 공부한 후에 적어보겠다.

 

자, 그럼 어떤 방식으로 DB에 접근 해야 할까? 

 

바로 배포된 MariaDB에 연결 가능한 서버를 하나 만들어 배포시켜야 한다. 이를 미들웨어(Middleware)라고 한다.

 

미들웨어에 대한 설명은 링크를 참고하면 되겠다.

 

일단 복잡하게 만들지는 말고 간단하게 Unity에서 DB로 쿼리를 전송할 수 있는 중간다리로써 만들어 보자.

 

일단 서버를 만들수 있는 언어들은 널리고 널렸다. 그중 내 생각에 제일 쉽다고 느껴지는 건 nodeJS니 이걸로 만들어보겠다.(아 물론 nodeJS가 쉽다고 하는건 한번 만져봐서다. 필자는 서버 프로그래머가 아니라 nodeJS도 JavaScript도 다 찍먹만 해봤다... 그래도 나름 해보니 재밌다!!)

 

일단 윈도우PC에서 작업한 뒤에 서버에 옮겨놓을 예정이니 노드 모듈들을 설치해야 한다. 일단 필요한 npmnodeJS는 기본적으로 설치 돼있다는 가정으로 시작하겠다. 그래도 모르니 링크를 보고 설치하면 될 것이다.

 

먼저 필요한 모듈들부터 설치하고 시작하자.

  • express
  • mysql
  • body-parser

설치방법은 간단하다.

 

모듈을 전역으로 설치해도 되지만, 필자는 로컬에다 서버를 제작하고 해당 폴더를 통째로 우분투 서버에 옮겨 배포할 것이다. 그러니 로컬에 설치를 하겠다.

>> npm i express
>> npm i mysql
>> npm i body-parser

이렇게 자동으로 설치된다!!!

위의 명령어를 CMD창에서 서버를 구축할 경로에서 입력을 해주면, npm이 고맙게도 자동으로 폴더 안에 모듈을 설치해준다. (참고로 전역으로 설치할 때는 -g를 추가해주면 된다. ex >> npm i express -g)

 

각 모듈들에 대한 설명은 코딩을 진행 하면서 설명하겠다.

 

 

 

자 그러면 새로 만들기로 middleware.js파일을 만들어준다. (텍스트 파일을 만든 후 이름과 확장자명을 바꿔준다.)

 

자 이제 코딩을 시작해보자. 먼저 설치한 모듈들을 가져올 필요가 있다.

// ./middleware.js

const express = require('express');
const bodyParser = require('body-parser');
const mysql = require('mysql');

이렇게 모듈들을 변수에 저장하고, mysql을 접근할 때 사용할 DB설정 파일이 하나 필요하니 만들어주자.

일단 경로는 config라는 폴더를 추가해주고 그 안에 database.js라고 생성해줬다.

 

database.js에는 내가 DB에 접근할 때 필요한 정보들을 입력해주면 된다.

 

이때 필요한 정보들은 다음과 같다.

  • host : 접근할 DB의 host(ip)
  • user : 접근할 DB의 userID
  • password : 접근할 userID에 등록된 패스워드
  • database : 접근할 DB명
// ./config/database.js

module.exports = {
    host     : 'DB를 호스팅하는 IP주소',
    user     : '유저명',
    password : '비밀번호',
    database : 'DB_명'
  };

database.js의 내용은 위의 형식으로 적으면 된다.

 

module.exports는 객체 참조로 require() 호출을 하면 받는 값이다. 그래서 ./config/database.js를 require로 호출하면 해당 값들을 받게 된다.

 

자 그러면 이제 방금 생성한 설정 파일 역시 가져와야 한다.

// ./middleware.js
const dbconfig = require('./config/database.js');
const connection = mysql.createConnection(dbconfig);

위의 코드를 추가하면 설정 정보를 가져와 dbconfig에 저장한 뒤, mysql의 새로운 연결을 해당 정보로 생성해준다.

 

설정 파일을 꼭 이렇게 따로 빼둘 필요 없이 middleware.js 안에서 정의하고 사용해도 무관하지만, 좀 더 깔끔한 코딩을 위해 이렇게 따로 빼뒀다.

 

우리가 여기서 봐야 할 부분은 mysql.createConnectio(dbconfig); 부분인데, 이는 nodeJS의 'mysql' 모듈의 사용 방식이다. 사용 가이드는 링크를 참고하면 좋겠다.

 

이러면 우리의 미들웨어는 내 DB까지 연동은 된 것이다.

 

자, 이제 우린 이제 미들웨어를 통해 쿼리를 날려 원하는 데이터를 가져올 수 있을까?

 

아직은 안된다!!

 

아직 우리의 미들웨어는 서버의 실행 부분과,  Request(요청)을 받고, Response(응답)을 보내주는 기능이 없기 때문에 유니티와 소통할 수 없다.

 

그러기 위해 사용하는 게 바로 express모듈이다.(물론 express 말고 직접 http통신과 connect를 생성해도 되겠지만.. express모듈을 쓰는 게 정신건강에 좋을 것 같으니 난 이걸 쓰겠다...)

 

사용방법은 아래와 같다.

 

// ./middleware.js

const app = express();

app.set('port',  8877);

app.listen(app.get('port'), () => {
    console.log('Express server listening on port ' + app.get('port'));
});

express객체를 생성한 뒤, express의 set() 메서드로 배포할 port를 원하는 포트로 지정한다.(필자는 8877 포트에다 했다.)

 

그다음 listen()메서드로 서버를 실행 시켜준다.

 

이때 서버를 실행시킬 포트를 지정해줘야 하는데 set메서드의 반대인 get()메서드로 설정된 포트 번호를 가져올 수 있다.

 

그리고 서버 실행시 간단한 로그도 남겨 표시해줬다.

 

자 이제 한번 서버가 잘 돌아가는지 테스트해보자.

 

>> node .\middleware.js
Express server listening on port 8877

cmd창에서 노드를 실행하는 명령어는 node [노드 파일] 이다.

 

위 명령어를 입력했을 때, 로그의 문구가 나온다면 성공적으로 미들웨어가 실행된 것이다.

 

하지만 아직 request와 response에 대한 구현이 된 것은 아니라서 우리가 원하는 쿼리 전달과 DB 데이터 전달은 기대할 수 없다.

 

이때 우리는 post라는 방식으로 유니티에서 body에 쿼리문을 실어서 보내줄 것이기 때문에 body값에서 데이터를 파싱 할 수 있는 body-parser가 필요하다.

 

일단 글이 너무 길어지는 것 같으니 여기서 끊고 다음 글에서 마저 정리하겠다.

 


현재까지 짜여진 스크립트

1.middleware.js

const express = require('express');
const mysql = require('mysql');
const bodyParser = require('body-parser');

const dbconfig = require('./config/database.js');
const connection = mysql.createConnection(dbconfig);

const app = express();

app.set('port',  8877);
app.listen(app.get('port'), () => {
    console.log('Express server listening on port ' + app.get('port'));
});

 

2.database.js

module.exports = {
    host     : 'DB를 호스팅하는 IP주소',
    user     : '유저명',
    password : '비밀번호',
    database : 'DB_명'
  };