일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- IntelliJ
- OAuth2.0
- jwt
- 스프링
- 백준
- bcrypt
- RiotAPI
- 스프링부트
- Python
- 코딩
- oAuth
- 백엔드
- frontend
- MongoDB
- 게임
- 유니티
- express
- node.js
- JSON
- c#
- spring
- react
- unity
- netlify
- 게임개발
- springboot
- AWS
- 파이썬
- 프로그래밍
- 깃
- Today
- Total
Unwound Developer
Arcane 프로젝트 - MongoDB와 Mongoose 본문
MongoDB 개요
몽고DB는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이다.
NoSQL 데이터베이스로 분류되는 몽고DB는 JSON과 같은
동적 스키마형 도큐먼트들을 선호함에 따라
전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼간다.
크로스 플랫폼
몽고DB의 정의인데 말이 좀 어려워서 정확하게 무슨 뜻일까 찾아봤습니다.
우선 크로스 플랫폼은 컴퓨터 프로그램, 운영 체제, 컴퓨터 언어, 프로그래밍 언어, 컴퓨터 소프트웨어 등이 여러 종류의 컴퓨터 플랫폼에서 동작할 수 있다는 것을 뜻합니다.
아마 이렇게 다양한 언어와 운영체제에서 작동하기 때문에 크로스 플랫폼 시스템이라고 하는 것 같아요.
관계형 데이터베이스와 도큐먼트 데이터베이스
도큐먼트 지향 데이터베이스는 관계형 데이터베이스(RDBMS)와 대비되는 DB입니다. 보통 학교에서 데이터베이스를 처음 배우거나 할때 관계형 데이터베이스부터 배울텐데요. 관계형 데이터베이스는 데이터가 하나 이상의 열과 행의 테이블(또는 '관계')에 저장되어 서로 다른 데이터 구조가 어떻게 관련되어 있는지 쉽게 파악하고 이해할 수 있도록 사전 정의된 관계로 데이터를 구성하는 정보 모음이라는 뜻을 가지고 있습니다. 그리고, 여기서 관계란 이러한 테이블 간의 상호작용을 기반으로 설정되는 여러 테이블 간의 논리적 연결이라고 합니다. 사진으로 보면 이해하기 편합니다.
도큐먼트 데이터베이스는 테이블 스키마가 정적이지 않고 유동적입니다. 일반적으로 JSON같은 "key:value"를 이용해 record를 저장합니다. RDB랑 달리 트리형 구조를 저장하거나 찾는데 용이합니다. 스키마가 유동적이라는 것은 즉, 레코드 마다 다른 스키마를 가질 수 있다는 뜻입니다. 대신 데이터간 관계를 형성하기에는 좋지 않습니다.
데이터 끼리 다른 스키마를 가짐으로써 일관성이 없어 관계 형성이 어렵습니다. 대신 읽기,쓰기 속도가 빠르기 때문에, 대용량의 데이터를 빠르고 단순하게 읽어오는데 좋습니다.
사실, Arcane 프로젝트를 진행할 때, RDBMS를 사용하는게 더 적합했을 것 같습니다. 처음엔, 데이터 간 관계가 많을 줄 모르고 NOSQL 데이터베이스를 경험해보고자 사용했습니다.
그러나 유저들의 로그인 정보, 그 유저들이 작성한 글과 댓글, 유저들이 검색한 'League of Legends' 전적검색 결과 등 서로 얽히고 섥힌 데이터들이 많았고, 데이터들도 일관성있는 형태였기에 아마 RDBMS가 적합했을 것 같습니다. 어쨌든 NOSQL을 경험해 본 것 자체는 좋은 경험이었습니다.
Mongoose
'몽구스(Mongoose)는 몽고DB와 Express.js 웹 애플리케이션 프레임워크 간 연결을 생성하는 자바스크립트 객체 지향 프로그래밍 라이브러리이다'라고 합니다. 그냥 쉽게 말해서 Express에서 몽고DB를 쉽게 다룰 수 있게 해주는 도구입니다. 만약 Express 환경에서 서버를 작성한다면 Mongoose를 사용해서 엄청 편리하게 MongoDB에 접근할 수 있어요. 무조건 사용하면 좋은 것 같습니다.
MongoDB 사용 예시
우선 로컬에서 작업한 것이아니라 몽고DB 클라우드에서 작업했기 때문에, 클라우드에서 나만의 몽고DB 서버를 만드는 것 부터 시작했습니다. 몽고DB에 로그인하고, 상단 내비게이션 바에서 Resource메뉴에서 Atlas를 선택하면
사진과 같이 Cluster라는 것이 보일텐데, 하나의 데이터베이스를 관리할 단위 정도 인것 같아요. Cluster를 Create하고 나면, Collection으로 갑니다.
comments, histories 등의 Collection이 테이블이라고 보면 됩니다. 저 Collection중 하나를 눌러보면
처럼 해당 컬렉션의 데이터들이 보입니다. 테이블의 역할을 하는 이 Collection들을 만드는 법도 간단합니다. 일단 서버가 시작하는 App.js로 가보면,
import Mongoose from "mongoose";
import { config } from "../config.js";
export async function connectDB() {
return Mongoose.connect(config.db.host);
}
이게 서버에서 MongoDB에 연결하는 것의 전부입니다. config.db.host는 우리 몽고DB 연결 URL입니다. Mongoose.connect( 몽고DB 연결 URL) 하나로 연결이 끝났어요. 테이블의 역할을 하던 컬렉션들 생성하는법도 몽구스를 통해 생성하면 간단합니다. 몽구스의 메소드 중 모델이라고 하는 메소드를 사용하면 됩니다.
// schema.js
import Mongoose from "mongoose";
const userSchema = new Mongoose.Schema({
username: { type: String, required: true }, // ID
password: { type: String, require: true }, // 비밀번호
email: { type: String, require: true }, // 사용자 이메일
signupDate: { type: Date, default: Date.now }, // 회원가입 일시
});
export const User = Mongoose.model("User", userSchema);
우선 Mongoose의 Schema라는 메소드를 통해 스키마의 형태를 선언해줍니다. 테이블 구조를 선언해주는 것과 비슷합니다. type을 지정하고, required옵션을 통해 필수값인지 아닌지를 설정하는 등 간단한 옵션도 있습니다. 위 구조대로 유저 스키마를 만든다면 ID, 비밀번호, 이메일, 회원가입 날짜를 가진 유저 스키마가 생성되는거에요. 그리고, model메소드를 통해 export해준다면, 쉽게도 다른 파일에서 몽고DB의 스키마 데이터들에 접근이 가능해집니다. 예를 들면, 다른 파일에서
import { User } from "../model/schema.js";
function findUser(user){
const u = await User.findOne({ username: user });
}
이런 findUser함수가 있다고 하고, 파라메터로 찾고자하는 사용자의 이름을 넘겨준다면, u라는 변수에는 몽고DB의 User스키마에서 일치하는 유저의 데이터가 저장될거에요. 몽구스의 메소드에는 findOne뿐 아니라 findOneAndUpdate (일치하는 데이터를 찾고, 원하는대로 데이터를 변경), delete 등등 sql문의 역할을 대신해줄 메소드들이 있습니다.
그러나, 외래키 등의 관계설정이 안되기때문에, 서로 관계있는 데이터들 중 하나를 삭제한다고 연관된 데이터들도 영향을 받지는 않습니다.. 그렇기 때문에, 프로젝트 설계 초기에 어떤 데이터베이스를 선택할 것인지를 고민할 때, 과연 데이터베이스 간 관계를 얼마나 설정할 것인지가 제일 큰 고려사항일 것 같다 느꼈습니다. 요즘은 관계지향데이터베이스와 도큐먼트데이터베이스를 둘다 사용하는 경우도 많다고 합니다. 둘다 사용한다면, 각자의 장점을 살려 데이터베이스를 매우 효율적으로 관리할 수 있겠네요.
'Web > Node.js' 카테고리의 다른 글
Arcane프로젝트 - Bcrypt와 jwt를 통한 로그인, 회원가입구현 (0) | 2022.11.16 |
---|---|
Arcane 프로젝트 - netlify.toml (0) | 2022.11.14 |
Arcane 프로젝트 - Axios 비동기 통신 (0) | 2022.11.13 |
Arcane - 클라이언트 구조 (0) | 2022.11.13 |
Arcane 프로젝트 - 서버 구조 (0) | 2022.11.11 |