ExpressJS

Express.js는 Node.js를 위한 빠르고 개방적인 웹 프레임워크.
2010년에 TJ Holowaychuk에 의해 처음 출시되었으며, 현재는 OpenJS Foundation에서 관리하고 있다.
Node.js의 핵심 모듈인 http를 기반으로 만들어졌으며, 웹 애플리케이션과 API를 개발하기 위한 다양한 기능을 제공한다.

주요 특징

  1. 미들웨어 아키텍처: 요청-응답 주기를 효과적으로 관리
  2. 라우팅: HTTP 메서드와 URL 경로에 따른 요청 처리
  3. 템플릿 엔진 지원: 동적 HTML 페이지 생성 (Pug, EJS, Handlebars 등)
  4. 정적 파일 제공: express.static 미들웨어를 통한 간편한 정적 파일 서비스
  5. 확장성: 다양한 미들웨어와 플러그인을 통한 기능 확장

장점

  1. 간단하고 직관적인 API를 제공하여 빠른 개발이 가능하다.
  2. 미들웨어 시스템을 통해 유연한 확장성을 제공한다.
  3. 큰 커뮤니티와 풍부한 써드파티 미들웨어 생태계가 있다.
  4. 성능이 우수하며 메모리 사용량이 적다.
  5. Node.js의 비동기 특성을 활용하여 높은 동시성을 처리할 수 있다.

단점 및 한계

  1. 기본 프레임워크가 최소한의 기능만 제공하여 추가 기능은 별도로 구현해야 한다.
  2. 구조화된 프로젝트 템플릿을 제공하지 않아 큰 프로젝트에서는 구조 설계가 필요하다.
  3. 비동기 코드 처리로 인한 콜백 지옥이 발생할 수 있다(async/await로 해결 가능).
  4. TypeScript와 같은 정적 타입 지원이 기본적으로 제공되지 않다.

사용 방법

  1. 먼저 프로젝트에 Express.js를 설치해야 한다:

    1
    2
    
    npm init
    npm install express
    
  2. 기본적인 서버 생성 예시:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    // 기본 서버 설정
    const express = require('express');
    const app = express();
    const port = 3000;
    
    // 미들웨어 설정
    app.use(express.json()); // JSON 파싱
    app.use(express.urlencoded({ extended: true })); // URL 인코딩된 데이터 파싱
    
    // 정적 파일 제공
    app.use(express.static('public'));
    
    // 라우팅 설정
    app.get('/', (req, res) => {
        res.send('Hello World!');
    });
    
    // 서버 시작
    app.listen(port, () => {
        console.log(`Server is running on port ${port}`);
    });
    

주요 명령어와 메서드

  1. 라우팅 메서드:

    • app.get(): GET 요청 처리
    • app.post(): POST 요청 처리
    • app.put(): PUT 요청 처리
    • app.delete(): DELETE 요청 처리
  2. 미들웨어 관련:

    • app.use(): 미들웨어 함수 등록
    • next(): 다음 미들웨어로 제어 전달
  3. 응답 메서드:

    • res.send(): 다양한 유형의 응답 전송
    • res.json(): JSON 응답 전송
    • res.render(): 템플릿 렌더링
    • res.redirect(): 리다이렉션

실제 활용 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
const express = require('express');
const app = express();

// 커스텀 미들웨어 예시
const logger = (req, res, next) => {
    console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
    next();
};

app.use(logger);
app.use(express.json());

// 사용자 데이터 저장소
let users = [];

// CREATE - 사용자 생성
app.post('/users', (req, res) => {
    const user = {
        id: users.length + 1,
        name: req.body.name,
        email: req.body.email
    };
    users.push(user);
    res.status(201).json(user);
});

// READ - 모든 사용자 조회
app.get('/users', (req, res) => {
    res.json(users);
});

// READ - 특정 사용자 조회
app.get('/users/:id', (req, res) => {
    const user = users.find(u => u.id === parseInt(req.params.id));
    if (!user) return res.status(404).json({ message: 'User not found' });
    res.json(user);
});

// UPDATE - 사용자 정보 수정
app.put('/users/:id', (req, res) => {
    const user = users.find(u => u.id === parseInt(req.params.id));
    if (!user) return res.status(404).json({ message: 'User not found' });
    
    user.name = req.body.name || user.name;
    user.email = req.body.email || user.email;
    res.json(user);
});

// DELETE - 사용자 삭제
app.delete('/users/:id', (req, res) => {
    const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
    if (userIndex === -1) return res.status(404).json({ message: 'User not found' });
    
    users.splice(userIndex, 1);
    res.status(204).send();
});

// 에러 처리 미들웨어
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).json({ message: 'Something broke!' });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

참고 및 출처

Express - Node.js web application framework