Express 개발 강좌, Socket.io를 이용한 실시간 통신 구현

이번 강좌에서는 Node.js의 Express 프레임워크와 Socket.io 라이브러리를 사용하여 실시간 통신을 구현하는 방법에 대해 알아보겠습니다. 실시간 통신은 사용자와 시스템 간의 즉각적인 데이터 전송을 가능하게 하여, 웹애플리케이션의 사용자 경험을 크게 향상시킵니다. 예를 들어, chatting application이나 실시간 데이터 대시보드와 같은 시스템에서 유용하게 사용됩니다.

1. Socket.io란?

Socket.io는 웹 소켓을 기반으로 한 실시간 양방향 통신을 위한 JavaScript 라이브러리입니다. Socket.io는 클라이언트와 서버 간의 실시간 연결을 생성하고, 이를 통해 데이터를 실시간으로 전송할 수 있게 해줍니다. 이 라이브러리는 웹 소켓, HTTP Long Polling 등 여러 전송 방법을 지원합니다.

1.1 특징

  • 실시간 양방향 통신 지원
  • 이벤트 기반 API
  • 모든 브라우저 지원
  • 자동 재연결 기능

2. 환경 설정

이제 Express와 Socket.io를 설치하고 기본적인 서버를 설정해 보겠습니다. Node.js가 설치되어 있어야 합니다. 만약 설치되어 있지 않다면, Node.js 공식 웹사이트(nodejs.org)에서 다운로드하여 설치할 수 있습니다.

2.1 프로젝트 초기화

mkdir socketio-example
cd socketio-example
npm init -y

2.2 필요한 패키지 설치

npm install express socket.io

3. 서버 및 클라이언트 생성

이제 기본적인 Express 서버를 생성하고 Socket.io를 연결하겠습니다.

3.1 Express 서버 설정

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
    console.log('새로운 클라이언트 연결됨');

    socket.on('disconnect', () => {
        console.log('클라이언트 연결 해제');
    });
});

