본문 바로가기
웹 개발

Node.js로 백엔드 개발 시작하기 3(RESTful API, 데이터베이스 연동, JWT)

by 이야니 2024. 3. 25.

Node.js로 백엔드 개발 시작하기 3(RESTful API, 데이터베이스 연동, JWT) 포스팅입니다. Node.js는 그 유연성과 확장성으로 인해 현대 웹 백엔드 개발에 있어 중추적인 역할을 하고 있습니다. 이번 포스팅에서는 Node.js의 핵심 요소들을 탐구하며, 실제 웹 서비스 구축을 위한 첫걸음을 내딛고자 합니다. 첫 번째로는 Express.js를 활용해 RESTful API를 개발하는 방법을 살펴볼 것이며, 이를 통해 효율적인 데이터 송수신 구조를 마련할 예정입니다.

Node.js로 백엔드 개발 시작하기 3(RESTful API, 데이터베이스 연동, JWT)

이어서, MongoDB와 같은 NoSQL 데이터베이스를 연동하여 데이터 관리의 유연성과 확장성을 극대화하는 방법을 알아보겠습니다. 마지막으로, JWT를 사용한 사용자 인증과 권한 부여 방법을 통해 보안성 높은 애플리케이션 개발의 중요성을 강조할 것입니다. 이번 시리즈를 통해 백엔드 개발의 세계로 여러분을 안내하며, Node.js의 힘을 최대한 활용하는 방법을 함께 탐색해 보겠습니다.

RESTful API 개발하기: Express.js를 사용하여 API 구축

RESTful API는 웹 개발에서 중요한 구성 요소로 자리 잡았습니다. 이는 클라이언트와 서버 간의 통신을 표준화하여 데이터 교환을 용이하게 만들어주며, 여러 플랫폼 및 언어 간의 호환성을 높여 줍니다. Node.js 환경에서는 Express.js가 RESTful API 개발에 가장 널리 사용되는 프레임워크 중 하나입니다. Express.js는 단순함, 유연성, 높은 확장성을 제공하여 개발자가 빠르고 쉽게 웹 애플리케이션과 API를 구축할 수 있게 돕습니다.

Express.js로 API 구축 시작하기

  • 환경 설정: Node.js가 설치되어 있어야 합니다. 새 프로젝트 디렉토리를 생성하고, 해당 디렉토리에서 npm init 명령어를 실행하여 package.json 파일을 생성합니다. 이 파일은 프로젝트의 메타데이터와 의존성을 관리합니다.
  • Express 설치: 터미널에서 npm install express --save 명령어를 실행하여 Express를 프로젝트에 추가합니다.
  • 기본 서버 구성: 프로젝트의 루트 디렉토리에 app.js 파일을 생성하고, 아래의 기본 코드를 추가하여 Express 서버를 구성합니다.
const express = require('express');
const app = express();
const port = 3000;

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

app.listen(port, () => console.log(`Example app listening on port ${port}!`));
  • API 라우팅: RESTful API는 리소스 기반의 URL, 표준 HTTP 메소드 (GET, POST, PUT, DELETE 등) 사용을 특징으로 합니다. Express에서는 app.get(), app.post(), app.put(), app.delete() 메소드를 사용하여 각 HTTP 요청에 따른 라우팅을 설정할 수 있습니다. 예를 들어, 사용자 정보를 처리하는 API 엔드포인트는 다음과 같이 구성할 수 있습니다.
app.get('/users', (req, res) => {
    // 사용자 목록을 조회하는 로직
});

app.post('/users', (req, res) => {
    // 새로운 사용자를 생성하는 로직
});

app.put('/users/:id', (req, res) => {
    // 특정 사용자 정보를 업데이트하는 로직
});

app.delete('/users/:id', (req, res) => {
    // 특정 사용자를 삭제하는 로직
});

