본문 바로가기

nodejs

Node.js Express 노드JS 익스프레스 시작하기

728x90

Node.js Express 노드JS 익스프레스 시작하기

 

 

- npm을 통해 Express를 설치합니다.

npm install express

그럼 자동으로 node_modules폴더와 package.json, package-lock.json이 생깁니다.

 

 

- 기본 폴더 구조

project/
│
├── node_modules/       # npm으로 설치한 외부 패키지들이 저장되는 폴더입니다.
├── src/                # 소스 코드가 위치하는 주요 폴더입니다
│   ├── controllers/    # 요청을 처리하고 응답을 생성하는 컨트롤러 파일들이 위치합니다.
│   ├── models/         # 데이터 모델과 관련된 파일들이 위치합니다.
│   ├── routes/         # 라우팅 설정 파일들이 위치합니다.
│   ├── services/       # 비즈니스 로직을 처리하는 서비스 파일들이 위치합니다.
│   └── utils/          # 유틸리티 함수들이 모여 있습니다.
│   └── app.js          # 애플리케이션의 주 진입점입니다.
├── tests/              # 단위 테스트, 통합 테스트 등 테스트 관련 파일들이 위치합니다.
├── public/             # 정적 파일들(CSS, JavaScript, 이미지 등)이 위치합니다.
│   ├── css/            # CSS 파일이 위치합니다.
│   ├── js/             # JavaScript 파일이 위치합니다.
│   └── images/         # 이미지 파일이 위치합니다.
│   └── videos/         # 동영상 파일이 위치합니다.
├── views/              # 템플릿 엔진을 사용할 경우, 뷰 파일들이 위치합니다.
├── config/             # 설정 파일들이 위치합니다.
├── package.json        # 프로젝트의 메타데이터와 의존성 정보가 포함된 파일입니다.
├── package-lock.json   # 의존성 트리의 정확한 버전을 기록하는 파일입니다.
├── .env                # 환경 변수 설정 파일입니다.
└── README.md           # 프로젝트에 대한 설명과 사용 방법 등을 기술하는 파일입니다.

 

 

- Node.js 프로젝트의 구조와 각 파일의 기본 로직 1

src/app.js

const express = require('express');
const dotenv = require('dotenv');
const routes = require('./routes');

dotenv.config();

const app = express();

app.use(express.json());
app.use('/api', routes);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

 

src/routes/userRoutes.js

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

const router = express.Router();

router.get('/users', userController.getUsers);
router.post('/users', userController.createUser);

module.exports = router;

 

src/controllers/userController.js

const userService = require('../services/userService');

exports.getUsers = async (req, res) => {
  try {
    const users = await userService.getUsers();
    res.json(users);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

exports.createUser = async (req, res) => {
  try {
    const user = await userService.createUser(req.body);
    res.status(201).json(user);
  } catch (error) {
    res.status(400).json({ message: error.message });
  }
};

 

src/services/userService.js

const User = require('../models/user');

exports.getUsers = async () => {
  return await User.find();
};

exports.createUser = async (userData) => {
  const user = new User(userData);
  return await user.save();
};

 

src/models/user.js

const mongoose = require('mongoose');

const userSchema = 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('User', userSchema);

 

src/utils/logger.js

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}

module.exports = logger;

 

config/database.js

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGO_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true
    });
    console.log('MongoDB connected');
  } catch (error) {
    console.error('MongoDB connection error:', error);
    process.exit(1);
  }
};

module.exports = connectDB;

 

.env

PORT=3000
MONGO_URI=mongodb://localhost:27017/myapp
NODE_ENV=development

 

 

 

- Node.js 프로젝트의 구조와 각 파일의 기본 로직 2

src/app.js

// src/app.js

require('dotenv').config();
const express = require('express');
const app = express();
const routes = require('./routes');
const connectDB = require('../config/database');

// 데이터베이스 연결
connectDB();

// 미들웨어 설정
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 정적 파일 제공
app.use(express.static('public'));

// 라우팅 설정
app.use('/', routes);

// 오류 처리 미들웨어
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('서버 오류가 발생했습니다.');
});

// 서버 시작
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`서버가 ${PORT} 포트에서 실행 중입니다.`);
});

 

src/routes/index.js

// src/routes/index.js

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

router.use('/users', userRoutes);

module.exports = router;

 

src/routes/userRoutes.js

// src/routes/userRoutes.js

const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.getAllUsers);
router.post('/', userController.createUser);

module.exports = router;

 

src/controllers/userController.js

// src/controllers/userController.js

const userService = require('../services/userService');

exports.getAllUsers = async (req, res) => {
  try {
    const users = await userService.getAllUsers();
    res.json(users);
  } catch (err) {
    res.status(500).send(err.message);
  }
};

exports.createUser = async (req, res) => {
  try {
    const newUser = await userService.createUser(req.body);
    res.status(201).json(newUser);
  } catch (err) {
    res.status(500).send(err.message);
  }
};

 

src/services/userService.js

// src/services/userService.js

const User = require('../models/User');

exports.getAllUsers = async () => {
  return await User.find();
};

exports.createUser = async (userData) => {
  const user = new User(userData);
  return await user.save();
};

 

src/models/user.js

// src/models/User.js

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true },
  password: { type: String, required: true },
  createdAt: { type: Date, default: Date.now },
});

module.exports = mongoose.model('User', userSchema);

 

src/utils/validator.js

// src/utils/validator.js

exports.validateEmail = (email) => {
  const re = /\S+@\S+\.\S+/;
  return re.test(email);
};

 

config/database.js

// config/database.js

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('MongoDB에 연결되었습니다.');
  } catch (err) {
    console.error(err.message);
    process.exit(1);
  }
};

module.exports = connectDB;

 

.env

PORT=3000
MONGODB_URI=mongodb://localhost:27017/mydatabase

 

 

==========

==========

 

 

728x90