const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT}에서 실행 중`);
});

3.2 클라이언트 HTML 파일 생성

서버의 기본 페이지로 사용할 index.html 파일을 생성합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Socket.io 예제</title>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();
        
        socket.on('connect', () => {
            console.log('서버에 연결됨');
        });
    </script>
</head>
<body>
    <h1>Socket.io와 함께하는 실시간 통신</h1>
</body>
</html>

3.3 서버 실행

이제 서버를 실행해 보겠습니다.

node index.js

서버가 실행 중인 상태에서 브라우저에서 http://localhost:3000으로 이동하면 “Socket.io와 함께하는 실시간 통신”이라는 문구가 표시되는 웹 페이지를 볼 수 있을 것입니다.

4. 기본 이벤트 통신 구현

이제 Socket.io의 기본적인 스트림을 사용하여 클라이언트와 서버 간의 메시지를 주고받는 기능을 구현해 보겠습니다.

4.1 메시지 전송

서버 코드 수정

io.on('connection', (socket) => {
    console.log('새로운 클라이언트 연결됨');

    socket.on('chat message', (msg) => {
        console.log('메시지 수신: ' + msg);
        io.emit('chat message', msg);
    });

    socket.on('disconnect', () => {
        console.log('클라이언트 연결 해제');
    });
});

클라이언트 코드 수정

<body>
    <h1>Socket.io와 함께하는 실시간 통신</h1>
    <ul id="messages"></ul>
    <form id="form" action="<!---->" onsubmit="sendMessage(event)">
        <input id="m" autocomplete="off" />
        <button>전송</button>
    </form>
    
    <script>
        const socket = io();

        function sendMessage(event) {
            event.preventDefault();
            const input = document.getElementById('m');
            socket.emit('chat message', input.value);
            input.value = '';
            return false;
        }

        socket.on('chat message', (msg) => {
            const item = document.createElement('li');
            item.textContent = msg;
            document.getElementById('messages').appendChild(item);
            window.scrollTo(0, document.body.scrollHeight);
        });
    </script>
</body>

4.2 결과 확인

서버를 재실행하고 http://localhost:3000에 접속한 후, 메시지를 전송하면 클라이언트 간에 메시지가 실시간으로 전송되는 것을 볼 수 있습니다.

5. Room 기능 구현

Socket.io의 강력한 기능 중 하나는 방(Room) 기능입니다. 이를 통해 여러 개의 방을 만들어 특정 클라이언트만 메시지를 수신하도록 할 수 있습니다.

5.1 방 만들기

io.on('connection', (socket) => {
    console.log('새로운 클라이언트 연결됨');

    socket.on('join room', (room) => {
        socket.join(room);
        console.log(`방 ${room}에 접속함.`);
    });

    socket.on('chat message', (msg) => {
        const room = msg.room;
        const message = msg.message;
        console.log(`방 ${room}에 메시지 수신: ${message}`);
        io.to(room).emit('chat message', message);
    });

    socket.on('disconnect', () => {
        console.log('클라이언트 연결 해제');
    });
});

5.2 클라이언트 방 입장 기능 추가

const roomInput = document.getElementById('room-input');
socket.emit('join room', roomInput.value);
socket.emit('chat message', { room: roomInput.value, message: input.value });

5.3 결과 확인

방 기능 추가 후, 특정 방에 들어가서 메시지를 주고받을 수 있는지 확인해 보세요.

6. 결론

이번 강좌에서는 Express와 Socket.io를 사용하여 실시간 통신을 구현하는 방법에 대해 알아보았습니다. 실시간 채팅이나 데이터 전송을 필요로 하는 다양한 애플리케이션에서 이 기술을 활용할 수 있습니다.

실시간 통신을 구현하면서 여성화된 성격의 사용자 경험을 제공할 수 있으며, 더 나아가 웹 소켓을 통해 다양한 기능을 확장할 수 있습니다. Socket.io와 Express 조합을 이용한 실시간 통신의 가능성은 무궁무진합니다.

7. 더 알아보기

추가적인 자료나 포괄적인 Socket.io의 기능들을 탐구하고 싶다면 공식 문서(socket.io/docs)를 방문해 보세요. 자주 묻는 질문(FAQ) 섹션이나 다양한 예제 코드도 확인할 수 있습니다.

Express 개발 강좌, 프로젝트 구조 및 파일 구성 이해하기

1. 서론

Express.js는 Node.js를 위한 웹 프레임워크로, RESTful API를 쉽게 구축할 수 있도록 도와준다.
본 강좌에서는 Express로 백엔드 서버를 개발하기 위한 프로젝트 구조와 파일 구성을 깊이 있게 알아보겠다.
또한 최적의 개발 환경을 위한 기본적인 설정 방법과 예제를 제공할 예정이다.

2. Express.js란?

Express.js는 경량화된 Node.js 웹 어플리케이션 프레임워크로, 웹 서버 및 API 구축을
위한 다양한 기능들을 제공한다. 기본적으로 라우팅, 미들웨어 지원, HTTP 요청 및 응답 처리 등을
용이하게 할 수 있도록 지원한다. Express를 사용하면 더욱 효율적으로 웹 서버를 구축할 수 있다.

3. 프로젝트 구조 만들기

Express 프로젝트의 구조를 제대로 이해하면 코드 유지 보수와 확장성이 향상된다.
여기서는 일반적으로 사용하는 Express 프로젝트 구조를 설명하겠다.
아래의 구조는 기본적인 파일과 폴더로 구성되어 있다.

        
        /my-express-app
        ├── node_modules/
        ├── src/
        │   ├── controllers/
        │   ├── models/
        │   ├── routes/
        │   ├── middlewares/
        │   ├── config/
        │   └── app.js
        ├── .env
        ├── .gitignore
        ├── package.json
        └── README.md
        
        

3.1. root 디렉토리

모든 Express 프로젝트는 최상위 디렉터리에서 시작한다. 이 디렉터리에는
프로젝트의 메타데이터와 의존성을 정의하는 package.json 파일이 포함된다.
node_modules 폴더는 설치된 패키지를 포함하며,
.env 파일은 애플리케이션의 환경 변수 설정을 위한 파일이다.
.gitignore 파일은 Git에 포함하지 않을 파일들을 정의한다.

3.2. src 폴더

src 폴더는 애플리케이션의 실제 코드가 위치하는 곳이다.
이 폴더 내의 구성 요소들은 다음과 같다:

  • controllers/: 비즈니스 로직이 포함된 파일들이 위치한다.
    클라이언트의 요청을 처리하고, 필요한 데이터를 가져오며, 응답을 반환하는 역할을 한다.
  • models/: 데이터베이스와의 상호작용을 위한 모델들이다.
    일반적으로 ORM(Object Relational Mapping) 라이브러리와 함께 사용된다.
  • routes/: HTTP 요청을 특정 컨트롤러로 라우팅하는 역할을 한다.
    각 API 엔드포인트에 대한 경로를 정의한다.
  • middlewares/: 요청과 응답 사이에 실행되는 함수들로,
    인증, 로깅, 에러 처리 등을 위한 미들웨어를 포함한다.
  • config/: 애플리케이션의 설정 정보를 저장하는 폴더로,
    데이터베이스 연결 정보나 외부 서비스 API 키 등을 포함할 수 있다.
  • app.js: 애플리케이션을 초기화하고, 라우터를 설정하며,
    서버를 시작하는 등 핵심 기능을 구현하는 파일이다.

4. Express 애플리케이션 생성하기

이제 실제 Express 애플리케이션을 생성해 보겠다.
아래 단계에 따라 애플리케이션을 설정하고, 파일 구조를 구성할 것이다.

4.1. 프로젝트 초기화

        
        mkdir my-express-app
        cd my-express-app
        npm init -y
        
    

위 명령어를 통해 새로운 디렉토리를 생성하고, Node.js 프로젝트를 초기화한다.

4.2. Express 설치

        
        npm install express
        
    

Express 패키지를 설치한다.

4.3. 기본 서버 설정하기

src/app.js 파일을 생성하고 기본 서버 코드를 작성해 보자.

        
        const express = require('express');
        const app = express();
        const PORT = process.env.PORT || 3000;

        app.get('/', (req, res) => {
            res.send('Hello, Express!');
        });

        app.listen(PORT, () => {
            console.log(`Server is running on http://localhost:${PORT}`);
        });
        
    

