πŸ’» BackEnd/🟩 NodeJS

[NodeJS] ν”„λ‘œμ νŠΈ 폴더 ꡬ쑰 λ§Œλ“€κΈ°

Dbswnstjd 2022. 3. 23. 03:39

Lends Project

μ΄λ²ˆμ— 렌즈 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ NodeJS ν…œν”Œλ¦Ώμ„ λ§Œλ“€κ²Œ λ˜μ—ˆλ‹€. 

μ–΄λ–»κ²Œ ν•˜λ©΄ 더 쒋은 폴더ꡬ쑰λ₯Ό λ§Œλ“€μ§€ κ³ λ―Ό ν•˜λ‹€κ°€ μ—¬λŸ¬κ°€μ§€ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•˜μ—¬ λ§Œλ“€μ—ˆλ‹€. 

기쑴의 ν…œν”Œλ¦Ώμ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜μ—¬λ„ λ˜μ§€λ§Œ λ³΅μŠ΅λ„ ν•  κ²Έ 직접 λ§Œλ“€λ©΄μ„œ 곡뢀도 ν•˜κ²Œ λ˜λ‹ˆ 더 도움이 된 것 κ°™λ‹€.


폴더 ꡬ쑰

πŸ“‚ server
    πŸ“‚ config
    β”œβ”€β”€ πŸ“„ baseResponseStatus.js
    β”œβ”€β”€ πŸ“„ database.js  
    β”œβ”€β”€ πŸ“„ express.js
    β”œβ”€β”€ πŸ“„ jwtMiddleware.js
    β”œβ”€β”€ πŸ“„ response.js
    πŸ“‚ src
    └── πŸ“‚ app           				
        β”œβ”€β”€ πŸ“‚ User          		
        |    β”œβ”€β”€ πŸ“„ userController.js          	
        |    β”œβ”€β”€ πŸ“„ userDao.js 		
        |    β”œβ”€β”€ πŸ“„ userProvider.js   		
        |    β”œβ”€β”€ πŸ“„ userRoute.js   		 
        |    └── πŸ“„ userService.js   	 
    πŸ“„ .gitignore                     		
    πŸ“„ app.js
    πŸ“„ server.js
    πŸ“„ package.json                      
    πŸ“„ README.md

ν˜„μž¬ μ™„λ²½ν•˜κ²Œ κ΅¬μ„±λœ 폴더 κ΅¬μ‘°λŠ” μ•„λ‹ˆμ§€λ§Œ 점차 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ°”λ€ŒλŠ” λΆ€λΆ„μ΄λ‚˜ μƒˆλ‘œμš΄ 뢀뢄듀을 μΆ”κ°€ν•  μ˜ˆμ •μ΄λ‹€. 


폴더 ꡬ쑰 μ„€λͺ…

    πŸ“‚ config
    β”œβ”€β”€ πŸ“„ baseResponseStatus.js
    β”œβ”€β”€ πŸ“„ database.js  
    β”œβ”€β”€ πŸ“„ express.js
    β”œβ”€β”€ πŸ“„ jwtMiddleware.js
    β”œβ”€β”€ πŸ“„ response.js

πŸ“‚ Config 

μ„€μ •κ³Ό κ΄€λ ¨λœ νŒŒμΌλ“€μ΄ λ“€μ–΄ μžˆλŠ” 폴더이닀. 


πŸ“„ baseResponseStatus.js / πŸ“„ response.js

module.exports = {
  // Success
  SUCCESS: { isSuccess: true, code: 1000, message: '성곡' },

  TOKEN_EMPTY: { isSuccess: false, code: 2000, message: 'JWT 토큰을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' },
  TOKEN_VERIFICATION_FAILURE: { isSuccess: false, code: 3000, message: 'JWT 토큰 검증 μ‹€νŒ¨' },
  TOKEN_VERIFICATION_SUCCESS: { isSuccess: true, code: 1001, message: 'JWT 토큰 검증 성곡' },

  // User Response
  NICKNAME_EMPTY: { isSuccess: false, code: 2000, message: 'λ‹‰λ„€μž„(Id)을 μž…λ ₯ν•˜μ„Έμš”.' },
  PASSWORD_EMPTY: { isSuccess: false, code: 2001, message: 'λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•˜μ„Έμš”.' },
  SIGNIN_NICKNAME_WRONG: { isSuccess: false, code: 2002, message: 'μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ‹‰λ„€μž„μž…λ‹ˆλ‹€.' },
  PASSWORD_WRONG: { isSuccess: false, code: 2003, message: 'λΉ„λ°€λ²ˆν˜Έκ°€ λ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.' },
  SIGNUP_VERIFIEDPASSWORD_EMPTY: { isSuccess: false, code: 2004, message: 'λΉ„λ°€λ²ˆν˜Έ 확인을 μž…λ ₯ν•˜μ„Έμš”.' },
  SIGNUP_NAME_EMPTY: { isSuccess: false, code: 2005, message: '이름을 μž…λ ₯ν•˜μ„Έμš”.' },
  SIGNUP_REDUNDANT_EMAIL: { isSuccess: false, code: 2006, message: 'μ‘΄μž¬ν•˜λŠ” λ‹‰λ„€μž„(Id)μž…λ‹ˆλ‹€.' },
  UPDATE_ERROR_TYPE: { isSuccess: false, code: 2007, message: '잘λͺ»λœ ν˜•μ‹ μž…λ‹ˆλ‹€.' },

  // DB Error
  SERVER_CONNECT_ERROR: { isSuccess: false, code: 3000, message: 'μ„œλ²„ 접속 μ—λŸ¬μž…λ‹ˆλ‹€.' },

  // Profile Response
  LOGIN_ERROR: { isSuccess: false, code: 3000, message: 'μ΄μš©ν•˜λ €λ©΄ 둜그인 ν•˜μ„Έμš”' },
};

ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ responseλ₯Ό 보낼 λ•Œ μ‚¬μš© 될 파일

