본문 바로가기
공허의 유산/사상의 도구

[MDN/Express] 04.Express Tutorial Part 3: Using a Database (with Mongoose) (1)

by 바른생활머시마 2023. 6. 1.
728x90
반응형

앞에서 자동 생성 된 프로젝트의 구조를 살펴보았습니다.

https://learn-and-give.tistory.com/115

 

[MDN/Express] 03.Express Tutorial: The Local Library website(2)

앞에서 동네 도서관 프로젝트를 위한 기본 코드 생성까지 살펴보았습니다. https://learn-and-give.tistory.com/114#comment13660711 [MDN/Express] 02.Express Tutorial: The Local Library website(1) 앞에서 Node.js의 기초적인 내

learn-and-give.tistory.com

이제 DB를 사용하는 방법을 알아보겠습니다. 도서관 직원이 보유 도서에 대한 정보를 관리하는 시나리오를 가정하고 진행 해 나가겠습니다.

 

 

Mongoose

Mongoose라는 이름을 보고, MongoDB의 새로운 파생 버젼인가 싶었는데, 그것은 아니고 MongoDB를 Node.js에서 편리하게 사용 할 수 있게 해주는 모듈입니다.

https://mongoosejs.com/

 

Mongoose ODM v7.2.2

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

 

Node.js가 MongoDB만 사용 할 수 있는 것은 아니고 여러가지 유명한 DB도 다 사용 할 수 있습니다. 목적에 맞는 적절한 것을 고르면 됩니다. 각 DB별 적용 방법은 별도 자료를 참고 하면 됩니다.

 

 

DB연동방식

SQL문을 직접 전달하여 사용하는 방식이 있고, 데이터를 오브젝트화 하여 사용하는 방법(ODM)이 있습니다. 성능을 고려하면 SQL문을 사용하는 것이 좋은데, ODM 방식은 개발자가 특별한 DB에 대한 전문 지식 없이 기존의 Javascript 지식을 가지고 사용 할 수 있다는 장점이 있습니다. 바로, MongoDB를 쉽게 사용 할 수 있게 해주는 ODM이 바로 Mongoose입니다. Mongoose 외에 다른 ODM도 여러 개 있으며, 특정 ODM이 여러 개의 DB를 지원하기도 합니다. MongoDB는 NoSQL DB로써 데이터가 JSON 문서와 같은 형태로 저장 됩니다. Firebase의 Cloud Database와 같죠.

 

 

도서관 모델

도서관에서 사용 할 데이터는 어떤 형태로 할지 미리 설계를 하고 코드 작성을 하도록 합니다.

 책의 여러가지 속성(제목/요약/작가/장르/ISBN/...)이 있고,  같은 책이 여러권 있을 수 있고, 개별 책을 구별하는 식별 정보, 대출 상태 등이 있을 수 있습니다. 작가 정보도 이름만 저장하거나 더 많은 정보도 저장 할 수 있습니다. 정렬 기준으로는 무엇을 사용할지도 고려해야 하구요. 또한, 어떤 속성은 임의 입력이 아니라 지정 된 목록 중에서 선택하는 것일 수도 있습니다. 이런 저런 검토를 하여, 이 예제에서는 아래와 같은 모델을 사용하기로 하였습니다.

 

 

비동기식 Database API

DB의 데이터 조작은 비동기로 처리 됩니다. 이 말은 어떤 API는 호출 즉시 리턴되며, 그 결과는 처리 후에 따로 통지 됩니다.  이 처리 중에도 서버는 응답이 가능한 상태로 남아 있게 됩니다. callback 방식으로 처리 되는데 Javascript의 Promises로 처리 됩니다. 관련 된 여러가지 자료 역시 MDN에 있으니 참고하도록 하고, 아래 코드의 진행 순서를 살펴 보도록 하겠습니다.

async function myFunction {
  // ...
  await someObject.methodThatReturnsPromise();
  // ...
  await aFunctionThatReturnsPromise();
  // ...
}

try {
  // ...
  myFunction();
  // ...
} catch (e) {
 // error handling code
}

 myFunction()은 비동기 함수이며, try 구문 내에서 호출 됩니다. 이 함수가 실행되면, 코드 실행은 promise가 resolve가 되기 전까지는 methodThatReturnsPromise에서 중지 됩니다. 그 후 aFunctionThatReturnsPromise까지 계속 진행된 후 다시 대기를 합니다. 이 과정에서 오류가 발생하면 catch 내의 코드가 실행됩니다.(....사례를 보고 이해하는게 좋겠네요.)

 

 위의 비동기 함수들은 순서대로 진행 되는 경우이고, 이 메소드들이 서로 관계가 없다면, 병렬로 진행 되어도 됩니다. 즉, 다른 코드의 처리가 완료 될 때까지 기다릴 필요가 없는 경우이죠. 이것은 Promise.all() 메소드로 구현되며, 적절한 promise 입출력 인자를 사용합니다. 아래 코드가 그 예입니다.