4.4. 서버 실행

서버를 실행하기 위해 아래 명령어를 사용한다.

        
        node src/app.js
        
    

브라우저에서 http://localhost:3000에 접근하여 “Hello, Express!” 메시지를 확인할 수 있다.

5. 라우팅 구현하기

Express의 라우팅 기능을 사용하여 API 엔드포인트를 추가하겠다.
routes 폴더를 생성하고 userRoutes.js 파일을 만들어 사용자 관련 라우팅을 작성해 보자.

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

        // 사용자 목록 조회
        router.get('/users', (req, res) => {
            res.json([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);
        });

        // 사용자 추가
        router.post('/users', (req, res) => {
            // 사용자 추가 로직 구현
            res.status(201).json({ id: 3, name: req.body.name });
        });

        module.exports = router;
        
    

5.1. 라우터 연결하기

app.js 파일에서 userRoutes를 import 하고,
이를 Express 앱에 연결하자.

        
        const express = require('express');
        const app = express();
        const userRoutes = require('./routes/userRoutes');

        app.use(express.json()); // JSON 요청 본문 파싱
        app.use('/api', userRoutes); // '/api' 경로로 라우터 연결

        const PORT = process.env.PORT || 3000;

        app.listen(PORT, () => {
            console.log(`Server is running on http://localhost:${PORT}`);
        });
        
    

5.2. API 테스트하기

Postman 또는 curl을 사용하여 API를 테스트할 수 있다.
GET /api/users 요청을 보내면, 사용자 목록을 확인할 수 있을 것이다.

6. 비즈니스 로직 분리하기

비즈니스 로직을 컨트롤러로 분리하여 코드를 더 깔끔하고 유지보수하기 쉽게 만들자.
controllers 폴더를 생성하고 userController.js 파일을 추가하자.

        
        // src/controllers/userController.js
        exports.getUsers = (req, res) => {
            res.json([{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]);
        };

        exports.addUser = (req, res) => {
            res.status(201).json({ id: 3, name: req.body.name });
        };
        
    

6.1. 컨트롤러와 라우터 연결하기

userRoutes.js에서 라우터를 수정하여 컨트롤러를 사용한다.

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

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

        module.exports = router;
        
    

7. 데이터베이스 연결하기

이제 MongoDB를 사용하여 데이터베이스와 연결하는 방법을 살펴보겠다.
mongoose 패키지를 설치하고, 간단한 게시판 예제를 구현해보자.

        
        npm install mongoose
        
    

7.1. 모델 정의하기

models 폴더를 생성하고 User.js 파일을 만들어
사용자 모델을 정의하자.

        
        // src/models/User.js
        const mongoose = require('mongoose');

        const userSchema = new mongoose.Schema({
            name: {
                type: String,
                required: true
            }
        });

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

7.2. 데이터베이스 연결 설정하기

        
        const mongoose = require('mongoose');
        const express = require('express');
        const userRoutes = require('./routes/userRoutes');

        const app = express();
        mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true })
            .then(() => console.log('MongoDB Connected'))
            .catch(err => console.error('MongoDB connection error:', err));

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

