본문 바로가기

기술/MongoDB

mongoose로 서버와 데이터베이스 연결하기 (+ dotenv), 스키마 와 모델 생성하기

mongoose

mongoose는 Node.js 환경에서 사용하는 MongoDB 기반 ODM(Object Data Modeling) 라이브러리입니다. 이 라이브러리는 데이터베이스 문서들을 자바스크립트 객체처럼 사용할 수 있게 해줍니다. (리액트를 다루는 기술 _p.643) 

1. mongoose, dotenv 설치하기

프로젝트 디렉토리, package.json 파일이 있는 디렉터리에서 다음 명령어를 입력하여 mongoose와 dotenv를 설치합니다. 

$ npm install mongoose dotenv

2. 환경변수 설정하기 

dotenv

  • 환경변수들을 파일에 넣고 사용할 수 있게 해주는 개발 도구
  • mongoose를 사용하면서 개발 환경에 따라 달라질 수 있는 데이터를 코드안에 하드코딩하지 않고 환경변수로 설정해 두기 위해 사용합니다. 
  • 프로젝트 최상위 디렉토리에 .env 파일을 만들어 해당 파일에 필요한 환경변수를 저장해 두고, 필요한 파일에서 임포트해서 씁니다. 
  • 다른 컴퓨터, 개발 환경에서 이 프로젝트를 실행 할 때에는 환경 변수가 달라지기 때문에 프로젝트를 깃헙이나 깃랩에 올릴 때에는 .env을 .gitignore 처리를 해주어야 합니다. 

.env example

PORT=4000
MONGO_URI=mongodb://localhost:27017/blog

env 파일에서 선언한 변수들은 js 파일에서 dotenv를 불러와서 config함수를 호출한 뒤, node js에서는 process.env 값으로 조회할 수 있습니다. 

src/index.js example

require('dotenv').config();

const { PORT, MONGO_URI } = process.env;

 

이렇게 process.env 로 조회한 값을 비구조화 할당을 해주면 env 파일에서 선언한대로 PORT = 4000, MONGO_URI = mongodb://localhost:27017/blog 로 값을 사용할 수 있습니다. 

그러니까 사용 환경이 바뀔 때마다 이 코드를 직접 찾아서 고치지 않고, 가장 최상위에 있는 env 파일에 변수만 수정해주면 되니까 유지 보수 나 재사용성이 높아집니다. 


3. 서버와 데이터베이스 연결하기 

mongoose의 connect 함수를 사용하여 서버와 데이터베이스를 연결할 수 있습니다. 

mongoose를 사용하기 위해 임포트하고, conncect 함수에 env 파일에 정의해서 가져왔던 MONGO_URI 환경변수와 옵션을 파라미터로 전달합니다. 

const mongoose = require('mongoose');

...

mongoose
	.connect(MONGO_URI, { useNewUrlParser: true, useFindAndModify: false })
    	.then(() => {
        	console.log('connected to mongoDB');
        })
        .catch(e => {
        	console.log(e);
        });
        
...
  • { useNewUrlParser : true } 를 해주지 않으면 파싱 문제가 발생하여 deprecation 에러가 뜹니다. 
  • { useFindAndModify : false } 역시 그대로 두면 deprecation 에러가 뜹니다. 

4. 데이터베이스 스키마모델 생성 

mongoose에서 스키마란 데이터베이스 문서 내부의 각 필드가 어떤 형식으로 되어 있는지 정의하는 객체입니다. ... 모델은 스키마를 사용하여 만든 인스턴스로 데이터베이스에서 실제 작업을 처리하는데 필요한 함수들을 가지고 있는 개체입니다. (리액트를 다루는 기술_p.651)

schema

스키마 객체를 선언한 파일들은 src/models라는 새로운 디렉토리를 만들어 한 곳에 저장해 두는 것이 관리하기 쉽습니다. 

mongoose 모듈인 Schema로 스키마 객체를 만들어 선언합니다. 

필드 이름과 해당 필드의 데이터 타입을 설정하면 됩니다. 

// src/models/sample.js

const mongoose = require('mongoose');

const { Schema } = mongoose;

const SampleSchema = new Schema({
	fieldName: DataType,
    ...
});

const Sample = mongoose.model('Sample', SampleSchema);
export default Sample;

하단의 코드는 생성한 스키마를 mongoose.model 함수로 모델 인스턴스를 만들기 위한 코드입니다. 다음과 같이 사용할 수 있는 함수입니다. 그리고 생성한 모델 인스턴스를 외부 파일에서 사용할 수 있도록 하기 위해 export 해줍니다. 

mongoose.model('스키마 이름', 스키마 객체);

 

다음과 같은 데이터 타입들이 지원됩니다.

Type Type Description
String 문자열
Number 숫자
Date 날짜
Buffer 파일을 담을 수 있는 버퍼
Boolean true / false
Mixed(Schema.Types.Mixed) 어떤 데이터도 넣을 수 있는 형식
ObjectId(Schema.Types.ObjectId) 객체 아이디
Array 배열 => 형태: [ ... ]

model

모델은 src/models 라는 새로운 디렉토리를 만들어 모두 여기서 관리해주는 것이 좋습니다. 

models 디렉토리에 모델을 정의하기 위한 js 파일을 다음과 같이 만듭니다.


5. 데이터 생성조회

데이터베이스에 저장된 컬랙션은 POST를 통해 데이터를 생성하고, GET으로 조회할 수 있게 됩니다.  

이는 router를 이용해서 연결된 데이터베이스로 post, get, delete, put, patch 등의 request를 보내 처리할 수 있게 됩니다. 

 


References

'기술 > MongoDB' 카테고리의 다른 글

Mac에서 Homebrew를 이용해서 mongoDB 설치  (0) 2021.02.25