async function myFunction {
  // ...
  const [resultFunction1, resultFunction2] = await Promise.all([
     functionThatReturnsPromise1(),
     functionThatReturnsPromise2()
  ]);
  // ...
  await anotherFunctionThatReturnsPromise(resultFunction1);
}

promise를 리턴하는 두 개의 비동기 함수를 await Promise.all로 호출하고 처리가 끝날때까지 기다렸습니다. 그 후에 그 결과를 이용하여, 앞의 순차적 진행 형태로 다른 비동기함수를 또 호출하였습니다. 이처럼 await/ async와 함께 Promise를 사용하면 유연하고 이해하기 쉬운 코드 작성이 가능합니다. (....라고 하지만 실제로 여러 유형을 해봐야 이해가 잘 되겠네요.)

 

 

Mongoose와 MongoDB 설치

Mongoose는 npm install을 이용하여 간단히 설치 할 수 있으며, 이 때 필요한 것들이 함께 설치 됩니다. 그런데,  MongoDB driver는 함께 설치가 됩니다만, MongoDB 자체를 설치 해 주지는 않습니다. MongoDB는 사전에 환경에 맞게 설치 해줘야 합니다. (혹은, Cloud-based MongoDB를 사용 할 수도 있어요.) 이 tutorial에서는 MongoDB Atlas라는 cloud DB를 사용한다고 하는데, 경험삼아 이것을 써보는 것도 좋겠네요.

 

계정을 만들고 이메일 인증~

 

간단한 정보 입력도 해주고~

무료 서비스 등록을 해주고... 다행히 카드 번호 입력 같은 것은 없으니 심리적 부담은 없네요.

그 후에 접속 계정이나 접속 IP 설정 등의 보안 설정을 하게 됩니다. 제대로 한 것인지 모르겠네요. ㅋ

결과적으로 뭐가 만들어지긴 했는데... 나중에 잘 안되면 로컬에 그냥 설치하도록 하죠.

connect를 눌러보니 연결 방법 설정 화면이 나오는데, Mongoose가 MongoDB driver로 연결 한다고 했으니, 일단 Driver로 연결하는 것으로 설정 해 보겠습니다.

 

Driver를 선택하면 접속 방법을 알려주는 화면이 나옵니다.

 

먼저 mongoDB를 설치합니다.

 

계정 정보는 어디에 어떻게 입력해야 하는지 잘 모르겠는데, 샘플 코드 보기를 눌러보니 참고가 될 것 같네요. 일단 코드를 복사해두도록 하겠습니다.

...

저 코드를 어디에 넣어야 하나 싶어서 tutorial을 살펴보니 뒤에서 MongoDB Atlas 설정에 대한 자세한 내용을 뒤에서 소개 해 주니까 너무 부담을 갖지는 않아도 되겠네요.

 

MongoDB에 연결

MongoDB에 연결하기 위해서는 Mongoose를 require로 가져와 사용해야 합니다. 

... 그런데, 이코드를 어디에 넣어야 하는지 표시가 되어 있지 않네요. 일단, 잘 모르겠으니, app.js 의 가장 마지막 부분 export 앞에 추가를 해두도록 하겠습니다.

// Import the mongoose module
const mongoose = require("mongoose");

// Set `strictQuery: false` to globally opt into filtering by properties that aren't in the schema
// Included because it removes preparatory warnings for Mongoose 7.
// See: https://mongoosejs.com/docs/migrating_to_6.html#strictquery-is-removed-and-replaced-by-strict
mongoose.set("strictQuery", false);

// Define the database URL to connect to.
const mongoDB = "mongodb://127.0.0.1/my_database";

// Wait for database to connect, logging an error if there is a problem
main().catch((err) => console.log(err));
async function main() {
  await mongoose.connect(mongoDB);
}

 

이렇게 한 후, mongoose의 메쏘드를 이용하여 연결을 할 수 있는데, 그건 나중에 차차 알아봐야 하겠네요.

DB 연동하기는 DB에 대한 설명과 함께 진행되고, DB 자체도 큰 주제라서 내용이 제법 긴 것 같습니다.

다음에는 코드로 모델을 정의/생성하고 사용하는 방법을 해보겠습니다.

 

https://learn-and-give.tistory.com/117

 

[MDN/Express] 05.Express Tutorial Part 3: Using a Database (with Mongoose) (2)

앞에서 MongoDB를 Cloud 환경에서 활용하기 위한 준비를 해보았습니다. 여차하면 로컬 것을 쓰는걸로~ https://learn-and-give.tistory.com/116 [MDN/Express] 04.Express Tutorial Part 3: Using a Database (with Mongoose) (1) 앞에

learn-and-give.tistory.com

 

728x90
반응형

댓글