서버 개발 시 데이터 베이스를 사용하면 웹 서비스에서 사용되는 데이터를 저장, 효율적으로 조회하거나 수정할 수 있고
MySQL이나 OracleDB 같은 관계형 데이터 베이스를 자주 사용한다,
문제는 이런 관계형 데이터 베이스는 데이터의 형태 등이 고정적입니다. 즉 SQL 형태의 데이터를 처리해주는 데이터 베이스인데 이러한 새로운 데이터의 형태가 기존의 데이터와 다르면 새로 데이터를 등록해야 하고, 이렇게 데이터의 양이 많아지면 스키마를 변경하는 작업이 매우 번거롭다.
즉 데이터의 양이 늘어났을 때 이 데이터를 분산시켜서 저장하는 것이 아니라 해당 데이터베이스 서비의 선능을 업그레이드 하는 방식으로 확장합니다.
MongoDB는 NoSQL 데이터 베이스 입니다.
- 이 데이터 베이스에 들어가는 데이터들은 유동적인 스키마를 가지고 있다.
즉 종류가 같거나 등록해야 할 데이터의 형태가 달라져도 기존에 저장된 데이터는 수정할 필요 없고, 여러 컴퓨터로 분산하여 처리할 수 있기 쉽게 설계하였다.
데이터의 구조가 유동적으로 변한다면 MongoDB
만약 데이터를 필터링 하거나 ACID 특성을 지킨다면 RDBMS가 유리
문서
RDBMS의 레코드와 비슷한 개념
문서의 데이터 구조는 키 - 값의 구조
문서의 예시
{
"_id": ObjectId("5099803df3f4948bd2f98391"),
"username": "velopert",
"name": { first: "M.J.", last: "Kim" }
}
문서는 BSON - 바이너리 형태의 JSON 형태로 저장된다.
그러힉 때문에 JSON 형태의 객체를 데이터 베이스에 저장 할 때 큰 힘이 들지 않고 데이터를 데이터 베이스에 등록 할 수 있습니다,
문서에는 각각 고유한 ID 값이 새엇ㅇ되는데 이는 시간,머신아이디,프로세스아이디,순차번호 순으로 등록 됐기 때문에 고유성을 가지고 있다.
여러 문서가 들어 있는 공간을 컬랙션이라고 한다.
기존의 RDBMS는 테이블의 형태이기 때문에 각 각의 테이블 마다 스키마라는 데이터의 일종의 형태를 가지고 있어야 하고 새로운 데이터가 들어왔을 때 그 데이터가 다른 스키마를 가지고 있다면 기존 데이터의 스키마 또한 모두 바뀌어야 한다.
RDBMS 의 형태 - username, name 등이 스키마 로 정해진 상태로 정해진 고정된 데이터 베이스 형태
{
"_id": ObjectId("5099803df3f4948bd2f98391"),
"username": "velopert1",
"name": { first: "S.W.", last: "Jin" }
}
{
"_id": ObjectId("5099803df3f4948bd2f91234"),
"username": "velopert2",
"name": { first: "M.J.", last: "Kim" }
}
MongoDB 스키마의 형태가 정해져 있지 않고 유동적으로 문서를 작성할 수 있다
{
"_id": ObjectId("594948a081ad6e0ea526f3f5"),
"username": "velopert"
},
{
"_id": ObjectId("59494fca81ad6e0ea526f3f6"),
"username": "velopert2",
"phone": "010-1234-1234"
}
즉 MongoDB 서버는 여러 스키마의 형태로 저장된 문서들을 모은 컬렉션을 여러 개 가지고 있다.
관계형 데이터 베이스의 동작 원리는 NoSQL 데이터 베이스와 거의 다릅니다.
RDBMS는 각 포스트나 댓글마다 테이블을 각각 만들어서 필요에 따라 JOIN 해서 사용하는 것이 일반적
NoSQL에서는 모든 것을 문서 한개에 담아서 사용
{
_id: ObjectId,
title: String,
body: String,
username: String,
createdDate: Date,
comments: [
{
_id: ObjectId,
text: String,
createdDate: Date, },
],
};
MongoDB는 댓글을 포스트 문서 내부에 넣어서 관리하고 문서 내부에 또 다른 문서가 위치할 수도 있고 이를 서브다큐먼트라고 한다.
서브 다큐먼트에서 용량 초과할 것 같다면 컬렉션을 분리해야한다.
MongoDB 설치
에러 발생
2023.04.15 - [React] - 에러 'mongo'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다.
Koa로 생성한 서버에 MongoDB 연동하기
mongoose 설치
mongoose는 Node.js 환경에서 사용되는 MongoDB 기반 ODM 라이브러리 이다
이 라이브러리는 데이터 베이스의 문서를 JS 객체 처럼 사용 할 수 있다.
$ yarn add mongoose
dotenv는 환경 변수들을 파일에 넣고 사용할 수 있게 해주는 개발 도구
id passwd 같은 보안이 피요하거나 환경에 따라 바뀌는 변수들은 코드 안이 아니라 환경 변수로 설정하는 것이 좋다
.gitignore 파일을 통해 깃허브 등의 서비스에서 이러한 환경 변수를 제외 시킨다.
$ yarn add dotenv
dotenv 라이브러리는 별도의 설정이 없다면 현 디렉토리의 .env 파일을 환경 변수 파일로 보고 거기서 환경 변수를 가져옵니다.
환경 변수 생성하고 key-value 형태로 서버에서 사용할 포트와 MongoDB 주소를 넣습니다.
// .env
PORT=4000
MONGO_URI=mongodb://localhost:27017/blog
이렇게 .env 파일에 저장해놓은 환경 변수들은 dotenv 라이브러리를 이용해서 process.env로 호출할 수 있습니다.
현재 실행중인 JS 파일들의 최상위 위치 - index.js에 dotenv를 임폴트 한 후 config로 구성하면 됩니다.
// dotenv 를 통한 환경 변수 호출
require('dotenv').config();
const Koa = require('koa');
const Router = require('koa-router');
...
// 비구조화 할당을 통해 process.env 내부 값에 대한 레퍼런스 만들기
const { PORT } = process.env;
console.log("포트번호 : " + process.env.PORT);
process.env 를 통해서 환경 변수 값을 가져올 수 있습니다.
위의 예를 들면 PORT = 4000이라는 환경 변수를 index.js 파일로 가져와서 출력하면 아래와 같은 결과가 나오게 됩니다.
mongoose를 이용하여 서버와 DB를 연결할 수 있는데 이때 connect 라는 함수를 사용합니다.
const mongoose = require('mongoose');
// 비구조화 할당을 통해 process.env 내부 값에 대한 레퍼런스 만들기
const { PORT, MONGO_URI } = process.env;
// connect 함수를 이용해서 mongoDB와 연동
mongoose
.connect(MONGO_URI, { useNewUrlParser: true, useFindAndModify: false })
.then(() => {
console.log('Connected to MongoDB');
})
.catch(e => {
console.error(e);
});
'React' 카테고리의 다른 글
Reactmongoose를 이용한 MongoDB 연동 실습3 파일 생성, 조회, 검색 (0) | 2023.04.16 |
---|---|
에러 'mongo'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. (0) | 2023.04.15 |
ESLint와 Prettier (0) | 2023.04.15 |
서버 사이드 렌더링 (0) | 2023.04.14 |
서버 사이드 렌더링 - 개발 환경 만들기 (0) | 2023.04.14 |