Express 개발 강좌, 기본 미들웨어 사용 (body-parser, cookie-parser 등)

이번 강좌에서는 Node.js의 유명한 웹 프레임워크인 Express를 사용하여 기본적인 미들웨어를 활용하는 방법을 알아보겠습니다. Express는 RESTful API 서버 및 웹 어플리케이션을 구축하는 데 매우 적합한 프레임워크이며, 강력한 미들웨어 시스템을 갖추고 있습니다. 미들웨어는 요청과 응답 객체를 처리하는 함수로, 다양한 기능들을 제공해 줍니다.

1. 미들웨어란?

미들웨어는 클라이언트의 요청(request)과 서버의 응답(response) 사이에서 중개 역할을 수행하는 함수입니다. 미들웨어는 여러 가지 용도로 사용될 수 있는데, 여기에는 요청 데이터의 처리, 사용자 인증 및 보안 체크, 로그 기록 및 오류 처리 등이 포함됩니다.

2. Express에서 미들웨어 사용하기

Express는 app.use() 메서드를 통해 미들웨어를 등록합니다. 이 메서드는 요청이 들어올 때마다 실행되며, 순차적으로 등록된 미들웨어가 실행됩니다.

3. 기본 미들웨어 설치 및 설정

Express의 기본 미들웨어 중 두 가지인 body-parsercookie-parser를 설치하고 설정하는 방법을 알아보겠습니다.

3.1 body-parser

body-parser 미들웨어는 HTTP 요청 본문을 구문 분석하여 자바스크립트 객체로 변환해주는 기능을 합니다. 일반적으로 JSON 형태의 데이터를 쉽게 처리할 수 있도록 돕습니다.

npm install body-parser

3.1.1 body-parser 설정 예제

다음은 body-parser를 사용하는 간단한 설정 예제입니다.

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const PORT = 3000;

// body-parser 미들웨어 사용
app.use(bodyParser.json()); // JSON 형태의 데이터 파싱
app.use(bodyParser.urlencoded({ extended: true })); // URL 인코딩 데이터 파싱

app.post('/api/data', (req, res) => {
    console.log(req.body); // 파싱된 데이터 로그 출력
    res.send('데이터 수신 완료');
});

app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});

위 예제에서 bodyParser.json() 메서드는 클라이언트가 보내는 JSON 형태의 요청 본문을 파싱하고, bodyParser.urlencoded() 메서드는 URL 인코딩된 데이터를 파싱합니다.

3.2 cookie-parser

cookie-parser 미들웨어는 클라이언트의 요청에서 쿠키를 파싱하여 req.cookies 객체에 저장하는 기능을 합니다. 이 기능은 사용자의 상태를 저장하고 관리하는 데 유용합니다.

npm install cookie-parser

3.2.1 cookie-parser 설정 예제

다음은 cookie-parser를 사용하는 간단한 설정 예제입니다.

const express = require('express');
const cookieParser = require('cookie-parser');

const app = express();
const PORT = 3000;

// cookie-parser 미들웨어 사용
app.use(cookieParser());

app.get('/set-cookie', (req, res) => {
    res.cookie('myCookie', 'testValue', { maxAge: 900000, httpOnly: true });
    res.send('쿠키가 설정되었습니다.');
});

app.get('/get-cookie', (req, res) => {
    console.log(req.cookies); // 저장된 쿠키 로그 출력
    res.send('쿠키 값을 확인하였습니다.');
});

app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});

위 예제에서 res.cookie() 메서드를 사용하여 쿠키를 설정하고, req.cookies를 통해 요청에 포함된 쿠키 값을 확인합니다. 쿠키는 사용자의 세션 정보를 저장하거나, 개인화된 사용자 경험을 제공하는 데 자주 사용됩니다.

4. 실습 예제: 미들웨어 통합하기

이제 body-parser와 cookie-parser를 모두 사용하는 예제를 만들어 보겠습니다. 이 예제는 사용자로부터 데이터를 받아와 쿠키에 저장하고, 후에 그 데이터를 읽어오는 API를 제공합니다.

const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');

const app = express();
const PORT = 3000;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());

app.post('/submit', (req, res) => {
    const { username } = req.body; // 요청 본문에서 username 추출
    res.cookie('username', username, { maxAge: 900000, httpOnly: true });
    res.send('사용자 이름이 쿠키에 저장되었습니다.');
});