7.3. 사용자 추가 기능 수정하기

사용자를 추가할 때 데이터베이스에 기록하도록 기능을 수정하자.

        
        // src/controllers/userController.js
        const User = require('../models/User');

        exports.addUser = async (req, res) => {
            try {
                const newUser = new User({ name: req.body.name });
                await newUser.save();
                res.status(201).json(newUser);
            } catch (error) {
                res.status(500).json({ message: error.message });
            }
        };
        
    

8. 결론

이번 강좌를 통해 Express.js 프로젝트의 구조와 파일 구성에 대해 알아보았다.
Express를 기반으로 한 백엔드 서버를 간단하게 구현해 보았고, 비즈니스 로직과 데이터베이스 연결을
통해 애플리케이션의 기능을 확장하는 방법을 배웠다.
이러한 기초 지식을 바탕으로 더 복잡한 웹 애플리케이션으로 발전시킬 수 있을 것이다.

추가 자료

Express 개발 강좌, CORS의 개념과 필요성

1. CORS란 무엇인가?

CORS(Cross-Origin Resource Sharing)는 웹 브라우저에서 실행되는 웹 애플리케이션이 자신의 출처(origin)와 다른 출처에 있는 자원에 접근할 수 있도록 허용하는 메커니즘입니다. 출처란 프로토콜(예: http, https), 호스트(도메인), 포트 번호의 조합입니다. 예를 들어, https://example.comhttps://api.example.com은 다른 출처로 간주됩니다.

2. CORS의 필요성

기본적으로 웹 브라우저는 보안 상의 이유로 서로 다른 출처 간의 요청을 제한합니다. 이는 XSS(교차 사이트 스크립팅) 공격 및 CSRF(교차 사이트 요청 위조)와 같은 보안 위협으로부터 사용자를 보호하기 위한 것입니다. 따라서, CORS는 웹 애플리케이션이 안전하게 다양한 출처의 리소스에 접근할 수 있도록 하는 규칙을 정의합니다.

