<데이터베이스 테이블 작성>

  • 스키마 이름 : 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

<프로토콜 문서 작성>

<환경 설정>

  1. 테스트 폴더를 작성한다
    • 이름 : test-express
  2. 터미널을 열어서 해당 폴더에서 필요한 것들을 설치 및 설정한다
    1. npm init -y : npm을 사용하기 전의 초기화
    2. npm i express : express 설치
    3. npm i mysql2 : my-sql를 편하게 사용할 수 있게 해주는 거인듯?
    4. npm i crypto-js : 암호화
    5. npm i uuid : 유니크 ID
    6. npm i nodemon : 딱히 필요 없지만, 스크립트가 갱신될 때마다 서버를 알아서 다시 돌려주는 녀석

<테스트 케이스>

  1. 폴더에 메인이 될 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`);
      });
  2. nodemon app으로 서버를 켠다
    • postman 설치 생략
    • postman으로 get으로 해놓고 <localhost:3000/>에 전송해보면 문제 없으면 OK가 돌아온다
  3. 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;
  4. 작성한 프로토콜을 기준으로 유저 라우터 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;
  5. 회원가입 전송 테스트
    • {
          "userName" : "아이유",
          "userEmail" : "mylifefor@IU",
          "userPassword" : "IU4EVER"
      }
  6. 성공
  7. 추가 테스트(회원 목록 받아오기)
블로그 이미지

RIsN

,