"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Node.js(Express.js)에서 백엔드 코드를 구성하는 방법

Node.js(Express.js)에서 백엔드 코드를 구성하는 방법

2024-08-25에 게시됨
검색:342

How to Structure Your Backend Code in Node.js (Express.js)

Express.js를 사용하여 Node.js 애플리케이션을 개발할 때 코드베이스를 효과적으로 구성하는 것은 유지 관리성, 확장성 및 협업 용이성을 위해 매우 중요합니다. 잘 구성된 프로젝트 구조를 통해 복잡성을 관리할 수 있으므로 코드를 더 쉽게 탐색하고 이해할 수 있습니다. 이 블로그에서는 Express.js 애플리케이션의 일반적인 폴더 구조를 살펴보고 각 디렉터리와 파일의 목적을 설명하겠습니다.

프로젝트 구조 개요
Express.js 애플리케이션의 일반적인 폴더 구조는 다음과 같습니다.

?
├── ? app.js
├── ? bin
├── ? config
├── ? controllers
│   ├── ? customer.js
│   ├── ? product.js
│   └── ...
├── ? middleware
│   ├── ? auth.js
│   ├── ? logger.js
│   └── ...
├── ? models
│   ├── ? customer.js
│   ├── ? product.js
│   └── ...
├── ? routes
│   ├── ? api.js
│   ├── ? auth.js
│   └── ...
├── ? public
│   ├── ? css
│   ├── ? js
│   ├── ? images
│   └── ...
├── ? views
│   ├── ? index.ejs
│   ├── ? product.ejs
│   └── ...
├── ? tests
│   ├── ? unit
│   ├── ? integration
│   ├── ? e2e
│   └── ...
├── ? utils
│   ├── ? validation.js
│   ├── ? helpers.js
│   └── ...
└── ? node_modules

각 디렉터리 및 파일 설명
app.js
app.js 파일은 애플리케이션의 진입점입니다. Express 앱을 초기화하고, 미들웨어를 설정하고, 경로를 정의하고, 서버를 시작하는 곳입니다. 웹 애플리케이션의 제어 센터라고 생각하세요.

const express = require('express');
const app = express();
const config = require('./config');
const routes = require('./routes');
// Middleware setup
app.use(express.json());
// Routes setup
app.use('/api', routes);
// Start server
const PORT = config.port || 3000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
module.exports = app;

큰 상자
bin 디렉토리에는 일반적으로 웹 서버를 시작하기 위한 스크립트가 포함되어 있습니다. 이러한 스크립트는 환경 변수를 설정하거나 다양한 환경(예: 개발, 프로덕션)을 관리하는 데 사용할 수 있습니다.

예: bin/www