2.1 CORS의 동작 원리

CORS는 HTTP 헤더를 통해 작동합니다. 서버는 요청을 받은 후 클라이언트의 요청 출처를 검증하고, 필요에 따라 적절한 CORS 헤더를 추가하여 응답합니다. 주요 CORS 헤더는 다음과 같습니다:

  • Access-Control-Allow-Origin: 허용된 출처를 지정합니다.
  • Access-Control-Allow-Methods: 허용된 HTTP 메소드를 명시합니다.
  • Access-Control-Allow-Headers: 허용된 요청 헤더를 지정합니다.
  • Access-Control-Expose-Headers: 클라이언트가 접근할 수 있는 헤더를 정의합니다.

2.2 CORS의 실제 동작 예시

클라이언트가 CORS 요청을 보낼 때, 브라우저는 먼저 OPTIONS 메소드를 사용하여 Preflight 요청을 수행합니다. 서버는 이 요청에 대한 응답으로 CORS 헤더를 포함하여 클라이언트가 실제 요청을 진행할 수 있는지 여부를 확인합니다.

3. Express에서 CORS 설정하기

Express에서는 cors 미들웨어를 사용하여 CORS를 쉽게 설정할 수 있습니다. 먼저 cors 패키지를 설치해야 합니다:

npm install cors

3.1 기본적인 사용법

설치 후, Express 애플리케이션에 cors 미들웨어를 추가하여 모든 출처에 대해 CORS 요청을 허용할 수 있습니다.

const express = require('express');
const cors = require('cors');

const app = express();

// CORS 미들웨어 사용
app.use(cors());

app.get('/api/data', (req, res) => {
    res.json({ message: 'CORS 설정 성공!' });
});

app.listen(3000, () => {
    console.log('서버가 3000번 포트에서 실행 중입니다.');
});

3.2 특정 출처에 대한 CORS 설정

특정 출처에 대해서만 CORS 요청을 허용하고 싶다면, cors 미들웨어에 설정 객체를 전달하면 됩니다. 아래 코드는 https://example.com에서 오는 요청만 허용하는 예제입니다.

const express = require('express');
const cors = require('cors');

const app = express();

// 특정 출처에 대해서만 CORS 허용
const allowedOrigins = ['https://example.com'];

app.use(cors({
    origin: function(origin, callback){
        // 출처가 없는 경우 (예: 로컬 요청) 허용
        if(!origin) return callback(null, true);
        if(allowedOrigins.indexOf(origin) === -1){
            const msg = 'CORS 정책에 의해 접근이 거부되었습니다.';
            return callback(new Error(msg), false);
        }
        return callback(null, true);
    }
}));

app.get('/api/data', (req, res) => {
    res.json({ message: '특정 출처 CORS 설정 성공!' });
});

app.listen(3000, () => {
    console.log('서버가 3000번 포트에서 실행 중입니다.');
});

4. CORS의 보안 고려사항

CORS를 설정할 때 주의해야 할 점은, 너무 많은 출처를 허용할 경우 보안에 취약해질 수 있다는 점입니다. 접근을 허용하는 출처를 엄격히 관리하고, 특히 민감한 데이터에 대한 접근은 신중하게 설정해야 합니다.

5. CORS 에러 처리

CORS가 설정되지 않았거나 잘못 설정된 경우 브라우저는 CORS 에러를 발생시킵니다. 이러한 에러는 일반적으로 콘솔에서 확인할 수 있으며, 개발자는 서버의 CORS 설정을 적절히 수정하여 문제를 해결해야 합니다.

6. 결론

CORS는 현대 웹 애플리케이션 개발에서 필수적인 요소입니다. 웹 보안을 강화하면서도, 다양한 출처의 리소스에 안전하게 접근할 수 있도록 해주기 때문에 개발자는 CORS의 개념과 설정 방법을 잘 이해하고 활용해야 합니다.