Express.js를 사용하여 RESTful API를 구축하는 것은 Node.js 환경에서 백엔드 서비스를 개발할 때 기본적이면서도 필수적인 과정입니다. Express의 미들웨어, 라우팅, 요청 및 응답 처리 기능을 활용하면 효율적이고 확장 가능한 API를 신속하게 개발할 수 있습니다. 이 글에서 다룬 기본적인 사항을 바탕으로, 보다 복잡한 비즈니스 로직을 처리하고, 다양한 데이터 소스와의 통합, 사용자 인증 및 권한 부여 등의 고급 기능을 추가하여 전문적인 RESTful 서비스를 구현할 수 있습니다.

데이터베이스 연동하기: MongoDB와 같은 NoSQL 데이터베이스 사용하기

현대 애플리케이션의 데이터 관리 요구사항은 다양하며, 특히 대규모 데이터를 효율적으로 처리해야 하는 경우가 많습니다. 이러한 환경에서 MongoDB와 같은 NoSQL 데이터베이스는 그 뛰어난 확장성, 유연한 데이터 모델, 빠른 개발 사이클로 인해 매우 인기가 높습니다. Node.js 환경에서 MongoDB를 연동하는 것은 JSON 기반의 문서 데이터 모델을 사용하여, 자연스럽게 JavaScript 코드와 통합될 수 있기 때문에 개발 과정을 간소화하고, 생산성을 높일 수 있습니다.

MongoDB와의 연동 시작하기

  • MongoDB 설치 및 설정: 로컬 환경에서 MongoDB를 설치하거나, MongoDB Atlas와 같은 클라우드 기반 서비스를 사용하여 시작할 수 있습니다. 설치가 완료되면, 데이터베이스와 컬렉션을 생성하여 사용 준비를 합니다.
  • Mongoose 설치: Mongoose는 MongoDB를 위한 Node.js의 ODM(Object Data Modeling) 라이브러리로, 스키마 정의, 데이터 검증, 쿼리 구성 등의 기능을 제공합니다. 프로젝트 디렉토리에서 npm install mongoose 명령어를 실행하여 설치합니다.
  • Mongoose를 통한 연동: app.js 파일 또는 데이터베이스 설정을 관리하는 별도의 파일에 다음과 같이 Mongoose를 사용하여 MongoDB와의 연결을 설정합니다.
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/mydatabase', {useNewUrlParser: true, useUnifiedTopology: true})
  .then(() => console.log('MongoDB에 성공적으로 연결되었습니다.'))
  .catch(err => console.error('MongoDB 연결 실패:', err));
  • 모델 정의 및 사용: 데이터를 조작하기 위해서는 먼저 Mongoose 모델을 정의해야 합니다. 이 모델은 MongoDB 컬렉션의 구조(Schema)를 정의하고, 해당 컬렉션과의 상호작용을 가능하게 합니다.
const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
  email: String
});

const User = mongoose.model('User', userSchema);

이제, 정의한 모델을 사용하여 데이터를 생성, 조회, 업데이트, 삭제할 수 있습니다. 예를 들어, 새로운 사용자를 생성하고 데이터베이스에 저장하는 코드는 다음과 같습니다.

const newUser = new User({
  name: '홍길동',
  age: 30,
  email: 'hong@example.com'
});

newUser.save()
  .then(doc => console.log('새 사용자 저장 완료:', doc))
  .catch(err => console.error('사용자 저장 실패:', err));

MongoDB와 같은 NoSQL 데이터베이스를 Node.js 애플리케이션에 연동하는 것은 데이터를 효율적으로 관리하고, 대규모 운영 환경에서의 확장성을 확보하는 데 있어 중요한 단계입니다. Mongoose와 같은 ODM을 활용하면 데이터베이스 스키마 관리, 데이터 검증, 복잡한 쿼리 작성 과정이 간소화되어, 개발자는 애플리케이션 로직에 더 집중할 수 있게 됩니다.

인증 구현하기: JWT를 사용한 사용자 인증과 권한 부여

