본문 바로가기
STUDY/MongoDB

[6-2] Mongoose DB연결 및 스키마정의

by Y.Choi 2023. 4. 9.
728x90
반응형

Mongoose

Node.js에서 MongoDB와 상호작용하기 위한 ODM(Object Data Mapping) 라이브러리입니다. 즉, Mongoose는 MongoDB에서 데이터를 저장하고 쿼리하는 방법을 단순화하고 추상화한 것입니다.

CRUD(Create, Read, Update, Delete) 연산과 데이터 검증, 쿼리 생성, 미들웨어 등을 제공합니다. 이를 통해 MongoDB와의 상호작용을 단순화하고 유연성과 확장성을 높일 수 있습니다.

 

 

 

> 몽구스 설치

npm install mongoose

 

 

> 데이터베이스 연결 설정

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/myDatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(() => {
  console.log('MongoDB connected...');
}).catch((err) => {
  console.log(err);
});

 

mongoose.connect() 메소드를 사용하여 MongoDB 서버에 연결합니다.

첫 번째 인자 :  MongoDB 서버의 주소와 데이터베이스 이름이 포함된 URI(Uniform Resource Identifier) 문자열

두 번째 인자 :  Mongoose 설정 객체로, 주로 Mongoose와 MongoDB 드라이버의 옵션을 설정합니다.(버전6.0이후 생략)

 

/ 4가지 옵션 /

- useNewUrlParser: true 

MongoDB Node.js 드라이버에서 사용하는 MongoDB 연결 URL 구문 분석기가 새로운 구문 분석기로 변경되었기 때문에 필요합니다. 이 옵션을 설정하지 않으면 새로운 URL 구문 분석기를 사용하지 않고 이전 구문 분석기를 사용하게 됩니다.

- useUnifiedTopology: true

MongoDB 드라이버에서 사용하는 기본 토폴로지 엔진을 변경합니다. 이전에는 기본 엔진이 몽고DB 드라이버가 아닌 노드 드라이버였는데, 이제는 몽고DB 드라이버로 변경되었습니다. 이 변경으로 인해 애플리케이션의 연결 관리가 더욱 개선되었습니다.

 

- useCreateIndex: true

Mongoose에서 내부적으로 유니크 인덱스를 생성하는 데 사용됩니다. 이를 통해, 색인을 만들 때 경고가 발생하지 않도록 해주며, 이 옵션이 없을 경우 색인을 만들 때 경고 메시지가 나타납니다.

 

- useFindAndModify: false

findOneAndUpdate()와 findOneAndDelete() 메소드를 사용할 때 기본값으로 설정된 옵션입니다. 

'true' : findAndModify() 메서드를 사용(권장하지 않음)

'false' : findOneAndUpdate() 및 findOneAndDelete() 메서드를 사용(권장)

 

 

/ 버전에 따른 옵션 설정 /

Mongoose 6.0부터는 위 4가지 옵션을 명시하지 않아도 자동으로 활성화 됩니다. 

 

 

/ 버전 6.0이후 /

 

> 로컬

const mongoose = require('mongoose');

const MONGO_URI = 'mongodb://localhost:27017/my_database';

mongoose.connect(MONGO_URI)
  .then(() => console.log('MongoDB connected!'))
  .catch((err) => console.log(err));

 

27017 = 몽고db 기본 포트번호

기본포트번호를 사용한다면 명시하지 않아도 됨.

 

 

> 몽고DB Atlas등 클라우드 사용시

const mongoose = require('mongoose');

const MONGO_URI = 'mongodb+srv://<username>:<password>@cluster0.example.com/my_database';

mongoose.connect(MONGO_URI)
  .then(() => console.log('MongoDB connected!'))
  .catch((err) => console.log(err));

(URI 구조를 비교하기 위한 것으로, 클라우드 이용관련 자세한 것은 나중에 기록하겠습니다)

 

 

728x90

 

 

> 스키마 정의 및 모델 정의

 

Mongoose를 사용하면 스키마를 정의하고 이를 기반으로 모델을 만들 수 있습니다. 스키마는 데이터의 유효성을 검증하고 데이터베이스에 저장되는 방식을 정의합니다. 이렇게 정의한 모델은 MongoDB에서 컬렉션을 나타내는 것과 유사합니다.

 

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema(
{
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  },
  age: {
    type: Number,
    default: 0
  }
},
{
  timestamps: true
}

);

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

module.exports = User;

 

mongoose.Schema() 메소드를 사용하여 데이터를 저장할 스키마를 정의합니다.

유저 정보를 저장하기 위한 스키마를 정의한 것으로, 각각의 필드는 데이터 타입과 함께 유효성 검사 규칙도 정의되어 있습니다.

mongoose.model() 메소드를 사용하여 해당 스키마에 대한 모델을 정의합니다.

 

< timestamps 옵션 >

timestamps: true 옵션을 사용하면 두 가지 속성이 자동으로 추가됩니다.

1) createdAt : 생성된 날짜를 나타내는 날짜
2) updatedAt : 마지막으로 업데이트된 날짜를 나타내는 날짜

 

 

 

> 사용자 생성

 

스키마를 이용하여 새모델을 생성합니다. 모델은 컬렉션과 상호작용하는데 사용됩니다.

 

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

const newUser = new User({
  name: 'John Doe',
  email: 'johndoe@example.com',
  password: 'password123'
});

newUser.save().then(() => {
  console.log('User created...');
}).catch((err) => {
  console.log(err);
});

 

new User()를 통해 새로운 사용자를 생성하고, save() 메소드를 사용하여 해당 사용자를 MongoDB에 저장합니다.

save() 메소드를 호출하면 데이터베이스에 새로운 문서(document)가 생성됩니다.

이렇게 스키마를 작성하고 모델을 생성하면 몽고DB에서 컬렉션을 생성하고 데이터를 저장할 수 있습니다.

 

 

자세한 내용은 Mongoose 공식문서에서 확인하세요.

 

 

728x90
반응형