Express 애플리케이션을 구축할 때 CORS는 꼭 설정해야 할 사항이며, 위의 예제 코드를 통해 쉽게 적용할 수 있습니다. 항상 보안을 염두에 두고, 필요한 출처만 허용하는 철저한 정책을 유지하시길 바랍니다.

Express 개발 강좌, Swagger 또는 Postman을 이용한 API 문서화

웹 애플리케이션에서 API는 중요한 역할을 합니다. 특히, 백엔드 개발에서는 API를 통해 클라이언트와 서버 간의 통신을 원활하게 이루어질 수 있게 합니다. 따라서, API 문서화는 팀원 간의 이해를 높이고, 유지 보수를 용이하게 하는 중요한 작업입니다. 오늘은 Express.js 백엔드 서버를 개발하며 Swagger와 Postman을 이용해 API 문서화하는 방법에 대해 알아보겠습니다.

1. Express.js 소개

Express.js는 Node.js를 위한 최소화된 웹 프레임워크로, 웹 애플리케이션과 APIs를 개발하는 데 사용됩니다. Express는 다양한 미들웨어와 라우팅 기능을 제공하여 개발자가 효율적으로 웹 애플리케이션을 구축할 수 있도록 도와줍니다.

2. Express 프로젝트 설정

bash
# Express 프로젝트 생성
mkdir express-api-demo
cd express-api-demo
npm init -y
npm install express

위 명령어를 사용하여 Express 프로젝트를 생성하고, Express.js 패키지를 설치합니다.

2.1 기본 서버 설정