#!/usr/bin/env node
const app = require('../app');
const debug = require('debug')('your-app:server');
const http = require('http');
const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
const server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {
  const port = parseInt(val, 10);
  if (isNaN(port)) return val;
  if (port >= 0) return port;
  return false;
}
function onError(error) {
  if (error.syscall !== 'listen') throw error;
  const bind = typeof port === 'string' ? 'Pipe '   port : 'Port '   port;
  switch (error.code) {
    case 'EACCES':
      console.error(bind   ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind   ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}
function onListening() {
  const addr = server.address();
  const bind = typeof addr === 'string' ? 'pipe '   addr : 'port '   addr.port;
  debug('Listening on '   bind);
}

구성
config 디렉터리에는 데이터베이스 연결, 서버 설정, 환경 변수 등 애플리케이션의 구성 파일이 들어 있습니다.

예: config/index.js

module.exports = {
  port: process.env.PORT || 3000,
  db: {
    host: 'localhost',
    port: 27017,
    name: 'mydatabase'
  }
};

컨트롤러
컨트롤러에는 들어오는 요청을 처리하고 응답을 생성하기 위한 논리가 포함되어 있습니다. 컨트롤러 디렉터리의 각 파일은 일반적으로 애플리케이션의 다른 부분(예: 고객, 제품)에 해당합니다.

예: 컨트롤러/customer.js

const Customer = require('../models/customer');
exports.getAllCustomers = async (req, res) => {
  try {
    const customers = await Customer.find();
    res.json(customers);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
};

미들웨어
미들웨어 기능은 요청이 컨트롤러에 도달하기 전에 요청을 처리하는 데 사용됩니다. 인증, 로깅, 요청 유효성 검사와 같은 작업을 처리할 수 있습니다.

예: middleware/auth.js

module.exports = (req, res, next) => {
  const token = req.header('Authorization');
  if (!token) return res.status(401).json({ message: 'Access Denied' });
  try {
    const verified = jwt.verify(token, process.env.JWT_SECRET);
    req.user = verified;
    next();
  } catch (err) {
    res.status(400).json({ message: 'Invalid Token' });
  }
};

모델
모델은 데이터 구조를 정의하고 데이터베이스와의 상호 작용을 처리합니다. 각 모델 파일은 일반적으로 서로 다른 데이터 엔터티(예: 고객, 제품)에 해당합니다.

예: models/customer.js

const mongoose = require('mongoose');
const customerSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
});
module.exports = mongoose.model('Customer', customerSchema);

경로
경로는 애플리케이션의 여러 부분에 대한 경로를 정의하고 이를 적절한 컨트롤러에 매핑합니다.

예: 경로/api.js

const express = require('express');
const router = express.Router();
const customerController = require('../controllers/customer');
router.get('/customers', customerController.getAllCustomers);
module.exports = router;

공공의
공용 디렉토리에는 클라이언트에 직접 제공되는 CSS, JavaScript 및 이미지와 같은 정적 파일이 포함되어 있습니다.

예: 디렉터리 구조

public/
├── css/
├── js/
├── images/

조회수
뷰는 클라이언트를 위해 HTML을 렌더링하는 템플릿입니다. EJS, Pug 또는 Handlebars와 같은 템플릿 엔진을 사용하면 동적 HTML을 생성할 수 있습니다.

예: views/index.ejs



  My App

Welcome to My App

테스트
테스트 디렉터리에는 애플리케이션이 올바르게 작동하는지 확인하는 테스트 파일이 포함되어 있습니다. 테스트는 단위 테스트, 통합 테스트, 엔드투엔드(e2e) 테스트로 구성되는 경우가 많습니다.

예: 디렉터리 구조

tests/
├── unit/
├── integration/
├── e2e/

유틸리티
유틸리티 기능과 도우미 모듈은 utils 디렉터리에 저장됩니다. 이러한 기능은 애플리케이션 전체에서 사용되는 유효성 검사 및 서식 지정과 같은 일반적인 작업을 수행합니다.

예: utils/validation.js

exports.isEmailValid = (email) => {
  const re = /^[^\s@] @[^\s@] \.[^\s@] $/;
  return re.test(String(email).toLowerCase());
};

노드_모듈
node_modules 디렉터리에는 프로젝트에 필요한 모든 종속성이 포함되어 있습니다. 이 디렉토리는 npm(또는 Yarn)에 의해 관리되며 npm 레지스트리에서 설치된 패키지를 포함합니다.

결론
Express.js를 사용하는 잘 구조화된 Node.js 애플리케이션은 유지 관리성, 확장성 및 협업을 향상시킵니다. 구조의 각 디렉터리와 파일은 구성 처리 및 경로 정의부터 미들웨어 관리 및 뷰 렌더링에 이르기까지 특정 목적을 수행합니다. 코드베이스를 효과적으로 구성하면 강력하고 확장 가능한 애플리케이션을 쉽게 구축할 수 있습니다.

릴리스 선언문 이 기사는 https://dev.to/kafeel_ahmad/how-to-structure-your-backend-code-in-nodejs-expressjs-2e07?1에서 복제됩니다. 침해가 있는 경우, [email protected]에 문의하십시오. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3