๐Ÿ’ป BackEnd/๐ŸŸฉ NodeJS

[NodeJS] ์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž…

Dbswnstjd 2022. 3. 27. 02:37

NodeJS๋ฅผ ํ†ตํ•œ ์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ 

์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Express ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •์„ ํ•ด์ค€๋‹ค. 

userRoute์˜ route์—์„œ /app/users๋กœ ๋ณด๋‚ด์ฃผ๊ณ  src/app/user์˜ userController.js ํŒŒ์ผ์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด๊ณ  userService์—์„œ๋Š” Create, Update, Delete ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค. userProvider๋Š” Read ๋กœ์ง์„ ์ฒ˜๋ฆฌ ํ•  ์˜ˆ์ •์ด๋‹ค. 

userDao์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ ‘๊ทผํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. 

 

userRoute -> userController -> userService / userProvider -> userDao


๐Ÿ“„ app.js
import express, { json, urlencoded } from 'express';
import methodOverride from 'method-override';
import logger from 'morgan';
import routes from './config/route.js';
import dotenv from 'dotenv';
import cookieParser from 'cookie-parser';
dotenv.config();
const port = process.env.SERVER_PORT || 5000;

class App {
  constructor() {
    this.app = express();

    this.setMiddleWare();

    this.getRouting();

    this.listen();
  }
  setMiddleWare() {
    this.app.use(logger('dev'));

    this.app.use(json());
    this.app.use(urlencoded({ extended: false }));

    this.app.use(methodOverride());
    this.app.use(cookieParser());
  }
  getRouting() {
    this.app.use('/', routes);
  }
  listen() {
    this.app.listen(port, () => {
      console.log(`Server is running on ${port}`);
    });
  }
}

export default new App().app;

์—ฌ๊ธฐ์„œ express ์„ค์ •, ๋ผ์šฐํŒ… ์„ค์ •์„ ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค. ๊ทธ ์™ธ์˜ ๋ฏธ๋“ค์›จ์–ด๋‚˜ Json ํ˜•์‹์„ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•œ ์„ค์ •, ์ฟ ํ‚ค ์„ค์ •์ด ์žˆ๋‹ค. 


๐Ÿ“„ route.js

import { Router } from 'express';
import userRoute from '../src/app/user/userRoute.js';
import authRoute from '../src/auth/authRoute.js';
const router = Router();

router.use('/app/users', userRoute);
router.use('/auth', authRoute);

export default router;

route.js ํŒŒ์ผ์—์„œ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ณ  userRoute์— ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค. 

authRoute๋Š” JWT ํ† ํฐ์„ ์ธ์ฆํ•ด์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ์ด๋‹ค. 


๐Ÿ“„ userRoute.js

import { Router } from 'express';
const router = Router();

import userController from './userController.js';
import { authentication, reissuanceToken } from '../../../config/jwtMiddleware.js';

router.post('/', userController.postUser); // ํšŒ์›๊ฐ€์ž… API
router.post('/login', userController.login); // ๋กœ๊ทธ์ธ API
export default router;

ํšŒ์›๊ฐ€์ž…์€ POST ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ Body ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๋ผ์šฐํ„ฐ ์„ค์ •์„ ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— '/app/users' ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด userController.postUser ์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ํšŒ์›๊ฐ€์ž…์ด ์‹คํ–‰๋œ๋‹ค. 

๋กœ๊ทธ์ธ ๋˜ํ•œ POST ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด  '/app/users/login' ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด userController.login์ด ์‹คํ–‰๋œ๋‹ค. 


๐Ÿ“„ userController.js