javascript
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}`);
});

이제 기본 Express 서버가 설정되었습니다. npm start로 서버를 실행하면 http://localhost:3000에서 “Hello, Express!” 메시지를 볼 수 있습니다.

3. Swagger를 이용한 API 문서화

Swagger는 RESTful API의 설계, 문서화 및 테스트를 위한 통합 솔루션입니다. Swagger UI는 API를 시각적으로 표현하여 개발자와 비개발자가 쉽게 이해할 수 있도록 도와줍니다. 이제 Swagger를 Express 프로젝트에 통합하는 방법을 살펴보겠습니다.

3.1 Swagger UI와 Swagger JSDoc 설치

bash
npm install swagger-ui-express swagger-jsdoc

3.2 Swagger 설정

Swagger를 설정하기 위해 아래와 같이 코드를 수정합니다.

javascript
const swaggerJsDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');

const swaggerOptions = {
    swaggerDefinition: {
        openapi: '3.0.0',
        info: {
            title: 'Express API Demo',
            version: '1.0.0',
            description: 'API documentation for Express Demo',
        },
        servers: [
            {
                url: 'http://localhost:3000',
            },
        ],
    },
    apis: ['./routes/*.js'], // API 문서화할 파일 경로
};

const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));

3.3 API 문서화 주석 추가

Swagger에서 API를 문서화하기 위해 각 API 함수 위에 JSDoc 주석을 추가해야 합니다. 다음은 간단한 GET API에 대한 예입니다.

javascript
/**
 * @swagger
 * /:
 *   get:
 *     summary: Returns a Hello message
 *     responses:
 *       200:
 *         description: A Hello message
 */
app.get('/', (req, res) => {
    res.send('Hello, Express!');
});

이제 서버를 다시 실행하고 http://localhost:3000/api-docs로 이동하면 Swagger UI를 통해 API 문서를 확인할 수 있습니다.

4. Postman을 이용한 API 테스트 및 문서화

Postman은 API를 테스트하고 문서화하는 데 널리 사용되는 도구입니다. Postman을 사용하여 API를 쉽게 테스트하고, 테스트 결과를 문서화하는 방법을 알아보겠습니다.

4.1 Postman 설치

Postman은 공식 웹사이트에서 다운받아 설치할 수 있습니다. 설치 후 애플리케이션을 열고 API 요청을 생성할 수 있습니다.

4.2 API 요청 만들기

Postman에서 새 요청을 만들고, HTTP 메서드와 URL을 입력하여 API 요청을 구성합니다. 아래는 GET 요청의 예입니다.

plaintext
Method: GET
URL: http://localhost:3000/

4.3 요청 테스트 및 응답 확인

위와 같이 요청을 구성한 후, Send 버튼을 클릭하여 요청을 전송합니다. 올바르다면 “Hello, Express!”라는 응답을 확인할 수 있습니다.

4.4 API 문서화

Postman은 요청이 성공적으로 완료된 후, 요청 정보를 문서화할 수 있는 기능을 제공합니다. 요청을 선택한 뒤 우측 상단의 ... 메뉴에서 Save as Template을 선택하여 요청 정보를 저장할 수 있습니다.

5. API 문서화의 중요성

API 문서화는 개발자의 생산성을 높이고, 유지 보수를 용이하게 만들며, 팀과의 협업을 촉진합니다. Swagger와 Postman은 이러한 문서화 과정을 간소화해주며, 팀원들이 API의 작동 방식을 쉽게 이해할 수 있도록 도와줍니다.

6. 결론

오늘 우리는 Express.js를 사용한 간단한 API 서버를 설정하고, Swagger와 Postman을 통해 API를 문서화하는 방법을 알아보았습니다. 이 과정에서 얻은 지식을 바탕으로, 앞으로 더욱 효율적으로 API를 개발하고 문서화할 수 있기를 바랍니다.

참고 자료

Express 개발 강좌, Heroku, Vercel, AWS 등을 이용한 서버 배포 방법

웹 개발의 많은 부분이 서버 사이드 기술과 그 배포에 의존하고 있습니다. 이 강좌에서는 Express.js를 사용하여 백엔드 서버를 구축하고, 이를 Heroku, Vercel, 그리고 AWS 등 다양한 플랫폼에 배포하는 방법을 자세히 설명하겠습니다. 이 과정은 전체적인 워크플로우를 이해하는 데 도움이 되며, 좋은 개발 습관을 기르는 데 중요한 기초가 될 것입니다.

1. Express.js란?

Express.js는 Node.js 환경에서 작동하는 웹 애플리케이션 프레임워크로, 간단하고 유연한 API를 제공하여 개발자가 RESTful 웹 서비스를 쉽게 구축할 수 있게 돕습니다. 경량이며, 다양한 미들웨어와의 통합이 용이해 많은 개발자들이 선택하는 프레임워크입니다.

2. Express.js로 서버 구축하기

2.1. 기본 설정

먼저, Node.js와 npm이 설치되어 있는지 확인합니다. 그런 다음 새로운 프로젝트를 시작하여 필요한 패키지를 설치합니다.


            mkdir express-backend
            cd express-backend
            npm init -y
            npm install express
        

2.2. 간단한 서버 만들기

다음으로, Express.js를 사용하여 기본적인 서버를 만들어 보겠습니다.


            const express = require('express');
            const app = express();
            const PORT = process.env.PORT || 3000;

            app.get('/', (req, res) => {
                res.send('Hello World!');
            });

            app.listen(PORT, () => {
                console.log(`Server is running on http://localhost:${PORT}`);
            });
        

위 코드는 기본적인 Express 서버를 설정합니다. `/` 경로로 요청을 보내면 “Hello World!” 메시지를 응답합니다. 서버는 기본적으로 포트 3000에서 실행됩니다.

3. 서버 배포 방법

Express 서버를 지역 환경에서 성공적으로 실행했다면, 이제는 클라우드 환경에 배포해야 합니다. 이 섹션에서는 Heroku, Vercel, 그리고 AWS를 이용한 배포 방법을 알아보겠습니다.

3.1. Heroku에 배포하기

3.1.1. Heroku CLI 설치

