https://magnking.blog.me/221148738767

node.js로 서버를 구축하고 mysql을 데이터 베이스로 이용해서 회원가입과 로그인 기능을 구현해보도록 하겠습니다. 

mysql에 접속하기
mysql -u root -p

이렇게 커맨드를 입력한 후 처음에 등록한 패스워들 입력하면 됩니다. 

mysql> show databases;

라고 커맨드를 입력하면 현재 데이블의 목록을 볼 수 있습니다. 

이 목록에서 만약 cloudprint라는 데이터 베이스를 사용하고 싶다면 

mysql> use cloudprint

라고 명령을 입력하면 됩니다.  그럼

Database changed

라고 데이터 베이스가 변경되었다는 메시지를 볼 수 있습니다. 

테이블생성

이제 다음과 같은 커맨드 로 테이블을 생성합니다. 

CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(100) COLLATE UTF8_unicode_ci NOT NULL, `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datatime NOT NULL, PRIMARY KEY (`id') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

mysql shell에서 빠져나오기 위해서는 다음 커맨드 사용하면 됩니다. 

mysql> \c mysql> exit
프로젝트 구조

이 튜토리얼에서 사용할 프로젝트 구조입니다. 


├── node_modules
├── package.json
├── routes
│ └── loginroutes.js
└── server.js

여기서 routes 폴더에는 api 요청에 대한 handler들이 담기게 됩니다. loginroutes.js에는 로그인과 회원가입을 처리하는 핸들러들을 담게 됩니다. 

package.json

package.json 파일은 다음과 같습니다. 필요한 pakage들을 인스톨해주세요.

{ "name": "backend", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.16.0", "express": "^4.14.0", "mysql": "^2.13.0" } }
server.js

server.js 파일의 코드는 다음과 같이 시작됩니다. 

var express = require("express"); var login = require('./routes/loginroutes'); var bodyParser = require('body-parser'); var app = express(); app.use( bodyParser.urlencoded({ extended: true }) ); app.use( bodyParser.json() ); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); var router = express.Router(); // test route router.get('/', function(req, res) { res.json({ message: 'welcome to our upload module apis' }); }); // route to handle user registration router.post('/register', login.register); router.post('/login', login.login) app.use('/api', router); app.listen(5000);


들어오는 json 파일을 파싱하기 위해서 express 프레임워크를 사용하고 미들웨어로 bodyparser를 사용하고 있습니다. 

cross 도메인 요청을 처리하기 위해서 9번째 라인의 access controls allow origin은 필수적입니다. 

그리고 23번과 24번 라인에서 회원가입과 로그인의 api를 정의하고 있습니다. 

사용자 회원가입 핸들러 만들기
exports.register = function (req, res) { // console.log("req", req.body); var today = new Date(); var users = { "first_name": req.body.first_name, "last_name": req.body.last_name, "email": req.body.email, "password": req.body.password, "created": today, "modified": today } connenction.query('INSERT INTO users SET ?' , users, function (error, results, fields) { if (error) { console.log("error ocurred", error); res.send({ "code" : 400, "failed": "error ocurred" }) } else { console.log('The solution is: ', results); res.send({ "code": 200, "success": "user registered sucessfully" }); } }); }

유저를 데이터베이스에 추가하는 간단한 insertion 쿼리를 동작시킬 수 있습니다. 'created'와 'modified'라는 컬럼을 위해서 datetime으로 현재 시간을 넣어주고 있습니다. 

다음은 사용자 로그인과 사용자 권환 확인을 담당하는 핸들러를 만들어보겠습니다. 

exports.login = function (req, res) { var email = req.body.email; var password = req.body.password; connection.query('SELECT * FROM users WHERE email = ?', [email], function( error, results, fields) { if (error) { // console.log("error ocurred", error); res.send({ "code": 400, "failed": "error ocurred" }) } else { // console.log('The solution is: ', results); if(results.length > 0) { if(results[0].password == password) { res.send({ "code": 200, "success": "login sucessfull" }); } else { res.send({ "code": 204, "success": "Email and password does not match" }); } } else { res.send({ "code":204, "success": "Email does not exists" }); } } }) }


우선 이메일이 데이터베이스에 존재하는지 확인하고 유저의 패스워드가 맞는지 확인합니다.  아래 커맨드로 서버를 동작시킨 후  포스트맨 등의 툴을 이용해서 동작을 확인할 수 있습니다. 

포스트맨에서 회원가입과 로그인의 요청은 다음과 같은 형식으로 할 수 있습니다. 

Registration: url: localhost: 5000/api/register payload: { "first_name": "use1234", "last_name": "asdf", "email": "sm2@example.com", "password": "pass123" } payload type: raw (Application/json)


Login: url: localhost:5000/api/login payload:{ "email": "sm2@example.com", "password": "pass123" } payload type:raw (Application/json)
mysql workbench

mysql 데이터베이스에 저장된 상태를 mysql-workbench 등을 확인하고 관리할 수 있습니다.