─━ IT ━─

Node.js 프로젝트를 위한 최적화된 디렉토리 구조 설계

DKel 2024. 11. 2. 15:55
반응형
Node.js로 애플리케이션을 개발할 때, 효율적인 디렉토리 구조를 사용하는 것은 유지보수성과 확장성에 크게 기여합니다. 잘 조직된 구조는 팀 내의 개발자들 간의 협업을 용이하게 하고, 코드의 이해도를 높이며, 프로젝트의 복잡도를 감소시킵니다. 여기서는 실용적인 Node.js 디렉토리 구조를 제안하고, 각 디렉토리의 목적과 예시 코드를 함께 설명합니다.

 
### 최상위 구조
 
최상위 디렉토리는 프로젝트의 전반적인 구조와 흐름을 이해하기 쉽게 만들어야 합니다. 다음은 기본적인 최상위 구조 예시입니다:
 
```
my-nodejs-app/
│   README.md
│   package.json
│   .gitignore
│   app.js
└───src/
└───config/
└───controllers/
└───models/
└───routes/
└───services/
└───middlewares/
└───utils/
└───tests/
```
 
- `README.md`: 프로젝트에 대한 설명서입니다.
- `package.json`: 프로젝트의 메타데이터를 포함하며, 종속성 목록도 포함합니다.
- `.gitignore`: Git에서 무시할 파일과 디렉토리 목록입니다.
- `app.js`: 애플리케이션의 진입점입니다.
 
### src 디렉토리
 
`src` 디렉토리는 실제 코드가 포함되는 주요 디렉토리입니다. 이곳에는 애플리케이션의 핵심 로직이 배치됩니다. 대신 직접 사용도 좋지만, 대부분의 Node.js 프로젝트에서는 그 범위가 작은 경우 생략도 가능합니다.
 
예시:
- `src/index.js`
 
```javascript
import express from 'express';
import routes from './routes';
 
const app = express();
const PORT = process.env.PORT || 3000;
 
app.use(express.json());
app.use('/api', routes);
 
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});
```
 
### config 디렉토리
 
이 디렉토리에는 데이터베이스 설정, API 키, 포트 등과 같은 환경 설정 파일이 포함됩니다. 환경 변수를 사용하여 민감한 정보를 관리할 수 있습니다.
 
예시:
- `config/db.config.js`
 
```javascript
module.exports = {
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'mydb',
};
```
 
### controllers 디렉토리
 
이 디렉토리에는 비즈니스 로직과 데이터 처리가 포함된 제어 로직이 있는 파일이 위치합니다. 각 모델 또는 기능별로 하나의 컨트롤러 파일을 만듭니다.
 
예시:
- `controllers/userController.js`
 
```javascript
import User from '../models/userModel';
 
export const getAllUsers = async (req, res) => {
    try {
        const users = await User.findAll();
        res.json(users);
    } catch (error) {
        res.status(500).send(error.message);
    }
};
```
 
### models 디렉토리
 
애플리케이션의 데이터 구조를 정의하는 파일들이 포함됩니다. 각 모델은 데이터베이스 테이블에 해당하며, ORM을 이용한 정의가 주로 사용됩니다.
 
예시:
- `models/userModel.js`
 
```javascript
import { DataTypes } from 'sequelize';
import sequelize from '../config/db.config';
 
const User = sequelize.define('User', {
    // 필드 정의
    username: {
        type: DataTypes.STRING,
        allowNull: false,
    },
    email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
    }
});
 
export default User;
```
 
### routes 디렉토리
 
이 디렉토리에는 경로와 관련된 모든 것이 포함됩니다. 각 엔드포인트에 대한 라우트 정의를 포함하여 애플리케이션의 요청 라우터 역할을 합니다.
 
예시:
- `routes/userRoutes.js`
 
```javascript
import express from 'express';
import { getAllUsers } from '../controllers/userController';
 
const router = express.Router();
 
router.get('/users', getAllUsers);
 
export default router;
```
 
### services 디렉토리
 
서비스 레이어에는 외부 API 통신, 파일 입출력 등 비즈니스 로직을 수행하는 데 필요한 추가 작업이 포함됩니다.
 
예시:
- `services/emailService.js`
 
```javascript
import nodemailer from 'nodemailer';
 
// 이메일 송신 설정 및 함수들
export const sendEmail = async (to, subject, text) => {
    const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: 'your-email@gmail.com',
            pass: 'your-email-password',
        },
    });
 
    const mailOptions = {
        from: 'your-email@gmail.com',
        to,
        subject,
        text,
    };
 
    try {
        await transporter.sendMail(mailOptions);
        console.log('Email sent successfully');
    } catch (error) {
        console.error('Error sending email:', error);
    }
};
```
 
### middlewares 디렉토리
 
이 디렉토리에는 요청과 응답을 처리하는 미들웨어가 포함됩니다. 인증, 로깅 등 요청 전후 처리를 위한 미들웨어가 주로 위치합니다.
 
예시:
- `middlewares/authMiddleware.js`
 
```javascript
export const authenticate = (req, res, next) => {
    // 인증 로직
    const token = req.header('Authorization');
    if (!token) {
        return res.status(401).send('Access Denied');
    }
    // 토큰 검증 로직 추가
    next();
};
```
 
### utils 디렉토리
 
유틸리티 함수들이 포함된 디렉토리로, 범용적이고 재사용 가능한 코드 조각들을 포함합니다.
 
예시:
- `utils/logger.js`
 
```javascript
export const log = (message) => {
    console.log(`[${new Date().toISOString()}] ${message}`);
};
```
 
### tests 디렉토리
 
이 디렉토리에는 모든 테스트 관련 코드가 있습니다. 각 기능 또는 엔드포인트에 대한 테스트를 포함하여 안정성을 확인합니다.
 
예시:
- `tests/user.test.js`
 
```javascript
import request from 'supertest';
import app from '../src/index';
 
describe('GET /users', () => {
    it('should return all users', async () => {
        const res = await request(app).get('/api/users');
        expect(res.statusCode).toEqual(200);
        expect(res.body).toHaveProperty('users');
    });
});
```
 
이와 같은 구조를 사용함으로써, Node.js 애플리케이션을 현대적이고 체계적으로 유지할 수 있으며, 기업 환경을 포함한 다양한 개발 환경에서 개발자들이 효율적으로 협업할 수 있도록 합니다.

반응형