Heroku에 배포하기 위해서는 Heroku CLI를 설치해야 합니다. 아래 링크에서 설치 방법을 확인할 수 있습니다.
Heroku CLI 설치하기

3.1.2. Heroku로 앱 생성하기

터미널에서 아래의 명령어를 실행하여 새로운 Heroku 앱을 생성합니다.


            heroku create your-app-name
        

3.1.3. 코드 조정

Heroku에서는 포트를 환경 변수로 관리하므로, 코드에서 포트를 설정하는 부분을 수정합니다.


            const PORT = process.env.PORT || 3000;
        

3.1.4. 배포

코드를 Heroku에 배포하기 위해 Git을 사용하여 코드를 커밋한 후, 아래 명령어를 통해 푸시합니다.


            git add .
            git commit -m "Initial commit"
            git push heroku master
        

3.1.5. 배포 확인

배포가 완료되면 아래 명령어를 통해 애플리케이션을 열 수 있습니다.


            heroku open
        

3.2. Vercel에 배포하기

3.2.1. Vercel CLI 설치

Vercel에 배포하기 위해 Vercel CLI를 설치합니다. 아래 링크를 따라 설치합니다.
Vercel 다운로드

3.2.2. Vercel로 프로젝트 배포하기

프로젝트 루트 디렉토리에서 Vercel CLI를 사용하여 배포합니다.


            vercel
        

3.2.3. 환경 변수 설정

Vercel 대시보드에서 환경 변수를 설정할 수 있으며, 포트 설정도 마찬가지로 환경 변수에 의해 관리됩니다.

3.3. AWS에 배포하기

3.3.1. AWS 계정 생성

AWS에서 배포하기 위해서는 AWS 계정을 생성해야 합니다. AWS 공식 사이트에서 계정을 생성합니다.

3.3.2. EC2 인스턴스 만들기

AWS Management Console에 로그인한 후 EC2 대시보드로 이동합니다. “Launch Instance” 버튼을 클릭하여 새로운 인스턴스를 생성합니다. 보안 그룹에서 HTTP(포트 80)와 SSH(포트 22) 접근을 허용합니다.

3.3.3. 서버 설정

SSH를 통해 EC2 서버에 접속한 뒤 Node.js와 필요한 패키지를 설치합니다.


            sudo apt update
            sudo apt install nodejs npm
            

3.3.4. 코드 올리기

로컬 서버에서 작성한 코드를 SCP를 통해 EC2 인스턴스로 복사합니다.


            scp -i your-key.pem -r ./express-backend/ ec2-user@your-ec2-ip-address:/home/ec2-user/
            

3.3.5. 서버 실행

SSH로 EC2에 연결한 후, 애플리케이션 디렉토리로 이동하여 서버를 실행합니다.


            cd express-backend
            node app.js
            

3.3.6. 도메인 설정

공인 IP 주소 또는 도메인을 사용하여 애플리케이션에 접근할 수 있습니다. Route 53을 사용하여 도메인을 설정할 수 있습니다.

4. 배포 후 유지 관리

배포가 완료된 후에는 애플리케이션의 성능과 안정성을 지속적으로 모니터링하는 것이 중요합니다. 또한, 필요할 경우 애플리케이션을 업데이트하고 보안을 유지해야 합니다.

5. 결론

이번 강좌에서는 Express.js를 사용하여 서버를 구축하고, Heroku, Vercel, AWS와 같은 다양한 플랫폼에 배포하는 방법을 배웠습니다. 각 클라우드 서비스마다 운영 방식과 배포 가능성은 다릅니다. 본인의 프로젝트와 요구 사항에 맞는 플랫폼을 선택하여 배포하세요.

추가 자료나 샘플 코드는 GitHub에 업로드해두었으니 참고하시기 바랍니다. 귀하의 서버 배포 경험이 더 풍부해지길 바랍니다!