[NodeJS] νλ‘μ νΈ ν΄λ ꡬ쑰 λ§λ€κΈ°
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 & 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}`);
});
νλ‘μ νΈλ₯Ό μ§ννλ©΄μ λ§μ λΆλΆλ€μ λ°°μ°κ³ κΉλ¨Ήμλ λΆλΆλ€λ λ€μ 곡λΆνκ² λλ€. μ λλ‘ λ νλ‘μ νΈλ₯Ό μ§ν νλλ‘ λ Έλ ₯ν κ²μ΄λ€.