아직 μ‹œμž‘λ‹¨κ³„μ΄κΈ° λ•Œλ¬Έμ— λ‹Ήμž₯ ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€. 


πŸ“„ database.js 

const mysql = require('mysql2/promise'); // async await
require('dotenv').config();

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  port: process.env.DB_PORT,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  multipleStatements: true,
});

module.exports = {
  pool: pool,
};

데이터 데이슀 κ΄€λ ¨ 섀정을 κ΄€λ¦¬ν•˜λŠ” 파일


πŸ“„ express.js

const express = require('express');
const router = express.Router();

router.use('/api/user', require('../src/app/user/userRoute'));
// router.use('/api/product', require('./product'));

module.exports = router;

λΌμš°νŒ…μ„ 관리할 파일. 

이 λΆ€λΆ„μ—μ„œ λ§Žμ€ μ‹œκ°„μ„ μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλŠ”λ° λΌμš°νŒ…μ΄ μ–΄λ–€ 건지 잘 λͺ°λžκ³  userRouteμ—μ„œλ„ route 처리λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— 이 파일이 ν•„μš” μ—†λ‹€κ³  μƒκ°ν•˜μ˜€μ§€λ§Œ κΌ­ ν•„μš”ν•œ νŒŒμΌμ΄λ‹€.

λΌμš°νŠΈμ— λŒ€ν•΄ 더 곡뢀λ₯Ό ν•΄μ•Ό ν•  것 κ°™λ‹€. 


   πŸ“„ jwtMiddleware.js

아직 μž‘μ„±ν•˜μ§€ μ•Šμ€ jwtMiddleware 파일

둜그인 κ΅¬ν˜„μ„ jwtλ₯Ό μ΄μš©ν•˜μ—¬ ν•  것이기 λ•Œλ¬Έμ— jwt 미듀웨어가 ν•„μˆ˜μ μ΄λ‹€. 토큰 검증 및 확인을 이 νŒŒμΌμ—μ„œ 진행할 μ˜ˆμ •μ΄λ‹€. 


πŸ“‚ Src / app 폴더

    πŸ“‚ src
    └── πŸ“‚ app           				
        β”œβ”€β”€ πŸ“‚ User          		
        |    β”œβ”€β”€ πŸ“„ userController.js          	
        |    β”œβ”€β”€ πŸ“„ userDao.js 		
        |    β”œβ”€β”€ πŸ“„ userProvider.js   		
        |    β”œβ”€β”€ πŸ“„ userRoute.js   		 
        |    └── πŸ“„ userService.js

ν˜„μž¬λŠ” APIλ₯Ό λ§Œλ“€μ§€ μ•Šμ•˜μ§€λ§Œ μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό κ°–κ²Œ 될 것이닀.

Controller / Service / Dao

μ§€κΈˆμ€ Controller / Service & Provider / Dao 둜 λ‚˜λˆ„μ–΄μ„œ 진행을 ν•  μ˜ˆμ •μΈλ° Service 와 Provider λ₯Ό ν•˜λ‚˜μ˜ νŒŒμΌμ—μ„œ 관리 ν•  것인지 κ³ λ―Όν•΄ λ³Ό 것이닀.  


πŸ“„ userRoute.js

μ΄μ „μ˜ config -> express.js νŒŒμΌμ—μ„œ μ‚¬μš©λœ 라우트λ₯Ό μ΄μš©ν•΄ userRouteμ—μ„œ λΌμš°νŒ…μ„ κ±Έμ–΄μ€€λ‹€.

const express = require('express');
const router = express.Router();

const userController = require('./userController');

// router.get('/signUp', userController.postUser);

module.exports = router;

 


πŸ“„ userController.js

Controller - 이메일 체크, λΉ„λ°€λ²ˆν˜Έ 체크와 같은 것을 μ²˜λ¦¬ν•  파일

πŸ“„ userService.js / πŸ“„ userProvider.js

Serviec & Provider - μ„œλΉ„μŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 파일

πŸ“„ userDao.js

Dao - 데이터 베이슀의 쿼리문을 μž‘μ„±ν•˜λŠ” 파일 


μ‹œμž‘ 파일

πŸ“„ app.js

const express = require('express');
const app = express();
const dotenv = require('dotenv');
const methodOverride = require('method-override');
const logger = require('morgan');
const routes = require('./config/express');

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

    dotenv.config();

    this.setMiddleWare();

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

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

    this.app.use(methodOverride());
  }
  getRouting() {
    this.app.use(routes);
  }
}

module.exports = new App().app;

App 객체λ₯Ό μƒμ„±ν•˜μ—¬ app 관리


πŸ“„ index.js

const app = require('./app.js');
const port = process.env.PORT || 5000;

app.listen(port, () => {
  console.log(`Listening on port ${port}`);
});

 

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ λ§Žμ€ 뢀뢄듀을 배우고 κΉŒλ¨Ήμ—ˆλ˜ 뢀뢄듀도 λ‹€μ‹œ κ³΅λΆ€ν•˜κ²Œ λœλ‹€. μ œλŒ€λ‘œ 된 ν”„λ‘œμ νŠΈλ₯Ό 진행 ν•˜λ„λ‘ λ…Έλ ₯ν•  것이닀.