MongoDB + NestJS 연동(1)

Jina Kim·2025년 7월 10일
post-thumbnail

어제 EC2에 MongoDB 설치까지 완료했고
오늘은 Nestjs에서 붙어볼거다.

외부에서 붙을 수 있게 mongod.conf 수정

bindIp를 0.0.0.0 으로 수정하면 어떤 ip에서도 접근 가능

$ sudo vi /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1 // 여기를 0.0.0.0 으로 수정한다.
$ sudo systemctl restart mongod // 적용을 위해 mongoDB 재시작
$ sudo systemctl status mongod // 상태 떠 있는지 확인

AWS에서 EC2의 보안 규칙 추가

EC2 > 보안 그룹 > 인바운드 규칙 추가
port: 27017에 대해 열고 싶은 원하는 IP 대를 넣어둔다.

(캡쳐에는 0.0.0.0을 써뒀는데, 정확하게 써주는게 보안에 좋음)

DB의 ID/pwd 생성

$ mongosh
$ use admin
$ db.createUser({
	user: "유저 이름",
    pwd: "비번",
    roles: [{role: 'root', db:'admin'}]
  })
$ db.getUsers() // 방금 입력한 유저 정보를 볼 수 있다
// 다른 DB 전용 사용자
$ use myAppDB

$ db.createUser({
  user: "유저 이름",
  pwd: "비번",
  roles: [
    { role: "readWrite", db: "myAppDB" }
  ]
})

Nestjs에서 Mongoose 패키지 설치

이젠 로컬 소스로 돌아오자.

nestjs 버젼을 먼저 확인한다. package.json에서 알 수 있음

"dependencies": {
	"@nestjs/common": "^9.0.0",
    "@nestjs/core": "^9.0.0",
    ...
 }

난 nestjs 9 버젼이라서 mongoose도 버젼에 맞게 설치했다
(아래 둘중에서 버젼에 맞게 하슈)

$ npm install --save @nestjs/mongoose@9 mongoose // nestjs 9 버젼

$ npm install --save @nestjs/mongoose mongoose // nestjs 10 버젼 이상 설치 가능

패키지 설치 완료!


appModule에 mongoDB 연결

//app.module.ts
@Module({
  imports: [
    MongooseModule.forRoot(process.env.MONGODB_URI), // 추가
  ],
  controllers: [...],
  providers: [...],
})
export class AppModule {}

MONGODB_URI 는 .env 파일에 선언해준다

MONGODB_URI = 'mongodb://유저:비번@호스트:27017/데이터베이스이름?authSource=admin'

스키마 정의

Mongoose는 ODM이라 스키마가 필요하다.

// cat.schema.ts
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';

export type CatDocument = CatChat & Document;

@Schema({ timestamps: true })
export class Cat {
  @Prop({ required: true })
  name: string;

  @Prop()
  age: number;

  @Prop()
  message: string;
}

export const CatSchema = SchemaFactory.createForClass(CatChat);

모듈에 스키마 등록

// cat.module.ts
@Module({
  imports: [
    // 추가
    MongooseModule.forFeature([
      { name: Cat.name, schema: CatSchema },
    ]), 
  ],
  controllers: [..],
  providers: [..],
})
export class CatModule {}

서비스단

// cat.service.ts
@Injectable()
export class CatService {
  constructor(
    @InjectModel(Cat.name)
    private catModel: Model<CatDocument>,
  ) {}

  async create(catData: Partial<Cat>) {
    const cat = new this.catModel(catData);
    return cat.save();
  }
}

고양이 정보를 저장했다.


EC2 데이터 조회

$ mongosh

$ use 데이터베이스

$ show collections // 컬렉션 조회

$ db.cat.find() // 데이터 select 쿼리

고양이 정보 저장 조회 성공!


내일은 간단한 조회 로직도 짜봐야겠다.

profile
Hello, World!

0개의 댓글