<데이터베이스 테이블 작성>
- 스키마 이름 : user_db
- 테이블 이름 : users
- utf-8 설정
- 데이터
- userID : varchar(45) / pk, nn
- userName : varchar(45) / nn
- userEmail : varchar(45) / nn, uq
- userPassword : varchar(255) / nn
- userConnectedTime : datetime / Default : CURRENT_TIMESTAMP
<프로토콜 문서 작성>
<환경 설정>
- 테스트 폴더를 작성한다
- 이름 : test-express
- 터미널을 열어서 해당 폴더에서 필요한 것들을 설치 및 설정한다
- npm init -y : npm을 사용하기 전의 초기화
- npm i express : express 설치
- npm i mysql2 : my-sql를 편하게 사용할 수 있게 해주는 거인듯?
- npm i crypto-js : 암호화
- npm i uuid : 유니크 ID
- npm i nodemon : 딱히 필요 없지만, 스크립트가 갱신될 때마다 서버를 알아서 다시 돌려주는 녀석
<테스트 케이스>
- 폴더에 메인이 될 app.js를 만든다
-
const { response } = require('express'); const express = require('express'); // :: Express 사용 const app = express(); app.use(express.json()); app.get('/', (require, response) => { response.sendStatus(200); // :: OK 돌려보내준다. }); const portNumber = 3000; app.listen(portNumber, () => { console.log(`server is running at ${portNumber} port`); });
-
- nodemon app으로 서버를 켠다
- postman 설치 생략
- postman으로 get으로 해놓고 <localhost:3000/>에 전송해보면 문제 없으면 OK가 돌아온다
- My SQL 데이터베이스와 연결을 담당할 connectPool.js를 만든다
-
const mysql = require('mysql2'); const connectPool = mysql.createPool({ host: 'localhost', user: 'root', // :: 데이터베이스 유저 id database: 'user_db', password: '<패스워드 넣어주세요>', // :: 데이터베이스 유저 패스워드 waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); module.exports = connectPool;
-
- 작성한 프로토콜을 기준으로 유저 라우터 router/uesrs.js를 만든다
-
// : Express 사용 const express = require('express'); const router = express.Router(); // : 암호화 const CrpytoJS = require('crypto-js'); const encodeKey = 'saint place'; // :: 암호화 키 // : 유니크 아이디 const {v4: uuid4} = require('uuid'); // : 데이터베이스 커넥트 const connectPool = require('../connectPool'); router.post('/', async (require, response) => { // :: 받아옴 const { userName, userEmail, userPassword } = require.body; // :: 유니크 아이디 생성 const userID = uuid4(); // :: 패스워드 암호화 const password = CrpytoJS.AES.encrypt(userPassword, encodeKey).toString(); // :: 암호화 확인 const encodePass = password; console.log("encode Password : " + encodePass); // :: 복호화 확인 const decodePass = CrpytoJS.AES.decrypt(encodePass, encodeKey).toString(CrpytoJS.enc.Utf8); console.log("decode Password : " + decodePass); // :: 쿼리 생성 const query = "insert into users(userID, userName, userEmail, userPassword) values (?, ?, ?, ?);"; // :: 쿼리 적용 try { let[rows, fields] = await connectPool.promise() .query(query, [userID, userName, userEmail, password]); // :: 적용 response.sendStatus(200); } catch(error) { response.sendStatus(500); } }); router.delete('/', async (require, response) => { console.log('회원목록 가져오기 테스트'); try { const query = "select * from users"; let[rows, fields] = await connectPool.promise().query(query); rows.forEach(row => { const name = row.userName; const email = row.userEmail; const password = CrpytoJS.AES.decrypt(row.userPassword, encodeKey).toString(CrpytoJS.enc.Utf8); const time = row.userConnectedTime; console.log(`이름 : ${name}, 이메일 : ${email}, 패스워드 : ${password}, 시간 : ${time}`); }); } catch (error) { response.sendStatus(500); } response.sendStatus(200); }); module.exports = router;
-
- 회원가입 전송 테스트
-
{ "userName" : "아이유", "userEmail" : "mylifefor@IU", "userPassword" : "IU4EVER" }
-
- 성공
- 추가 테스트(회원 목록 받아오기)