타닥타닥 개발자의 일상

윈도우에서 MongoDB, Mongosh 설치. Mongoose 이용해서 Node 환경에서 JS 파일로 데이터 삽입하기 본문

코딩 기록/JavaScript

윈도우에서 MongoDB, Mongosh 설치. Mongoose 이용해서 Node 환경에서 JS 파일로 데이터 삽입하기

NomadHaven 2024. 3. 5. 11:24

 

1. MongoDB 를 윈도우에서 설치한다.

https://www.youtube.com/watch?si=VdpwP_r8PRZJOupG&v=MCpbfYvvoPY&feature=youtu.be

위의 튜토리얼을 참고하면 되는데,

참고해야할 부분은

1. 몽고디비 인스톨시에 설정

2. 환경 변수 설정하고 몽고 디비 커맨드 환경에서 바로 호출

3. 커맨드 창에서 mongod 입력하고 서버 잘 구동되는지 확인

 

참고로 3번 부분에서 멋대로 커맨드창을 닫기 하면 안된다. ctrl+C를 통해서 안정적으로 서버를 종료한뒤 커맨드 창을 닫아야 한다. 이 절차 없이 커맨드 창을 닫았다가, 몽고가 비정상적 서버종료로 인식해서 프로그램에 lock을 거는 경우가 생긴다. lock이 걸리면 몽고 서버 자체에 연결 안되는 오류가 생겨서 골치 아파진다. 혹자는 .lock 파일을 삭제하면 된다고 하지만.. 본인 같은 경우에는 그냥 몽고를 삭제하고 다시 깔아서 오류를 해결했다.

 

여기 까지다. 이후에 파워쉘 추가로 하나 더 켜서 mongo입력하고 몽고db 서버에 연결하는 부분 부터는

오류가 난다.

이후에 mongodb가 업데이트 되어서 mongo라는 명령어가 먹히지 않게 되었기 때문이다.

이제 mongosh라는 커맨드를 써서 몽고 서버와 연결해야 하는데, 이때는 추가로 설치 및 환경변수 구성이 필요하다.

 

 

 

그부분 역시 다행히 mongodb 사이트에 나와 있다.

https://www.mongodb.com/docs/mongodb-shell/install/

 

Install mongosh — MongoDB Shell

Docs Home → MongoDB Shell To use the MongoDB Shell, you must have a MongoDB deployment to connect to.You can use the MongoDB Shell to connect to MongoDB version 4.2 or greater.You can install MongoDB Shell 2.0.0 on these operating systems:Operating Syste

www.mongodb.com

상기의 사이트에서 mongosh 설치 방법을 참고하면 된다.

설치 방법은 mongodb 랑 거의 유사하다.

 

위의 mongosh 까지 설치 완료한다면

 

파워쉘에서 mongodb 명령어를 입력해 몽고db 서버가 잘 작동하는지 확인한다.

잘 작동한다면 새로 파워쉘 창을 켜서 mongosh 명령어를 입력한다.

 

mongosh 명령어를 통해 mongodb 서버와 잘 연결이 되었다면 위와 같은 화면이 뜬다.

 

그렇다면 잘 설치해 놓은 mongodb 서버에, 

Node로 로드된 JS 파일을 통해서 데이터를 삽입하는 방법은 무엇일까?

 

바로 파워쉘 커맨드 창에서 mongodb 서버에 데이터를 삽입하는 방법도 있다. 하지만,

JS 개발 환경에서 JS 파일로 데이터를 삽입하고, JS 환경에서 바로 mongodb 서버에 접속해 데이터를 관리하면 훨씬 편할 것이다.

 

그러기 위한 도구가 바로 Mongoose라는 도구이다.

mongsoose는 mogodb에 넣고 싶은 자신의 데이터를 모델링해서 데이터 삽입을 도와주는 도구로, 데이터 스키마 생성, 데이터 조회, 삽입, 편집등의 기능도 지원해주는 도구이다.

 

https://mongoosejs.com/

 

Mongoose ODM v8.2.1

