Express.js: Node.js 웹 개발의 강력한 도구
Express.js란 무엇인가요?
Express.js(이하 Express)는 Node.js의 가장 널리 사용되는 웹 애플리케이션 프레임워크로, 웹 서버 및 API를 빠르고 간단하게 구축할 수 있도록 설계되었습니다. Express는 미니멀리즘과 유연성을 중시하며, 개발자가 필요에 따라 원하는 기능을 추가하거나 설정할 수 있는 방식으로 설계되었습니다.
Express는 Node.js의 기본 HTTP 모듈 위에 추상화를 추가하여, HTTP 요청 및 응답 처리를 더 직관적이고 효율적으로 만들었습니다.
Express.js의 주요 특징
- 간결한 코드 구조
- HTTP 요청과 응답을 처리하는 데 필요한 로직을 단순화합니다.
req
,res
객체를 통해 요청 데이터를 쉽게 처리할 수 있습니다.
- 미들웨어 기반 아키텍처
- 요청과 응답 처리 흐름을 체인처럼 구성할 수 있습니다.
- 미들웨어는 인증, 로깅, 파싱, 에러 처리 등을 추가하는 데 사용됩니다.
- 라우팅 시스템
- URL 경로와 HTTP 메서드(GET, POST, PUT, DELETE 등)를 조합하여 다양한 엔드포인트를 정의할 수 있습니다.
- 플러그인 및 확장성
- 다양한 플러그인(예: 인증, 데이터베이스 연결)을 쉽게 통합할 수 있습니다.
- 커뮤니티에서 제공하는 수많은 모듈과 통합 가능합니다.
- 템플릿 엔진 지원
- HTML 템플릿 엔진(예: Pug, EJS, Handlebars)을 통해 동적 HTML 페이지를 생성할 수 있습니다.
- 비동기 처리
- Node.js의 비동기 특성을 그대로 활용하며, 비동기 요청 처리를 효율적으로 수행합니다.
Express.js의 주요 구성 요소
-
앱 객체 (
app
)
Express 애플리케이션의 핵심으로, 모든 설정, 미들웨어, 라우팅 등을 관리합니다.const express = require('express'); const app = express();
-
라우터 (
Router
)
HTTP 요청 경로를 정의하며, 요청 메서드와 URL을 기준으로 요청을 처리합니다.app.get('/', (req, res) => { res.send('Hello, World!'); });
-
미들웨어
요청-응답 주기에 기능을 추가하거나 가로챌 수 있는 함수입니다.app.use((req, res, next) => { console.log(`${req.method} ${req.url}`); next(); // 다음 미들웨어로 이동 });
-
요청 객체 (
req
)
클라이언트의 요청 데이터를 포함합니다. (예: URL, 헤더, 바디 등) -
응답 객체 (
res
)
서버가 클라이언트에 응답을 보낼 때 사용하는 메서드와 속성을 포함합니다.
Express.js의 주요 기능 및 사용 예제
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(`Server is running on http://localhost:${PORT}`);
});
2. 라우팅
다양한 URL 경로와 HTTP 메서드에 따라 요청을 처리합니다.
app.get('/users', (req, res) => {
res.json([{ id: 1, name: 'John' }]);
});
app.post('/users', (req, res) => {
res.status(201).send('User created');
});
3. 미들웨어 추가
요청 처리 과정을 확장하거나 조정할 수 있습니다.
const bodyParser = require('body-parser');
app.use(bodyParser.json()); // JSON 요청 본문을 파싱
app.use((req, res, next) => {
console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
next();
});
4. 정적 파일 서비스
HTML, CSS, JavaScript 파일 같은 정적 파일을 제공할 수 있습니다.
app.use(express.static('public'));
5. 템플릿 엔진 사용
템플릿 엔진을 통해 동적 HTML 페이지를 렌더링합니다.
app.set('view engine', 'pug');
app.get('/hello', (req, res) => {
res.render('index', { title: 'Express', message: 'Hello, Pug!' });
});
6. 에러 처리
커스텀 에러 핸들러를 설정하여 에러를 관리할 수 있습니다.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
Express.js의 장단점
장점
- 빠르고 가볍다: 불필요한 기능을 배제한 미니멀리즘 디자인.
- 유연성: 다양한 플러그인을 통해 확장이 용이.
- 커뮤니티 지원: 풍부한 오픈 소스 모듈과 강력한 사용자 커뮤니티.
- 미들웨어 시스템: 요청 흐름 제어가 간단하고 강력.
단점
- 유연성의 양날의 검: 표준이 없어서 프로젝트 구조가 개발자마다 다를 수 있음.
- 비교적 단순한 기능 제공: 고급 기능은 직접 구현하거나 별도의 라이브러리를 사용해야 함.
Express.js를 시작하기 위한 기본 설치
-
Node.js 설치
Express는 Node.js 환경에서 실행되므로, Node.js를 먼저 설치해야 합니다. -
Express 설치
다음 명령어로 Express를 설치합니다.npm install express
-
프로젝트 초기화
package.json
파일을 생성하고 Express를 설치하여 사용할 수 있습니다. 아래 명령어를 사용합니다.npm init -y npm install express
Express.js의 활용 예시
RESTful API 서버 구축
Express는 RESTful API 서버를 구축하는 데 적합한 프레임워크입니다. 아래는 간단한 To-Do List API 예제입니다.
const express = require('express');
const app = express();
// JSON 요청 본문 파싱 미들웨어 추가
app.use(express.json());
// To-Do 항목을 저장할 배열
let todos = [];
// 모든 To-Do 항목 가져오기
app.get('/todos', (req, res) => {
res.json(todos);
});
// 새로운 To-Do 항목 추가
app.post('/todos', (req, res) => {
const todo = { id: Date.now(), ...req.body };
todos.push(todo);
res.status(201).json(todo);
});
// 특정 To-Do 항목 삭제
app.delete('/todos/:id', (req, res) => {
todos = todos.filter(todo => todo.id !== parseInt(req.params.id));
res.status(204).send();
});
// 서버 실행
app.listen(3000, () => console.log('Server running on port 3000'));
마무리
Express.js는 웹 애플리케이션과 API를 구축하기 위한 강력하고 간결한 도구입니다. 미들웨어와 라우팅 기능을 활용하면 다양한 기능을 가진 서버를 효율적으로 개발할 수 있습니다. 단순한 시작점으로, 커스터마이징을 통해 복잡한 애플리케이션까지 확장 가능하다는 점에서 Express는 초보자와 숙련된 개발자 모두에게 적합합니다.
Leave a comment