### 최상위 구조
최상위 디렉토리는 프로젝트의 전반적인 구조와 흐름을 이해하기 쉽게 만들어야 합니다. 다음은 기본적인 최상위 구조 예시입니다:
```
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 애플리케이션을 현대적이고 체계적으로 유지할 수 있으며, 기업 환경을 포함한 다양한 개발 환경에서 개발자들이 효율적으로 협업할 수 있도록 합니다.