app.get('/welcome', (req, res) => {
    const username = req.cookies.username; // 쿠키에서 사용자 이름 추출
    if (username) {
        res.send(`환영합니다, ${username}님!`);
    } else {
        res.send('쿠키에 저장된 사용자 이름이 없습니다.');
    }
});

app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});

위 예제에서 클라이언트가 /submit 경로로 POST 요청을 하면, 사용자 이름을 쿠키에 저장하고, /welcome 경로로 GET 요청을 하면 저장된 사용자 이름을 응답으로 돌려줍니다.

5. 미들웨어 체이닝

Express에서는 여러 개의 미들웨어를 체이닝하여 사용할 수 있습니다. 체이닝을 통해 요청을 효율적으로 처리하고, 코드의 가독성을 높일 수 있습니다. 아래는 미들웨어 체이닝의 예입니다.

const express = require('express');

const app = express();
const PORT = 3000;

const logRequest = (req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    next(); // 다음 미들웨어로 이동
};

app.use(logRequest);

app.get('/', (req, res) => {
    res.send('홈페이지');
});

app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});

위 예제에서 logRequest 미들웨어는 모든 요청에 대해 요청 메서드와 URL을 로그로 출력합니다. next() 호출 없이 미들웨어가 종료된다면, 이후의 미들웨어나 라우터가 실행되지 않으므로, 항상 next()를 호출해 주어야 합니다.

6. 에러 처리 미들웨어

Express에서는 에러 처리를 위한 특별한 미들웨어를 제공합니다. 에러 처리 미들웨어는 항상 네 개의 인자를 가집니다: (err, req, res, next). 예를 들어, 다음은 기본적인 에러 처리 미들웨어의 예입니다.

const express = require('express');

const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
    throw new Error('에러 발생!'); // 강제로 오류 발생
});

// 에러 처리 미들웨어
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('무언가 잘못되었습니다!');
});

app.listen(PORT, () => {
    console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});

위 예제에서는 / 경로에서 의도적으로 오류를 발생시켜, 이후에 정의된 에러 처리 미들웨어가 호출되도록 하였습니다. 에러 처리 미들웨어는 콘솔에 오류 스택을 출력하고, 클라이언트에게 500 상태 코드를 응답으로 돌려줍니다.

7. 마치며

이번 강좌에서는 Express의 기본 미들웨어 사용법에 대해 알아보았습니다. body-parsercookie-parser를 통해 요청 본문 및 쿠키를 처리하는 방법을 배웠으며, 미들웨어 체이닝 및 에러 처리 미들웨어의 중요성도 확인하였습니다. Express 미들웨어는 웹 애플리케이션의 요청 처리에서 매우 중요한 역할을 하므로, 제대로 이해하고 활용하는 것이 중요합니다.

더 나아가, 자신만의 미들웨어를 만들어보거나, 다양한 미들웨어를 활용하여 Express 애플리케이션을 확장해 나가길 추천합니다. 감사합나다!

Express 개발 강좌, 파일 저장 및 경로 관리

이번 강좌에서는 Express 환경에서 파일을 저장하고 관리하는 방법에 대해 설명하겠습니다. 현대 웹 애플리케이션에서 파일 업로드와 같은 기능은 매우 중요하며, Express.js는 이를 간편하게 구현할 수 있는 여러 가지 방법을 제공합니다. 이 글에서는 Multer라는 미들웨어를 사용하여 파일 업로드를 처리하고, Path 모듈을 통해 파일 경로를 관리하는 방법에 대해 배우겠습니다.

1. Express.js란?

Express.js는 Node.js를 위한 웹 애플리케이션 프레임워크로, 간단하고 안정적인 API를 제공하여 웹 애플리케이션 및 API를 개발하기 위한 최적의 선택입니다. 비슷한 프레임워크와 비교했을 때, Express는 적은 설정으로도 강력하고 유연한 웹 애플리케이션을 만들 수 있도록 도와줍니다.

2. 프로젝트 환경 설정

이 강좌를 시작하기 전에 필요한 환경을 설정하겠습니다. Node.js와 npm(노드 패키지 관리자)이 설치되어 있어야 합니다.

bash
# 프로젝트 폴더를 만들고 이동
mkdir express-file-upload
cd express-file-upload

# npm 프로젝트 초기화
npm init -y

# Express와 Multer 설치
npm install express multer

3. Express 서버 설정

먼저, Express 서버를 설정합니다. server.js라는 파일을 생성하고 아래의 코드를 작성합니다.

