🧩 1. 서버 기본 구조 패턴
// 🧱 기본 Express 서버 패턴
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello Express!');
});
app.listen(PORT, () => {
console.log(`${PORT}번 포트에서 서버 실행 중`);
});
패턴 핵심 정리
- express() : 서버 객체 생성
- app.get('/', callback) : 요청 라우팅 (경로와 콜백 연결)
- res.send() : 클라이언트로 응답 전송
- app.listen() : 서버 구동
실험해볼 것
- res.send() 대신 res.json() 쓰면 결과가 어떻게 달라지는가?
- 포트를 8080으로 바꾸면 접근 URL은 어떻게 되나?
🛣 2. 라우터 분리 패턴
// routes/user.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.send('User list');
});
router.post('/', (req, res) => {
res.send('User created');
});
module.exports = router;
// app.js
const express = require('express');
const app = express();
const userRouter = require('./routes/user');
app.use('/users', userRouter);
패턴 핵심 정리
- express.Router() : 라우팅 전용 객체 생성
- module.exports : 라우터 외부로 내보내기
- app.use('/경로', router) : 경로 접두어 붙여 등록
기억 포인트
라우터 파일 하나는 “하나의 기능 단위(사용자, 게시글 등)” 담당한다.
🗂 3. 미들웨어 패턴
// 공통 로그 미들웨어 예시
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 다음 미들웨어로 이동
});
패턴 핵심 정리
- app.use() : 모든 요청에 대해 미들웨어 실행
- next() : 다음 미들웨어 또는 라우터로 제어 이동
- next('route') : 현재 라우터 건너뛰기
실험해볼 것
- next()를 안 쓰면 요청이 멈추는 이유는?
- 특정 경로(/api)에만 적용하려면 어떻게 할까?
💾 4. Sequelize (DB 연결) 패턴
// models/index.js
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('db_name', 'user', 'password', {
host: 'localhost',
dialect: 'mysql',
});
sequelize.authenticate()
.then(() => console.log('DB 연결 성공'))
.catch(err => console.error('DB 연결 실패:', err));
module.exports = sequelize;
패턴 핵심 정리
- new Sequelize(database, user, password, config) : 연결 설정
- sequelize.authenticate() : 연결 테스트
- 모델 정의 시 sequelize.define('User', {...}) 사용
기억 포인트
- 연결은 한 번만 설정하고 여러 모델이 공유한다.
🧠 5. 모델(Model) 정의 패턴
// models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('./index');
const User = sequelize.define('User', {
name: { type: DataTypes.STRING, allowNull: false },
age: { type: DataTypes.INTEGER },
});
module.exports = User;
패턴 핵심 정리
- sequelize.define() : 테이블 구조 정의
- DataTypes : 자료형 지정
- allowNull : null 허용 여부
🌐 6. REST API 패턴
HTTP 메서드의미예시
| GET | 데이터 조회 | /users |
| POST | 새 데이터 생성 | /users |
| PUT | 전체 수정 | /users/:id |
| PATCH | 일부 수정 | /users/:id |
| DELETE | 삭제 | /users/:id |
패턴 예시
router.get('/', getUsers);
router.post('/', createUser);
router.put('/:id', updateUser);
router.delete('/:id', deleteUser);
기억 포인트
- URI는 명사, 동사는 HTTP 메서드로 표현한다.
- 응답은 항상 JSON으로 반환하는 게 RESTful 관례.
🧩 7. 오류 처리 & 예외 패턴
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('서버 에러 발생');
});
패턴 핵심 정리
- 에러 미들웨어는 4개의 인자 (err, req, res, next)
- res.status(코드).send(메시지) : 상태코드와 함께 응답
- 위쪽에서 throw new Error() 하면 여기서 잡힘
📜 8. 전체 구조 기억용 요약
프로젝트 구조 예시
📁 myapp
┣ 📁 routes
┃ ┗ user.js
┣ 📁 models
┃ ┣ index.js
┃ ┗ User.js
┣ app.js
┗ package.json
흐름 요약
- app.js → 서버 실행
- app.use('/users', userRouter) → 요청 전달
- userRouter → DB 접근 (모델 사용)
- Sequelize → MySQL과 통신
- 결과를 JSON으로 응답
'Backend' 카테고리의 다른 글
| 크리스마스 시즌 웹사이트를 만들었는데 (0) | 2025.11.17 |
|---|---|
| Express 미들웨어 (0) | 2025.10.04 |
| 자유 게시판 (0) | 2025.09.29 |