Let's face it, writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose. const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/test'); const Cat = mongoose.model('Cat', { name:

mongoosejs.com

 

몽구스를 이용하기 위해서는 몽구스를 설치부터 해야한다.

 

터미널을 git-bash 환경으로 설정해 놓고 moogse를 설치하자

npm install mongoose --save

몽구스가 잘 설치되었다면 노드 모듈 디렉토리에서 확인이 가능하다.

또한 본인이 데이터 스키마를 생성하고, 데이터를 삽입할 코드를 작성할 index.js파일을 만들어야 한다.

 

index.js 파일의 내용은 아래와 같다.

const mongoose = require("mongoose");
// moviceApp 데이터 베이스에 연결. 
//moviceApp 데이터 베이스가 없어도 괜찮다. 이 구문이 만들어 줄것.
mongoose
  .connect("mongodb://127.0.0.1:27017/movieApp")
  .then(() => {
    console.log("CONNECTION OPEN");
  })
  .catch((err) => {
    console.log("OH NO ERROR!");
    console.log(err);
  });

//movieSchema이라는 스키마 생성
const movieSchema = new mongoose.Schema({
  title: String,
  year: Number,
  score: Number,
  rating: String,
});

//Movice라는 class를 생성. 
//model메서드로 생성한 스키마를 클래스와 연결
//파라미터는 클래스 이름, 스키마이름 순으로 적는다.
const Movie = mongoose.model("Movie", movieSchema);

 

위와 같이 코드를 작성해서 기본적인 몽구스 연결과 스키마 생성 및 스키마와 클래스 연결 설정 같이 마쳤다.

그렇다면 위의 코드를 노드 환경에서 활성화 하려면 어떻게 해야 되는가?

 

우슨 노드 환경을 활성화해야 한다. 터미널에서 노드 명령어 입력.

node

 

그 다음 활성화된 node 셸에서 

 

.load index.js

명령어를 입력한다.

 

 

 

* 참고: 최신 버전의 Node.js를 사용하는 경우 JS 파일에서 몽구스 모듈을 가져오고 강의 코드를 실행할 때 .load index.js 명령을 사용하면 버그가 발생할 가능성이 있습니다.

 

.load index.js명령을 node 셸에 입력하면 const mongoose = require('mongoose');코드 라인이 무한 루프로 출력되는 버그가 발생합니다.

 

해결 방법:

node 셸에서 .load index.js를 사용하지 말고,

시스템 터미널에서 

node -i -e "$(< index.js)

 명령을 사용.(node 셸 외부에서, 먼저 디렉터리를 index.js 파일이 있는 폴더로 변경). 

 

이렇게 하면 하나의 명령으로 파일을 로드하여 node 셸을 시작할 수 있고 문제가 해결.

명령을 위에 표시된 대로 정확히 입력해야 한다.

 

위의 명령어를 실행한 이후에는 노드 셸에서 

.load index.js

를 실행해도 오류 없이 잘 실행된다.

 

만약 index.js 파일이 잘 로드 되었다면 

아래와 같이 연결 성공시 출력되도록 설정해 놓은 CONNECTION OPEN이라는 문구가 출력될 것이다.

 

 

이후에는 몽구스에서 지정한 문법에 따라 데이터를 삽입하면 된다.

아래는 insertMany()라는 몽구스의 메서드를 이용해서 다수의 데이터를 Moive라는 클래스에 삽입한 코드이다.

이 코드 역시 index.js 파일에 작성되었다.

 

 Movie.insertMany([
 { title: "Amelie", year: 2001, score: 8.3, rating: "R" },
 { title: "Alien", year: 1979, score: 8.1, rating: "R" },
 { title: "The Iron Giant", year: 1999, score: 7.5, rating: "PG" },
 { title: "Stand By Me", year: 1986, score: 8.6, rating: "R" },
 { title: "Moonrise Kingdom", year: 2012, score: 7.3, rating: "PG-13" },
]).then((data) => {
   console.log("IT WORKED!");
   console.log(data);
 });

데이터가 잘 삽입 되었다면 IT WORKED 라는 구문이 출력된 다음,

삽입된 데이터가 출력되도록 설정한 코드이다.

 

 

index.js 파일의 전체코드는 아래와 같은 모습이다.

 

const mongoose = require("mongoose");
//test 데이터 베이스에 연결. 없어도 괜찮다. 이 구문이 만들어 줄것.
mongoose
  .connect("mongodb://127.0.0.1:27017/movieApp")
  .then(() => {
    console.log("CONNECTION OPEN");
  })
  .catch((err) => {
    console.log("OH NO ERROR!");
    console.log(err);
  });

//스키마 생성
const movieSchema = new mongoose.Schema({
  title: String,
  year: Number,
  score: Number,
  rating: String,
});

//Movice라는 class를 생성. 데이터 베이스, 스키마이름 순으로 적는다.
const Movie = mongoose.model("Movie", movieSchema);



Movie.insertMany([
 { title: "Amelie", year: 2001, score: 8.3, rating: "R" },
 { title: "Alien", year: 1979, score: 8.1, rating: "R" },
 { title: "The Iron Giant", year: 1999, score: 7.5, rating: "PG" },
 { title: "Stand By Me", year: 1986, score: 8.6, rating: "R" },
 { title: "Moonrise Kingdom", year: 2012, score: 7.3, rating: "PG-13" },
 ]).then((data) => {
  console.log("IT WORKED!");
   console.log(data);
 });

 

 

위의 코드를 작성 뒤, 노드셸에서  아래의 명령문을 실행하자.

 

.load index.js

 

 

몽고db서버에 잘 연결되어 데이터가 성공적으로 삽입되었다면 터미널에 아래와 같은 결과가 출력된다.

 

 

> .load index.js
const mongoose = require("mongoose");
//test 데이터 베이스에 연결. 없어도 괜찮다. 이 구문이 만들어 줄것.
mongoose
  .connect("mongodb://127.0.0.1:27017/movieApp")
    .then(() => {
        console.log("CONNECTION OPEN");
          })
            .catch((err) => {
                console.log("OH NO ERROR!");
                    console.log(err);
                      });

                      //스키마 생성
                      const movieSchema = new mongoose.Schema({
                        title: String,
                          year: Number,
                            score: Number,
                              rating: String,
                              });

                              //Movice라는 class를 생성. 데이터 베이스, 스키마이름 순으로 적는다.
                              const Movie = mongoose.model("Movie", movieSchema);

                              // const amadeus = new Movie({
                              //   title: "Amadeus",
                              //   year: 1986,
                              //   score: 9.2,
                              //   rating: "R",
                              // });

                              // Movie.insertMany([
                              //   { title: "Amelie", year: 2001, score: 8.3, rating: "R" },
                              //   { title: "Alien", year: 1979, score: 8.1, rating: "R" },
                              //   { title: "The Iron Giant", year: 1999, score: 7.5, rating: "PG" },
                              //   { title: "Stand By Me", year: 1986, score: 8.6, rating: "R" },
                              //   { title: "Moonrise Kingdom", year: 2012, score: 7.3, rating: "PG-13" },
                              // ]).then((data) => {
                              //   console.log("IT WORKED!");
                              //   console.log(data);
                              // });

Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 152,
  [Symbol(trigger_async_id_symbol)]: 151
}
> CONNECTION OPEN
> Movie.find({}).then(data =>console.log(data))
Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 835,
  [Symbol(trigger_async_id_symbol)]: 831
}
> [
  {
    _id: new ObjectId('65e57d283c40e2d5368b0471'),
    title: 'Amadeus',
    year: 1986,
    score: 9.5,
    rating: 'R',
    __v: 0
  },
  {
    _id: new ObjectId('65e663502e7a641811485222'),
    title: 'Amelie',
    year: 2001,
    score: 8.3,
    rating: 'R',
    __v: 0
  },
  {
    _id: new ObjectId('65e663502e7a641811485223'),
    title: 'Alien',
    year: 1979,
    score: 8.1,
    rating: 'R',
    __v: 0
  },
  {
    _id: new ObjectId('65e663502e7a641811485224'),
    title: 'The Iron Giant',
    year: 1999,
    score: 7.5,
    rating: 'PG',
    __v: 0
  },
  {
    _id: new ObjectId('65e663502e7a641811485225'),
    title: 'Stand By Me',
    year: 1986,
    score: 8.6,
    rating: 'R',
    __v: 0
  },
  {
    _id: new ObjectId('65e663502e7a641811485226'),
    title: 'Moonrise Kingdom',
    year: 2012,
    score: 7.3,
    rating: 'PG-13',
    __v: 0
  }
]
> Movie.find({rating:'PG-13'}).then(data =>console.log(data))
Promise {
  <pending>,
  [Symbol(async_id_symbol)]: 1195,
  [Symbol(trigger_async_id_symbol)]: 1191
}
> [
  {
    _id: new ObjectId('65e663502e7a641811485226'),
    title: 'Moonrise Kingdom',
    year: 2012,
    score: 7.3,
    rating: 'PG-13',
    __v: 0
  }
]
>


Comments