postUser = async function (req, res) {
    const parsedType = parseInt(req.body.distinction); // ํšŒ์› ๊ตฌ๋ถ„
    console.log(parsedType);
    console.log(req.body.distinction);
    // type 1. ์‚ฌ์šฉ์ž, 2.์กฐ์ง/๊ธฐ๊ด€
    if (parsedType === 1) {
      // ์‚ฌ์šฉ์ž ํšŒ์›๊ฐ€์ž…
      // ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์— ์ •๋ณด ์ž…๋ ฅ
      const userId = req.body.id;
      const password = req.body.password;
      const userName = req.body.name;
      const phoneNumber = req.body.phoneNumber;
      const address = req.body.address;
      const type = req.body.distinction; // req.body.type
      const info = req.body.info;

ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์™€ ํ˜‘์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ body๋กœ ๋ฐ›๋Š” ๊ฐ’์„ ํ†ต์ผํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ€์ˆ˜๋ฅผ ๋‹ด๋Š” ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋”๋Ÿฝ์ง€๋งŒ ์ด๋Š” ์ถ”ํ›„ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋‹ค. 

์›๋ž˜ ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

const { id, password, userName, phoneNumber, address, type, info } = req.body

 

๊ทธ๋ƒฅ ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์™€ ๊ธฐ์—…์„ ๊ตฌ๋ณ„ํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์ธ์ง€ ๊ธฐ์—…์ธ์ง€ ๊ตฌ๋ณ„ํ•˜๋Š” type์„ body์— ๋‹ด์•„์„œ ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ๊ตฌ๋ณ„์„ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ก ํŠธ์—์„œ ๋ชจ๋‘ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๋Š” parsedInt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•ด ์ฃผ์—ˆ๋‹ค. 

      if (!userId) return res.send(NICKNAME_EMPTY); // code 2000
      if (userId.length > 20) return res.send(ID_LENGTH_ERROR); // code 2012
      if (!password) return res.send(PASSWORD_EMPTY); // code 2001
      if (password.length < 6 || password.length > 20) return res.send(PASSWORD_LENGTH_ERROR); // code 2013
      if (!userName) return res.send(SIGNUP_NAME_EMPTY); // code 2005
      if (!address) return res.send(ADDRESS_EMPTY); // code 2010
      if (!phoneNumber) return res.send(PHONENUMBER_EMPTY); //code 2011

      const signUpResponse = await createUser(userId, password, userName, phoneNumber, address, type, info);
      return res.send(signUpResponse);

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€๋‹ค. ํด๋ผ์ด์–ธํŠธ๋‹จ์—์„œ๋„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  createUser๋Š” userService์— ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ƒ์„ฑ์ด ๋˜์—ˆ๋Š”์ง€ ์‹คํŒจํ•˜์˜€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 


๐Ÿ“„ userService.js

export async function createUser(userId, password, userName, phoneNumber, address, type, info) {
  const connection = await pool.getConnection(async (conn) => conn);
  try {
    const userIdCheckResult = await userIdCheck(userId);
    if (userIdCheckResult.length > 0) return ID_ALREADY_EXISTS; // id๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•  ๊ฒฝ์šฐ

    const hashedPassword = createHash('sha512').update(password).digest('hex');
    const params = [userId, hashedPassword, userName, phoneNumber, address, type, info];
    const createUserIdResult = await createUserAccount(connection, params);
    console.log(`์ถ”๊ฐ€๋œ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž Idx: ${createUserIdResult[0].insertId}, ID: ${userId}`);
    connection.release();
    return SIGNUP_SUCCESS;
  } catch (err) {
    console.log(err);
    return SERVER_CONNECT_ERROR;
  }
}

createUser ํ•จ์ˆ˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™” ํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. 

userDao์— ์žˆ๋Š” createUserAccount๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฉด ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰์‹œํ‚จ๋‹ค. 


๐Ÿ“„ userProvider.js

export async function userIdCheck(userId) {
  const connection = await pool.getConnection(async (conn) => conn);
  try {
    const userIdRow = await selectUserId(connection, userId);
    return userIdRow;
  } catch (err) {
  } finally {
    connection.release();
  }
}

userProvider์—์„œ๋Š” Id๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. 

 

์ด๋Ÿฌํ•œ ๋กœ์ง์„ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋œ๋‹ค. API ํ…Œ์ŠคํŠธ๋Š” Postman์„ ์‚ฌ์šฉํ•˜์—ฌ body๊ฐ’์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.