프로그래밍/Nest.js

Nest.js에서 Mongoose를 활용한 MongoDB 통합 가이드

shimdh 2025. 3. 18. 10:14
728x90

Nest.js에서 Mongoose를 사용하여 MongoDB와 통합하는 과정은 현대 웹 애플리케이션 개발에서 필수적인 단계입니다. 이 블로그 포스트에서는 Mongoose의 개념부터 Nest.js에서의 설정 및 CRUD 기능 구현까지 자세히 설명하겠습니다.

Mongoose란?

Mongoose는 MongoDB와의 상호작용을 위해 설계된 ODM(Object Data Modeling) 라이브러리입니다. 이 라이브러리는 스키마 기반의 솔루션을 제공하여 데이터의 구조를 정의하고, 데이터의 유효성을 검증할 수 있는 기능을 갖추고 있습니다. 이를 통해 개발자는 데이터베이스와의 상호작용을 보다 직관적이고 안전하게 수행할 수 있습니다.

Nest.js에서 Mongoose 설정하기

Nest.js 애플리케이션에 Mongoose를 통합하는 과정은 다음과 같은 단계로 이루어집니다:

1. 패키지 설치

Mongoose와 Nest.js의 Mongoose 모듈을 설치하기 위해 다음 명령어를 실행합니다.

npm install @nestjs/mongoose mongoose

2. 모듈 설정

app.module.ts 파일에서 MongooseModule을 가져오고, MongoDB에 연결할 URI를 설정합니다. 이 과정은 애플리케이션이 MongoDB와 연결될 수 있도록 하는 중요한 단계입니다.

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/nest'),
  ],
})
export class AppModule {}

3. 스키마 생성

특정 컬렉션의 구조를 정의하기 위해 스키마를 생성합니다. 스키마는 데이터의 형식과 규칙을 정의하여 데이터의 일관성을 유지하는 데 중요한 역할을 합니다.

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

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

  @Prop({ required: true })
  email: string;

  @Prop()
  age?: number;
}

export const UserSchema = SchemaFactory.createForClass(User);

4. 모듈 등록

이제 사용자 모듈에 해당 스키마를 등록하여 애플리케이션에서 사용할 수 있도록 합니다.

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './user.schema';

@Module({
  imports: [MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])],
})
export class UserModule {}

CRUD 기능 구현

이제 기본적인 CRUD(Create, Read, Update, Delete) 기능을 구현해보겠습니다. CRUD 기능은 데이터베이스와의 상호작용에서 가장 기본적이고 필수적인 작업입니다.

서비스 생성

사용자 데이터를 처리하기 위한 서비스를 생성합니다. 이 서비스는 데이터베이스와의 상호작용을 담당하며, 비즈니스 로직을 포함합니다.

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User } from './user.schema';

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

  async create(createUserDto): Promise<User> {
    const createdUser = new this.userModel(createUserDto);
    return createdUser.save();
  }

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

  // ... Update 및 Delete 메소드 추가 가능 
}

컨트롤러 생성

사용자 요청을 처리하기 위한 컨트롤러를 생성합니다. 이 컨트롤러는 클라이언트의 요청을 받아 서비스와 연결하여 적절한 응답을 반환합니다.

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';

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

  @Post()
  create(@Body() createUserDto): Promise<User> {
    return this.usersService.create(createUserDto);
  }

  @Get()
  findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }
}

실습 예시

위의 코드가 준비되면 API 테스트 도구(예: Postman)를 사용하여 다음과 같은 요청을 보낼 수 있습니다:

1. 새로운 사용자 만들기 (POST)

POST /users 
Content-Type: application/json 

{
 "name": "홍길동",
 "email": "hong@example.com",
 "age":30 
}

2. 모든 사용자 조회하기 (GET)

GET /users 

결론

Nest.js에서 Mongoose를 사용하는 것은 MongoDB와의 상호작용을 효율적으로 처리할 수 있는 강력한 방법입니다. 위의 단계를 통해 간단한 CRUD 애플리케이션을 구축함으로써 데이터베이스 통합의 기초 개념을 이해하고 활용할 수 있습니다. 이를 바탕으로 더욱 복잡한 비즈니스 로직이나 다양한 쿼리를 추가하면서 경험을 쌓아갈 수 있을 것입니다. 데이터베이스와의 통합은 애플리케이션의 성능과 확장성에 큰 영향을 미치므로, 이 과정을 통해 얻은 지식은 앞으로의 개발에 큰 도움이 될 것입니다.

728x90