Express는 Node.js에서 가장 인기 있는 웹 애플리케이션 프레임워크 중 하나로, RESTful API와 서버 측 애플리케이션을 쉽게 구축할 수 있도록 도와줍니다. 이번 강좌에서는 Express의 중첩 라우터 기능과 이를 통해 라우팅 구조를 효율적으로 관리하는 방법에 대해 심도 있게 다루어 보겠습니다.
1. Express 및 라우터 개요
Express는 간결하고 유연한 API를 제공하여 서버 사이드 개발을 수월하게 해줍니다. 라우터(router)는 특정 URL 경로에 대한 HTTP 요청을 처리하는 미들웨어의 집합체를 의미합니다. 중첩 라우터는 이러한 라우터를 조합하여 보다 복잡한 라우팅 구조를 만들어낼 수 있습니다.
1.1 Express 설치하기
Express를 사용하기 위해 먼저 Node.js가 설치되어 있어야 합니다. 다음 명령어를 통해 Express를 설치할 수 있습니다.
npm init -y
npm install express
2. 기본 라우터 설정
Express 애플리케이션을 설정한 후, 먼저 기본적인 라우팅부터 시작해보겠습니다. 아래 코드는 간단한 Express 애플리케이션을 설정하고 기본적인 라우트를 정의하는 예시입니다.
const express = require('express');
const app = express();
const PORT = 3000;
// 기본 라우트 설정
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
// 서버 시작
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT}에서 실행 중입니다.`);
});
3. 중첩 라우터란?
중첩 라우터는 하나의 라우터 안에 또 다른 라우터를 포함시키는 방식입니다. 이는 주로 조직적인 라우팅 구조가 필요할 때 사용됩니다. 예를 들어, 사용자 관리와 같은 기능을 따로 모듈화하여 관리할 수 있습니다.
3.1 중첩 라우터 생성하기
중첩 라우터를 만들기 위해서는 별도의 라우터를 생성한 후, 이를 기존의 라우터에 추가하는 방법을 사용합니다. 다음은 사용자 관련 라우터를 만들고 이를 메인 라우터에 추가하는 예시입니다.
const express = require('express');
const app = express();
const userRouter = express.Router();
userRouter.get('/', (req, res) => {
res.send('사용자 리스트 출력');
});
userRouter.get('/:id', (req, res) => {
res.send(`사용자 ID: ${req.params.id}`);
});
// 메인 라우터에 중첩 라우터 추가
app.use('/users', userRouter);
// 서버 시작
app.listen(3000, () => {
console.log('서버가 http://localhost:3000에서 실행 중입니다.');
});
4. 라우팅 구조 관리
중첩 라우터를 사용하면 애플리케이션의 구조를 명확하게 관리할 수 있습니다. 아래는 다양한 라우팅 구조를 관리하는 예시입니다. 각 기능별로 라우터를 나누어 더욱 조직적인 구조를 만들어보겠습니다.
4.1 프로젝트 디렉토리 구조
다음과 같이 폴더 구조를 설계할 수 있습니다:
my-express-app/
├── app.js
├── routes/
│ ├── userRoutes.js
│ └── productRoutes.js
└── package.json
4.2 사용자 및 제품 라우터 구현
이제 사용자와 제품 관련 라우터를 각각 만들고 이를 메인 애플리케이션 파일에서 사용할 수 있도록 설정합니다.
// routes/userRoutes.js
const express = require('express');
const userRouter = express.Router();
userRouter.get('/', (req, res) => {
res.send('사용자 리스트 출력');
});
userRouter.get('/:id', (req, res) => {
res.send(`사용자 ID: ${req.params.id}`);
});
module.exports = userRouter;
// routes/productRoutes.js
const express = require('express');
const productRouter = express.Router();
productRouter.get('/', (req, res) => {
res.send('제품 리스트 출력');
});
productRouter.get('/:id', (req, res) => {
res.send(`제품 ID: ${req.params.id}`);
});
module.exports = productRouter;
// app.js
const express = require('express');
const app = express();
const userRouter = require('./routes/userRoutes');
const productRouter = require('./routes/productRoutes');
app.use('/users', userRouter);
app.use('/products', productRouter);
app.listen(3000, () => {
console.log('서버가 http://localhost:3000에서 실행 중입니다.');
});
5. 라우터 미들웨어
Express에서는 미들웨어를 사용하여 요청과 응답 객체를 처리할 수 있습니다. 라우터 미들웨어는 특정 경로에 대한 요청을 처리하고, 해당 요청에 대한 응답을 생성합니다. 아래는 미들웨어의 사용 예시입니다.
userRouter.use((req, res, next) => {
console.log('사용자 관련 요청 처리 중...');
next(); // 다음 미들웨어로 넘어갑니다
});
6. 파라미터 및 쿼리 문자열
Express에서는 URL 파라미터와 쿼리 문자열을 손쉽게 다룰 수 있습니다. URL 파라미터는 특정 경로를 따라 전달되는 값이고, 쿼리 문자열은 `?` 뒤에 위치하는 키-값 쌍입니다. 예를 들어 `/users/1?sort=name`에서 `1`은 사용자 ID, `sort=name`은 쿼리 문자열입니다.
6.1 파라미터 예시
userRouter.get('/:id', (req, res) => {
const userId = req.params.id;
res.send(`사용자 ID: ${userId}`);
});
6.2 쿼리 문자열 예시
userRouter.get('/', (req, res) => {
const sort = req.query.sort || 'default';
res.send(`사용자 리스트, 정렬 기준: ${sort}`);
});
7. 에러 처리
에러 처리 미들웨어를 사용하면 문제가 발생했을 때 일정한 방식으로 오류를 처리할 수 있습니다. 다음은 에러 처리 미들웨어의 예시입니다.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('문제가 발생했습니다!');
});
8. 최적화된 라우팅 구조
중첩 라우터를 사용하면 애플리케이션의 라우팅 구조를 최적화할 수 있습니다. 여러 하위 라우터를 가져와 메인 애플리케이션이 모든 라우트를 관리하게 하여 코드의 가독성과 유지보수성을 높일 수 있습니다.
8.1 예제: 최적화된 구조
아래는 최적화된 라우팅 구조의 예시입니다.
const express = require('express');
const app = express();
const userRouter = require('./routes/userRoutes');
const productRouter = require('./routes/productRoutes');
app.use('/users', userRouter);
app.use('/products', productRouter);
app.listen(3000, () => {
console.log('서버가 http://localhost:3000에서 실행 중입니다.');
});
9. 결론
이번 강좌에서는 Express의 중첩 라우터 및 라우팅 구조 관리 방법에 대해 심도 있는 내용을 다루었습니다. 중첩 라우터를 통해 복잡한 애플리케이션의 구조를 명확하게 정의하고, 이를 통해 코드의 가독성을 높이는 방법을 배울 수 있었습니다. 이러한 기법을 활용하여 여러분의 Express 애플리케이션을 더욱 효율적으로 개발해 보세요.
10. 추가 리소스
추가적인 학습을 원하신다면 아래의 리소스를 참고하시기 바랍니다: