Node.js Express.js 대체제와 MongoDB 통합하기

Node.js Express.js 대체제와 MongoDB 통합하기
Cozy CodingPosted On Sep 10, 202410 min read

이미지

Node.js와 MongoDB를 사용하여 백엔드를 구축할 때, Express.js가 개발자들이 가장 먼저 선택하는 프레임워크인 경우가 많습니다. 그러나 단 하나뿐인 선택지는 아닙니다. 특정 요구 사항, 프로젝트 규모 또는 개발 스타일에 따라, 여러 강력한 대안이 있을 수 있습니다. 이 글에서는 MongoDB를 사용한 Node.js 백엔드를 구축하기 위한 최고의 프레임워크들을 살펴보고, 각각의 강점과 이상적인 사용 사례를 강조할 예정입니다.

Koa.js

  • 개요: Express 팀에서 개발한 Koa.js는 미니멀한 프레임워크로서 응용 프로그램의 미들웨어와 구조에 더 많은 제어를 제공합니다. Express와는 달리 Koa는 내장된 미들웨어 세트가 없어 필요에 따라 정확히 구성할 수 있습니다. async/await와 같은 현대적인 JavaScript 기능을 사용하여 보다 깨끗하고 유연한 코드베이스를 제공합니다.
  • 사용 이유: 가벼운 디자인과 간단함을 원하지만 미들웨어와 에러 처리에 대한 세밀한 제어가 필요한 경우, Koa는 탁월한 선택지입니다.
  • 이상적인 대상: 현대적인 ES6+ 구문을 포용하면서 미니멀리즘과 유연성을 선호하는 개발자들에게 적합합니다.
  • 예제
const Koa = require('koa');
const Router = require('@koa/router');
const mongoose = require('mongoose');

const app = new Koa();
const router = new Router();

// MongoDB에 연결
mongoose.connect('mongodb://localhost:27017/koa_example', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 간단한 Mongoose 모델 정의
const User = mongoose.model('User', new mongoose.Schema({
  name: String,
  age: Number,
}));

// 라우트
router.get('/users', async (ctx) => {
  const users = await User.find();
  ctx.body = users;
});

router.post('/users', async (ctx) => {
  const newUser = new User(ctx.request.body);
  await newUser.save();
  ctx.body = newUser;
});

// 미들웨어
app.use(router.routes()).use(router.allowedMethods());

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

Hapi.js

  • 개요: Hapi.js는 더 많은 설정 중심으로 개발자 경험과 보안에 중점을 둔다. Express나 Koa와 달리 Hapi.js는 입력 유효성 검사, 인증 및 캐싱을 포함한 많은 기능이 내장되어 있다. 플러그인 시스템을 통해 대규모 응용 프로그램의 확장에 적합하다.
  • 사용 이유: Hapi.js는 보안, 유효성 검사 및 구성 지원이 내장되어 있는 경우 우수하다. 기업급 응용 프로그램에 특히 적합하다는 평가를 받고 있다.
  • 이상적인 대상: 구성 및 확장성이 중요한 대규모 복잡하고 안전한 응용 프로그램을 개발하는 개발자들에게 이상적이다.
  • 예시
const Hapi = require('@hapi/hapi');
const mongoose = require('mongoose');

// MongoDB에 연결
mongoose.connect('mongodb://localhost:27017/hapi_example', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// 간단한 Mongoose 모델 정의
const User = mongoose.model('User', new mongoose.Schema({
  name: String,
  age: Number,
}));

// Hapi 서버 초기화
const server = Hapi.server({
  port: 3000,
  host: 'localhost',
});

// 라우트
server.route({
  method: 'GET',
  path: '/users',
  handler: async () => {
    return await User.find();
  },
});

server.route({
  method: 'POST',
  path: '/users',
  handler: async (request) => {
    const newUser = new User(request.payload);
    await newUser.save();
    return newUser;
  },
});

// 서버 시작
const start = async () => {
  await server.start();
  console.log('Hapi 서버가 3000 포트에서 실행 중입니다.');
};

start();

NestJS

  • 개요: NestJS는 TypeScript의 우아함을 Node.js 세계로 가져오는 기능이 풍부한 프레임워크입니다. Express 및 Fastify를 기반으로 지원하는 모듈화 아키텍처, 견고한 의존성 주입 및 WebSocket, GraphQL, 및 마이크로서비스를 위한 내장 지원을 제공합니다.
  • 사용 이유: TypeScript를 선호하거나 Angular 배경이 있으면 NestJS는 매우 익숙할 것입니다. 모듈화된 구조와 현대적인 아키텍처에 대한 Out-of-the-box 지원으로 복잡한 애플리케이션을 확장하기에 이상적입니다.
  • 적합 대상: 기업 애플리케이션을 개발하는 개발자 또는 TypeScript를 우선적으로 사용하는 프로세스를 선호하는 사람들에게 적합합니다.
  • 예시
// app.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost:27017/nest_example'),
    UsersModule,
  ],
})
export class AppModule {}
// users.module.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User, UserSchema } from './user.schema';

@Module({
  imports: [MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}
// users.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './create-user.dto';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }
}
// users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User, UserDocument } from './user.schema';
import { CreateUserDto } from './create-user.dto';

@Injectable()
export class UsersService {
  constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}

  async findAll(): Promise<User[]> {
    return this.userModel.find().exec();
  }

  async create(createUserDto: CreateUserDto): Promise<User> {
    const newUser = new this.userModel(createUserDto);
    return newUser.save();
  }
}
// user.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

@Schema()
export class User extends Document {
  @Prop({ required: true })
  name: string;

  @Prop()
  age: number;
}

export const UserSchema = SchemaFactory.createForClass(User);

Sails.js

  • 개요: Sails.js는 Ruby on Rails에서 많은 영감을 받은 MVC(Model-View-Controller) 프레임워크입니다. 실시간 애플리케이션을 고려하여 설계되었으며, WebSockets를 지원하고 데이터 모델에 기반한 REST API를 자동으로 생성합니다.
  • 사용 이유: Sails는 데이터 중심 API를 구축하는 과정을 간소화하고 강력한 실시간 기능을 제공하여, 채팅 앱이나 협업 도구와 같이 지속적인 업데이트가 필요한 앱에 적합합니다.
  • 이상적인 대상: 실시간 애플리케이션을 개발하는 개발자나 기능이 풍부하고 견해가 명확한 프레임워크를 찾는 사람들에게 이상적입니다.

Fastify

  • 개요: Fastify는 속도와 오버헤드를 낮추는 데 중점을 둔 고성능 프레임워크입니다. 요청 유효성 검사 및 오류 처리에 스키마 기반 접근 방법을 사용하여 빠른 처리 속도를 보장하며, 처리량이 높은 애플리케이션에 매우 중요할 수 있습니다.
  • 사용 이유: Fastify는 가장 빠른 프레임워크 중 하나로 성능이 최우선이 되는 애플리케이션에 이상적입니다.
  • 이상적인 대상: 처리량이 높고 최소한의 대기 시간으로 많은 부하를 처리해야 하는 성능 중심 애플리케이션을 개발하는 개발자에게 적합합니다.
  • 예시:
const fastify = require('fastify')();
const mongoose = require('mongoose');

// MongoDB에 연결
mongoose.connect('mongodb://localhost:27017/fastify_example', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 간단한 Mongoose 모델 정의
const User = mongoose.model('User', new mongoose.Schema({
  name: String,
  age: Number,
}));

// 라우트
fastify.get('/users', async (request, reply) => {
  const users = await User.find();
  reply.send(users);
});

fastify.post('/users', async (request, reply) => {
  const newUser = new User(request.body);
  await newUser.save();
  reply.send(newUser);
});

// 서버 시작
fastify.listen(3000, (err, address) => {
  if (err) throw err;
  console.log(`Fastify 서버가 ${address}에서 실행 중`);
});

LoopBack

  • 개요: LoopBack은 API를 구축하기 위해 특별히 설계된 강력한 프레임워크입니다. MongoDB를 포함한 다양한 데이터 소스에 연결하고 API를 관리하고 구축하기 위한 GUI를 제공합니다. LoopBack은 또한 모델에서 RESTful API를 자동으로 생성하는 데 우수합니다.
  • 사용 이유: API를 구축하는 것이 주요 관심사이고 여러 데이터 소스와의 원활한 통합이 필요한 경우, LoopBack은 개발 시간을 크게 단축할 수 있습니다.
  • 이상적인 대상: API 중심 애플리케이션 및 견고한 데이터 소스 통합이 필요한 프로젝트.

Feathers.js

  • 개요: Feathers.js는 실시간 능력에 중점을 둔 마이크로서비스 지향 프레임워크입니다. REST 및 웹소켓 지원을 통해 신속하게 API 및 실시간 기능을 구축할 수 있습니다. Feathers는 또한 매우 모듈화되어 있어 다른 프레임워크나 라이브러리와 통합하기에 적합합니다.
  • 사용 이유: 응용 프로그램이 실시간 통신이 필요하거나 마이크로서비스 작업을 진행 중인 경우, Feathers는 개발 경험을 간소화해줍니다.
  • 이상적인 대상: 채팅 플랫폼, 협업 도구 또는 마이크로서비스 기반 아키텍처와 같은 실시간 애플리케이션.
  • 예:
const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const mongoose = require('mongoose');

// Feathers 응용 프로그램 생성
const app = express(feathers());

// MongoDB에 연결
mongoose.connect('mongodb://localhost:27017/feathers_example', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// 간단한 Mongoose 모델 정의
const User = mongoose.model('User', new mongoose.Schema({
  name: String,
  age: Number,
}));

// User 모델에 대한 서비스 정의
app.use('/users', {
  async find() {
    return User.find();
  },
  async create(data) {
    const newUser = new User(data);
    await newUser.save();
    return newUser;
  }
});

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

추천: 어떤 프레임워크를 선택해야 할까요?

위 프레임워크들은 각각 고유한 장점을 제공하지만, 가장 좋은 프레임워크를 선택하는 것은 프로젝트의 성격과 개발 선호도에 크게 의존합니다. 다음은 다양한 시나리오에 따른 간단한 추천입니다:

  • 간편함과 제어력이 중요할 때: Koa.js를 선택하세요. 가벼우며 미들웨어에 대해 더 많은 제어권을 제공하여 미니멀한 프레임워크를 선호하는 개발자에게 탁월한 선택입니다.
  • 대규모 기업 애플리케이션에는: NestJS가 강력한 경쟁자입니다. TypeScript를 선호하는 접근 방식, 모듈화된 아키텍처, 그리고 마이크로서비스 및 GraphQL에서 내장 지원을 통해 대규모 응용 프로그램에 완벽합니다.
  • API 중심 또는 데이터 주도적 애플리케이션에는: API 개발에 중점을 둔다면, LoopBack 또는 Sails.js가 내장 기능 및 자동 생성된 API를 통해 작업 부하를 크게 줄일 수 있습니다.
  • 실시간 애플리케이션에는: Feathers.js 또는 Sails.js는 둘 다 실시간 애플리케이션에 적합합니다. 내장 웹소켓 지원을 제공하며 채팅 앱, 협업 도구 또는 실시간 업데이트가 필요한 모든 앱에 매우 적합합니다.
  • 고성능이 필요한 경우: 속도가 최우선이라면, Fastify가 명확한 선택입니다. Node.js 애플리케이션에 제공되는 가장 빠른 프레임워크 중 하나를 제공합니다.

각각의 Node.js 프레임워크는 성능 중심 애플리케이션부터 실시간 기능 및 기업 규모 프로젝트에 이르기까지 각각의 강점과 이상적인 사용 사례를 갖고 있습니다. JavaScript에 익숙하다면 이러한 프레임워크 중 어떤 것이든 MongoDB 통합을 통해 다음 프로젝트에 튼튼한 기반을 제공할 수 있습니다. 일반 개발을 위해서는 Express.js가 신뢰할 만하고 널리 사용되는 옵션이지만, 이러한 대안을 탐색하면 프로젝트의 성공을 위해 정확히 필요한 기능이나 최적화를 제공할 수 있을지도 모릅니다.