javascript
const express = require('express');
const multer = require('multer');
const path = require('path');

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

// Multer 설정
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads/'); // 파일이 저장될 경로
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + path.extname(file.originalname)); // 날짜 + 원래 파일 확장자로 파일 이름 설정
    }
});

const upload = multer({ storage: storage });

// 정적 파일 서비스
app.use('/uploads', express.static('uploads'));

// 루트 경로에 대한 GET 요청 처리
app.get('/', (req, res) => {
    res.send('

파일 업로드를 할 수 있는 페이지입니다.

'); }); // 파일 업로드 처리 app.post('/upload', upload.single('file'), (req, res) => { if (req.file) { res.send(`파일 업로드 성공: ${req.file.filename}`); } else { res.status(400).send('파일 업로드 실패.'); } }); // 서버 시작 app.listen(PORT, () => { console.log(`서버가 http://localhost:${PORT}에서 실행중입니다.`); });

코드 설명

  • multer.diskStorage: 파일의 저장 경로와 파일 이름을 설정합니다.
  • upload.single('file'): 포맷이 multipart/form-data인 요청에서 파일을 하나만 처리합니다.
  • express.static: 지정한 폴더에 있는 파일을 정적 파일로 제공합니다.

4. 파일 업로드 HTML 폼 만들기

파일 업로드를 위한 간단한 HTML 폼을 만들겠습니다. index.html 파일을 생성하고 아래 코드를 작성합니다.

html




    
    
    파일 업로드


    

파일 업로드

HTML 폼 설명

  • enctype="multipart/form-data": 파일 업로드를 위한 인코딩 타입입니다.
  • method="post": 파일 전송에 POST 메서드를 사용합니다.

5. 서버 실행 및 파일 업로드 테스트

서버를 실행하려면 아래 명령어를 입력합니다.

bash
node server.js

웹 브라우저에서 http://localhost:3000에 접속하여 파일 업로드 폼을 사용해 보세요. 파일을 선택하고 업로드 버튼을 클릭하면, 파일이 uploads 폴더에 저장되고 파일 링크가 표시됩니다.

6. 업로드 파일 관리

업로드한 파일의 목록을 관리하고, 삭제하는 방법에 대해서도 알아보겠습니다. 아래는 파일 목록을 반환하고 삭제하는 API를 정의한 코드를 추가합니다.

javascript
const fs = require('fs');

// 파일 목록을 반환하는 라우트
app.get('/files', (req, res) => {
    fs.readdir('uploads', (err, files) => {
        if (err) {
            return res.status(500).send('파일을 읽는 데 문제가 발생했습니다.');
        }
        const fileList = files.map(file => `
  • ${file} 삭제
  • `).join(''); res.send(`

    업로드된 파일 목록

      ${fileList}
    `); }); }); // 파일 삭제하는 라우트 app.get('/delete/:filename', (req, res) => { const filename = req.params.filename; fs.unlink(`uploads/${filename}`, err => { if (err) { return res.status(500).send('파일 삭제에 실패했습니다.'); } res.redirect('/files'); }); });

    업로드 파일 목록 확인하기

    1. 파일 목록을 보려면 /files 경로에 접근하세요.
    2. 각 파일 옆의 ‘삭제’ 링크를 클릭하여 파일을 삭제할 수 있습니다.

    7. 오류 처리

    파일 업로드를 처리할 때 다양한 오류가 발생할 수 있습니다. 따라서 적절한 오류 처리를 추가하는 것이 중요합니다. Multer에서 지원하는 오류 처리를 통해 올바르지 않은 파일 형식이나 파일 크기 초과 등의 오류를 관리할 수 있습니다.

    javascript
    const upload = multer({
        storage: storage,
        limits: { fileSize: 5 * 1024 * 1024 }, // 최대 5MB
        fileFilter: (req, file, cb) => {
            const filetypes = /jpeg|jpg|png|gif|pdf/;
            const mimetype = filetypes.test(file.mimetype);
            const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
            if (mimetype && extname) {
                return cb(null, true);
            }
            cb('Error: 파일 형식이 올바르지 않습니다.');
        }
    });
    

    오류 처리 설명

    • limits: 업로드할 파일의 최대 크기를 제한합니다.
    • fileFilter: 업로드할 수 있는 파일 형식을 제한합니다.

    8. 정리

    이번 강좌에서는 Express.js를 사용하여 파일을 업로드하고 관리하는 방법에 대해 알아보았습니다. Multer 미들웨어를 활용하여 파일 업로드 기능을 쉽게 구현할 수 있으며, Path 모듈을 통해 파일 경로를 안전하게 관리할 수 있습니다. 또한, 업로드한 파일의 목록을 보여주고 삭제하는 기능도 구현하였습니다. 이러한 기초적인 파일 관리 기능들은 다양한 웹 애플리케이션에서 필수적이므로, 여러분의 프로젝트에 쉽게 적용할 수 있기를 바랍니다.

    이 강좌를 통해 Express.js를 활용한 파일 업로드 및 관리에 대한 이해가 깊어졌기를 바라며, 질문이나 추가 학습이 필요한 부분에 대해서는 자유롭게 댓글로 남겨주세요.

    9. 부록

    다음은 Express.js와 관련된 유용한 링크들입니다:

    Express 개발 강좌, 기본 Express 서버 설정 및 실행

    Express.js는 Node.js를 위한 빠르고 불어친 웹 애플리케이션 프레임워크로서, 웹 서버의 기본 구조를 쉽게 구축할 수 있도록 도와줍니다. 이 강좌에서는 Express 서버를 설정하고 실행하는 방법에 대해 상세히 설명하겠습니다.

    1. Express.js란?

    Express.js는 대규모 애플리케이션 구축을 위한 유연하고 모듈화된 웹 프레임워크입니다. RESTful API, 웹사이트 및 기타 서버측 응용 프로그램을 구축하는 데 적합합니다. Express는 미들웨어(layer)를 이용해 요청(request)과 응답(response)을 처리할 수 있으며, 라우팅(라우트 설정), 오류 처리, 요청 본문(movie) 분석 등을 효율적으로 수행할 수 있습니다.

    2. 개발 환경 설정

    Express 서버를 설정하기 위해서는 Node.js와 npm(Node Package Manager)이 필요합니다. 아래는 개발 환경 설정을 위한 단계를 소개합니다.

    2.1 Node.js 설치

    Node.js는 Express의 기반이 되는 JavaScript 런타임입니다. Node.js를 설치하려면 다음 링크를 방문해 운영 체제에 맞는 설치 파일을 다운로드하고 설치하세요: Node.js 공식 사이트.

    2.2 npm 확인 및 설치

    Node.js를 설치하면 npm도 같이 설치됩니다. 터미널 또는 명령 프롬프트를 열고 다음 명령어를 입력하여 npm이 정상적으로 설치되었는지 확인합니다.

    node -v
    npm -v

    3. Express 프로젝트 생성

    이제 Express 프로젝트를 생성해 보겠습니다. 프로젝트 디렉토리를 만들고, 그 디렉토리로 이동합니다.

    mkdir express-server-example
    cd express-server-example

    3.1 npm 초기화

    다음으로 npm init 명령어를 입력하여 프로젝트의 package.json 파일을 생성합니다. 이 과정에서 프로젝트에 대한 정보들을 입력하게 됩니다. 필요한 내용을 입력한 후, 생성된 package.json 파일은 프로젝트의 메타데이터를 포함합니다.

    npm init -y

    3.2 Express 설치

    이제 Express 패키지를 설치합니다. 다음 명령어를 실행하여 Express를 설치합니다.

    npm install express

    4. 기본 Express 서버 설정

    Express가 설치되었으니, 이제 기본적인 서버를 설정해 보겠습니다. 프로젝트 디렉토리 내에 app.js라는 파일을 생성합니다.

    touch app.js

    4.1 Express 서버 구성

    app.js 파일을 열고 아래와 같은 기본 코드를 작성합니다:

    const express = require('express');
    const app = express();
    const PORT = process.env.PORT || 3000;
    
    // 기본 경로 설정
    app.get('/', (req, res) => {
        res.send('안녕하세요, Express 서버가 실행 중입니다!');
    });
    
    // 서버 실행
    app.listen(PORT, () => {
        console.log(`서버가 http://localhost:${PORT}에서 실행 중입니다.`);
    });

    4.2 코드 설명

    • require('express'): Express 모듈을 불러옵니다.
    • const app = express(): Express 인스턴스를 생성합니다.
    • app.get('/', ...): 클라이언트의 GET 요청을 처리하여 기본 경로에 대한 응답을 설정합니다.
    • app.listen(PORT, ...): 서버가 지정된 포트에서 실행되도록 설정합니다.

    5. 서버 실행

    이제 서버를 실행해 볼까요? 터미널에서 다음 명령어를 실행합니다:

    node app.js

    서버가 정상적으로 실행되면, 아래와 같은 메시지가 표시됩니다:

    서버가 http://localhost:3000에서 실행 중입니다.

    6. 서버 테스트

    웹 브라우저를 열고 http://localhost:3000에 접속해 보세요. “안녕하세요, Express 서버가 실행 중입니다!”라는 메시지가 표시되는 것을 확인할 수 있습니다.

    7. 다양한 라우팅 처리

    Express는 GET, POST, PUT, DELETE 등 다양한 HTTP 요청을 처리할 수 있습니다. 아래는 여러 가지 라우팅 처리 예시입니다.

    7.1 다양한 HTTP 메서드 예제

    app.post('/submit', (req, res) => {
        res.send('폼 제출이 완료되었습니다!');
    });
    
    app.put('/update', (req, res) => {
        res.send('데이터가 업데이트되었습니다!');
    });
    
    app.delete('/delete', (req, res) => {
        res.send('데이터가 삭제되었습니다!');
    });

    7.2 라우팅 그룹화

    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);

    8. 미들웨어 활용

    Express에서는 미들웨어를 통해 요청과 응답을 처리하는 로직을 추가할 수 있습니다. 다음은 요청 본문을 JSON 형식으로 파싱하는 미들웨어를 추가하는 방법입니다:

    app.use(express.json());

    9. 에러 처리

    Express는 오류 처리를 위한 미들웨어를 제공하며, 다음과 같이 설정할 수 있습니다:

    app.use((err, req, res, next) => {
        console.error(err.stack);
        res.status(500).send('서버 오류!');
    });

    10. 결론

    이 강좌를 통해 Express 서버를 설정하고 실행하는 기본적인 방법에 대해 알아보았습니다. Express는 쉽고 직관적인 API를 제공하여 빠르게 웹 애플리케이션을 개발할 수 있도록 도와줍니다. 다양한 기능을 활용하여 복잡한 애플리케이션도 손쉽게 구축할 수 있습니다. 앞으로는 데이터베이스 연결, 사용자 인증, 프론트엔드와의 연동 등 더 많은 기술을 배우고 활용해 보겠습니다.

    이제 여러분도 Express를 사용하여 기본 웹 서버를 구현할 수 있습니다. 궁금한 점이나 피드백이 있다면 댓글로 남겨주세요!

    Express 개발 강좌, MongoDB와 Mongoose를 이용한 데이터베이스 연동

    이 강좌에서는 Express.js 웹 프레임워크를 사용하여 Node.js 서버를 구축하고, MongoDB 데이터베이스와의 연동을 위해 Mongoose 라이브러리를 사용하는 방법에 대해 자세히 설명합니다. 이 강좌를 통해 여러분은 Express 서버를 설정하고 데이터베이스 모델을 정의하며 데이터 CRUD(Create, Read, Update, Delete) 작업을 수행하는 방법을 배우게 될 것입니다.

    목차

    1. Express.js 소개
    2. MongoDB 소개
    3. Mongoose란?
    4. Express 서버 준비하기
    5. MongoDB 연동하기
    6. CRUD 기능 구현하기
    7. 결론

    1. Express.js 소개

    Express.js는 Node.js를 위한 최소화되고 유연한 웹 애플리케이션 프레임워크입니다. 이 프레임워크는 웹 애플리케이션 및 API를 구축하는 데 필요한 많은 기능을 제공합니다. Express는 미들웨어 개념을 사용하여 요청-응답 사이클을 처리하며, 이를 통해 다양한 요청에 대한 유연한 라우팅과 응답 처리가 가능합니다.

    Express의 주요 특징으로는 다음과 같습니다:

    • 경량성과 빠른 성능
    • 미들웨어를 통한 확장 가능성
    • RESTful API 구축을 위한 사용 용이성
    • 다양한 데이터 포맷 지원 (JSON, XML 등)

    2. MongoDB 소개

    MongoDB는 비관계형(NoSQL) 데이터베이스로, 유연한 데이터 모델링을 지원합니다. JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장하기 때문에, 객체 지향 프로그래밍에 친숙한 개발자들에게 인기가 많습니다. MongoDB는 스케일 아웃이 용이하고 대용량 데이터 저장에 적합한 특성을 가지고 있습니다.

    MongoDB의 주요 특징은 다음과 같습니다:

    • 유연한 스키마: 데이터 구조를 사전에 정의할 필요 없이, 서로 다른 데이터 구조를 같은 컬렉션에 저장할 수 있습니다.
    • 수평 확장: 데이터 분산 및 복제를 통해 유연하게 데이터베이스 성능을 확장할 수 있습니다.
    • 강력한 쿼리 메커니즘: 다양한 쿼리 반환 기능을 지원하여 복잡한 데이터 검색이 가능합니다.

    3. Mongoose란?

    Mongoose는 MongoDB를 Node.js 애플리케이션과 연결하는 ODM(Object Data Modeling) 라이브러리입니다. Mongoose는 MongoDB의 데이터를 더 쉽게 다룰 수 있도록 스키마 기반 모델링을 제공합니다. 이를 통해 데이터의 구조를 정의하고, 유효성 검사, 쿼리 빌더와 같은 기능을 사용할 수 있습니다. Mongoose를 사용하면 MongoDB의 모든 기능을 효율적으로 활용할 수 있습니다.

    Mongoose의 주요 기능은 다음과 같습니다:

    • 스키마 정의: CRUD 작업에 필요한 데이터 구조를 명확히 정의할 수 있습니다.
    • 미들웨어: 데이터 저장 또는 업데이트 전에 실행되는 전/후처리기를 작성할 수 있습니다.
    • 내장 유효성 검사: 데이터 저장 시 유효성을 검사할 수 있습니다.

    4. Express 서버 준비하기

    이제 Express 서버를 구축해 보겠습니다. 먼저 Node.js가 설치되어 있어야 합니다. 아래와 같이 프로젝트를 생성하고 필요한 패키지를 설치합니다.

    mkdir express-mongo-example
    cd express-mongo-example
    npm init -y
    npm install express mongoose body-parser
    

    이제 간단한 Express 서버를 만들어 보겠습니다. server.js 파일을 생성하고 다음 코드를 작성합니다.

    const express = require('express');
    const bodyParser = require('body-parser');
    const mongoose = require('mongoose');
    
    const app = express();
    app.use(bodyParser.json());
    
    // MongoDB 연결
    mongoose.connect('mongodb://localhost:27017/example', { useNewUrlParser: true, useUnifiedTopology: true })
        .then(() => console.log('MongoDB 연결 성공'))
        .catch(err => console.error('MongoDB 연결 실패:', err));
    
    app.get('/', (req, res) => {
        res.send('Express 서버가 실행 중입니다.');
    });
    
    const PORT = 3000;
    app.listen(PORT, () => {
        console.log(`서버가 포트 ${PORT}에서 실행 중입니다.`);
    });
    

    위 코드를 실행하기 위해 아래 명령어를 터미널에 입력합니다.

    node server.js
    

    브라우저에서 http://localhost:3000을 입력하면 “Express 서버가 실행 중입니다.”라는 메시지를 확인할 수 있습니다.

    5. MongoDB 연동하기

    Mongoose를 사용하여 MongoDB에 연결하고, 데이터 모델을 정의해 보겠습니다. models 폴더를 생성하고, 그 안에 User.js 파일을 생성합니다. 다음과 같이 사용자 모델을 정의합니다.

    const mongoose = require('mongoose');
    
    const userSchema = new mongoose.Schema({
        name: { type: String, required: true },
        email: { type: String, required: true, unique: true },
        age: { type: Number, min: 0 }
    });
    
    module.exports = mongoose.model('User', userSchema);
    

    이제 server.js 파일에서 위 모델을 불러와서 사용할 수 있습니다.

    const User = require('./models/User');
    

    MongoDB에 데이터 삽입을 위한 API를 추가해 보겠습니다. POST /api/users 엔드포인트를 만들고, 사용자 데이터를 수신하여 데이터베이스에 저장합니다.

    app.post('/api/users', (req, res) => {
        const user = new User(req.body);
        user.save()
            .then(() => res.status(201).send('사용자 생성 완료.'))
            .catch(err => res.status(400).send('사용자 생성 실패: ' + err.message));
    });
    

    위 코드를 통해 클라이언트에서 전송한 JSON 데이터를 MongoDB에 저장할 수 있습니다. 이제 Postman 또는 Curl을 사용하여 테스트해 볼 수 있습니다.

    6. CRUD 기능 구현하기

    이제 MongoDB와의 연동이 완료되었으므로, Complete CRUD(생성, 조회, 수정, 삭제) 기능을 구현해 보겠습니다.

    6.1 Create

    위에서 이미 POST /api/users API를 구현했습니다. 이제 사용자 생성을 위해 JSON 데이터를 전송하면 됩니다.

    6.2 Read

    사용자 데이터를 조회하는 API를 생성하겠습니다. GET /api/users 엔드포인트를 추가하여 모든 사용자 데이터를 가져오는 기능을 구현해 보겠습니다.

    app.get('/api/users', (req, res) => {
        User.find()
            .then(users => res.status(200).json(users))
            .catch(err => res.status(500).send('사용자 조회 실패: ' + err.message));
    });
    

    6.3 Update

    특정 사용자의 정보를 수정할 수 있는 PUT /api/users/:id 엔드포인트를 추가합니다.

    app.put('/api/users/:id', (req, res) => {
        User.findByIdAndUpdate(req.params.id, req.body, { new: true })
            .then(updatedUser => res.status(200).json(updatedUser))
            .catch(err => res.status(400).send('사용자 수정 실패: ' + err.message));
    });
    

    6.4 Delete

    사용자를 삭제하는 DELETE /api/users/:id 엔드포인트를 추가합니다.

    app.delete('/api/users/:id', (req, res) => {
        User.findByIdAndDelete(req.params.id)
            .then(() => res.status(200).send('사용자 삭제 완료.'))
            .catch(err => res.status(400).send('사용자 삭제 실패: ' + err.message));
    });
    

    7. 결론

    이 강좌를 통해 Express.js와 Mongoose를 사용하여 MongoDB에 데이터베이스 연동하는 방법을 배웠습니다. 우리는 기본적인 CRUD 기능을 모두 구현하였으며, 이러한 기능을 기반으로 더 복잡한 애플리케이션을 개발할 수 있습니다. 추가적으로 환경변수 설정, 에러 핸들링, 사용자 인증 등을 고려한다면 더 완벽한 애플리케이션을 개발할 수 있을 것입니다. Express와 MongoDB의 조합은 많은 웹 애플리케이션에서 매우 유용하게 사용되므로, 이 기술 스택에 대해 지속적으로 연구하고 실습하는 것을 추천드립니다.

    Express 개발 강좌, 업로드한 파일의 메타데이터 처리

    현대 웹 애플리케이션에서 파일 업로드는 매우 일반적인 기능입니다. 사용자는 종종 문서, 이미지, 비디오와 같은 파일을 서버에 업로드해야 합니다. Express.js는 Node.js 기반의 웹 애플리케이션 프레임워크로, 이러한 작업을 구현하는 데 적합한 도구입니다. 이번 강좌에서는 Express.js를 통해 업로드한 파일의 메타데이터를 처리하는 방법을 심도 있게 설명하겠습니다.

    1. Express.js 소개

    Express.js는 간결하고 유연한 Node.js 웹 애플리케이션 프레임워크로, 서버 사이드 애플리케이션 구축을 위해 필요한 기본 기능을 제공합니다. RESTful API를 쉽게 구현할 수 있는 기능과 미들웨어 기반의 아키텍처로 인해 많은 개발자들이 애용하고 있습니다.

    2. 필요한 패키지 설치하기

    파일 업로드 기능을 구현하기 위해 필요한 패키지를 설치하겠습니다. 가장 인기 있는 파일 업로드 Middleware인 multer를 사용하겠습니다. multer는 multipart/form-data를 처리하여, 파일을 쉽게 업로드할 수 있도록 도와줍니다.

    npm install express multer

    3. 기본적인 Express 서버 설정

    기본적인 Express 서버를 설정하겠습니다. 다음 코드를 사용하여 app.js라는 파일을 생성하고, Express 서버를 설정합니다.

    
    const express = require('express');
    const multer = require('multer');
    const app = express();
    const port = 3000;
    
    // multer 설정
    const storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, 'uploads/');
        },
        filename: function (req, file, cb) {
            cb(null, Date.now() + '-' + file.originalname);
        }
    });
    
    const upload = multer({ storage: storage });
    
    // 기본 라우트
    app.get('/', (req, res) => {
        res.send('Hello, Express!');
    });
    
    // 파일 업로드 라우트
    app.post('/upload', upload.single('file'), (req, res) => {
        if (!req.file) {
            return res.status(400).send('파일이 업로드되지 않았습니다.');
        }
        res.send({
            message: '파일이 성공적으로 업로드되었습니다.',
            file: req.file,
        });
    });
    
    // 서버 시작
    app.listen(port, () => {
        console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);
    });
            

    4. 파일 업로드 라우트 설명

    위의 코드는 파일 업로드를 위한 라우트를 설정합니다. upload.single('file')은 클라이언트로부터 file이라는 이름의 파일을 업로드 받을 것을 기대하며, 업로드된 파일의 정보를 req.file에서 사용할 수 있습니다.업로드된 파일의 메타데이터는 req.file 객체에 포함됩니다. 이 객체에는 파일의 이름, 경로, 크기와 같은 정보가 포함되어 있습니다.

    4.1. 메타데이터 처리

    업로드한 파일에 대한 메타데이터를 처리하는 방법에 대해 더 깊이 살펴보겠습니다. 다음 코드를 통해 파일의 메타데이터를 JSON 형식으로 반환하도록 수정할 수 있습니다.

    
    app.post('/upload', upload.single('file'), (req, res) => {
        if (!req.file) {
            return res.status(400).send('파일이 업로드되지 않았습니다.');
        }
    
        const metadata = {
            originalName: req.file.originalname,
            mimeType: req.file.mimetype,
            size: req.file.size,
            uploadDate: new Date(req.file.uploadDate || Date.now()),
            path: req.file.path,
        };
    
        res.send({
            message: '파일이 성공적으로 업로드되었습니다.',
            metadata: metadata,
        });
    });
            

    5. 클라이언트 측 파일 업로드 구현

    이제 클라이언트 측에서 파일을 업로드하는 HTML 양식을 구현하겠습니다. 다음 코드를 사용하여 index.html 파일을 생성합니다.

    
    
    
    
    
        
        
        파일 업로드
    
    
        

    파일 업로드

    6. 업로드한 파일의 메타데이터 구조

    위 코드에서 업로드된 파일의 메타데이터는 다음과 같은 구조를 가집니다:

    
    {
        message: "파일이 성공적으로 업로드되었습니다.",
        metadata: {
            originalName: "example.png",
            mimeType: "image/png",
            size: 102456,
            uploadDate: "2023-01-01T00:00:00.000Z",
            path: "uploads/1234567890-example.png"
        }
    }
            

    7. 에러 핸들링

    파일 업로드 시 다양한 에러 상황이 발생할 수 있습니다. 예를 들어 파일 크기가 너무 크거나 허용되지 않는 파일 형식이 업로드되는 경우입니다. 이를 처리하기 위해 multer의 설정에서 제한 조건을 추가할 수 있습니다.

    
    // 파일 크기 제한 (5MB 이하)
    const upload = multer({
        storage: storage,
        limits: { fileSize: 5 * 1024 * 1024 },
        fileFilter: (req, file, cb) => {
            const fileTypes = /jpeg|jpg|png|gif/;
            const extname = fileTypes.test(file.mimetype);
            const mimetype = fileTypes.test(file.originalname.split('.').pop().toLowerCase());
            if (extname && mimetype) {
                return cb(null, true);
            }
            cb(new Error('허용되지 않는 파일 형식입니다.'));
        }
    });
            

    8. 실전 배포 및 최적화

    이제 파일 업로드 기능이 완성되었습니다. 마지막 단계로는 이 기능을 실제 프로덕션 환경에 배포하고 최적화하는 것입니다. 이 과정에서는 다음과 같은 사항을 고려해야 합니다:

    • 파일 저장소: 클라우드 저장소 (예: AWS S3)를 사용할지, 로컬 파일 시스템에 저장할지를 결정합니다.
    • 보안: 업로드되는 파일의 유효성을 검사하여 악성 코드가 포함되지 않도록 합니다.
    • 성능: 여러 사용자가 동시에 업로드할 수 있도록 성능을 최적화합니다.

    9. 결론

    이번 강좌에서는 Express.js를 사용하여 파일 업로드 기능을 구현하고 업로드된 파일의 메타데이터를 처리하는 방법에 대해 설명했습니다. Express.js와 multer를 활용하면 간단하면서도 강력한 파일 업로드 기능을 구현할 수 있습니다. 완성된 애플리케이션을 바탕으로 추가적인 기능들을 고려하여 확장해보세요.

    10. 추가 리소스