웹 애플리케이션에서 사용자 인증과 권한 부여는 보안과 사용자 경험의 중요한 측면입니다. JSON Web Tokens(JWT)는 가볍고 자가 수용적인 방식으로 정보를 안전하게 전송할 수 있게 해주어, 인증 및 권한 부여에 널리 사용됩니다. JWT는 사용자가 서버에 로그인할 때 생성되며, 이후의 요청에서는 이 토큰이 서버에 의해 검증되어 사용자가 요청한 작업을 수행할 수 있는 권한이 있는지를 판단하는 데 사용됩니다.

JWT 인증의 워크플로우

  1. 사용자 로그인: 사용자가 로그인(일반적으로 이메일과 비밀번호를 사용)하면, 서버는 사용자의 인증 정보를 검증합니다.
  2. 토큰 발급: 인증이 성공하면 서버는 JWT를 생성하여 클라이언트(보통 웹 브라우저)에 반환합니다. 이 토큰에는 사용자 식별 정보, 발급자, 유효 기간 등의 정보가 포함됩니다.
  3. 토큰 사용: 클라이언트는 이후의 모든 요청에 JWT를 포함시켜 서버에 전송합니다. 보통 이 토큰은 HTTP 요청의 헤더에 Authorization: Bearer <token> 형태로 추가됩니다.
  4. 토큰 검증 및 권한 부여: 서버는 요청이 도착할 때마다 토큰의 유효성을 검증하고, 요청된 작업에 대한 사용자의 권한을 확인합니다.

Node.js에서 JWT 구현하기

Node.js 환경에서 JWT 인증 시스템을 구현하기 위해 jsonwebtoken 패키지를 사용할 수 있습니다.

  • jsonwebtoken 패키지 설치: npm install jsonwebtoken 명령어로 패키지를 설치합니다.
  • 토큰 생성 및 검증: 사용자 인증 로직에서 인증이 성공하면 JWT를 생성하고, 요청을 받을 때마다 토큰을 검증합니다.

토큰 생성

const jwt = require('jsonwebtoken');

const user = { id: 1, username: 'exampleUser' }; // 예시 사용자 정보
const secretKey = 'yourSecretKey'; // 비밀 키

const token = jwt.sign(user, secretKey, { expiresIn: '1h' });
console.log(token);

토큰 검증

jwt.verify(token, secretKey, (err, decoded) => {
  if (err) {
    console.error('토큰 검증 실패', err);
    return;
  }
  console.log('토큰 검증 성공', decoded);
});

JWT를 사용할 때는 보안에 주의해야 합니다. 토큰은 클라이언트 측에 저장되므로, XSS(크로스 사이트 스크립팅) 공격으로부터 보호하기 위해 적절한 조치를 취해야 합니다. 또한, JWT는 정보를 암호화하는 것이 아니라 인코딩하기 때문에 중요한 정보는 토큰에 포함시키지 않아야 합니다. 마지막으로, 서버 측에서는 토큰이 탈취되지 않도록 HTTPS를 사용하여 데이터를 암호화하는 것이 중요합니다.

Node.js로 백엔드 개발 시작하기 3(RESTful API, 데이터베이스 연동, JWT)의 마무리

Node.js로 백엔드 개발을 시작하는 여정은 RESTful API 구축, NoSQL 데이터베이스 연동, 그리고 JWT를 활용한 인증 및 권한 부여를 통해 심화되었습니다. 이 시리즈를 통해 얻은 지식과 기술을 바탕으로, 여러분은 이제 안정적이고 확장 가능한 백엔드 시스템을 구축할 수 있는 충분한 역량을 갖추게 되었습니다.

실제 환경에서의 적용을 통해 이론이 실제로 어떻게 작동하는지를 경험하며, 더욱 깊이 있는 이해를 쌓아가시기 바랍니다. 앞으로도 지속적인 학습과 실험을 통해 더욱 발전된 백엔드 개발자로 성장하시길 기원합니다. Node.js로 백엔드 개발 시작하기 3 포스팅을 마치도록 하겠습니다.