Today What I Learned
Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
오늘은 noSQL입니다.
1. RDBMS와 NoSQL
1. RDBMS란?
- RDBMS : Relational Database Management System
- 데이터를 테이블에 나누어 담고 테이블 간 관계를 정의하여 사용하는(이 부분에서 불필요한 테이블 생성과 관계 정의 과정이 발생) 형식의 데이터 베이스
- SQL Database 특징: Strict Schema, Relations
2. NoSQL란?
- noSQL : Not Only / Non-Relational SQL
- 관계형 데이터베이스 SQL와 달리 noSQL은 데이터를 테이블에 쪼개 담지 않고 도큐먼트 안에 JSON 형식으로 다루어 수평적인 데이터 구조를 지향한다. 관계형 데이터베이스에서는 수평 확장이 어렵다는 단점을 극복할 수 있는 데이터베이스이기도 하여서 '더 유연한' 구조를 가지고 있다고 본다. 대용량 데이터를 다루는 문서, 키-밸류, 그래프, 인-메모리, 검색 등에 용이하다.
3. NoSQL의 특징
- flexibility(유연성): noSQL은 빠르고 반복적인 개발을 요구하는 환경에서 유연한 스키마를 제공한다.
- scalability(확장성): noSQL은 서버를 증축하는 대신 하드웨어의 분산형 클러스터(여러 개의 데이터베이스에 데이터를 분할 할 수 있음)를 통해 확장할 수 있도록 설계되어서 확장성이 높다.
- high-performance(높은 성능): noSQL은 문서, 키-밸류, 그래프 형식을 갖춘 데이터 모델에 최적화되어 있어 관계형 데이터베이스보다 더 높은 성능을 보장한다.
- highly functional(높은 기능성): noSQL은 데이터모델에 맞춘 api를 제공한다.
4. SQL과 NoSQL 비교
5. When to use noSQL?
2. MongoDB
1. What is MongoDB?
- 문서 지향적(document-oriented) noSQL 데이터베이스로 엔진은 C++로 작성된 오픈 소스이다.
2. MongoDB 기본 개념
- Document: 관계형 데이터베이스에서 다루는 Record라는 개념과 유사하고, JSON 형식으로 key-value 쌍을 다루는 데이터 구조로 구성되었다. document에서는
_id
라는 고유 값이 생성된다. _id
의 구성은 시간/머신ID/프로세스ID/순차번호로 구성된다.
- Collection: 관계형 데이터베이스에서 다루는 Table이라는 개념과 유사하고, document의 집합이다.
- Database: Collection들의 컨테이너이다.
MongoDB Structure 출처: https://poiemaweb.com/mongdb-basics
3. MongoDB 특징
- schema-less: 관계형 데이터베이스는 테이블 내에 레코드가 일정한 스키마를 유지해야 한 것과 달리, mongoDB에서는 콜렉션 내 도큐먼트 레벨이 다양한 스키마를 가질 수 있어서 도큐먼트가 각자 고유한 필드를 가질 수 있다.
- join-less: 관계형 데이터베이스가 join 등을 통해 관계를 정의하는 것과 달리, mongoDB에서는 join 과정 없이 한 도큐먼트 안에 최대한 많은 데이터를 포함시키기 때문에 querying이 더 빠르다.
- 확장성이 높고, mongos 서버 내에 sharding(여러 개 데이터 베이스로 데이터를 분할시켜 할당) 클러스터 구축이 가능하다.
4. MongoDB 기본 Querying
- insert: db.콜렉션명.insert({필드1: "값1", 필드2: "값2", ...})
- select: db.콜렉션명.find({필드1: "값1", ...})
- update: db.콜렉션명.update({조건 필드: "값"}, {$set: {변경 필드: "변경 값"})
- delete: db.콜렉션명.remove({삭제할 필드: "값"})
3. ORM과 ODM
1. ORM과 ODM 구분
- ORM: Object Relational Mapping
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 도우미 역할을 한다.
- ORM의 장점
- 익숙한 객체 지향적인 코드를 사용함으로써 직관적인 이해 및 집중에 도움이 됨
- ORM을 통해 작성한 객체를 재활용할 수 있다는 측면에서 재사용 및 유지보수의 편리성이 증가함
- ORM의 단점
- 구현을 잘 못한다면 성능이 저하될 수 있음
- 복잡한 쿼리문의 경우 오히려 SQL문으로 사용이 직관적이면서 효율적임
- ODM: Object Document Mapping
- ORM과 동일하게 객체 관계로 정의한 내용을 NoSQL 형태로 매핑(연결)해주는 도우미 역할을 한다.
2. Sequelize
- Node.js 기반의 ORM으로 PostgreSQL, MySQL, MariaDB, SQLite, MS-SQL을 지원한다.
- 프로미스 기반의 ORM이기 때문에 비동기 처리에 용이하다.
- table 대신 modeling을 통해 객체 형태로 table을 짠다.
- 기본적인 query문은 아래와 같다.
User.findAll().then(users => {
console.log("All users:", JSON.stringify(users, null, 4));
});
User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
console.log("Jane's auto-generated ID:", jane.id);
});
User.destroy({
where: {
firstName: "Jane"
}
}).then(() => {
console.log("Done");
});
User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
}).then(() => {
console.log("Done");
});
3. Mongoose
- MongoDB 기반 ODM(Object Data Mapping) Node.JS 전용 라이브러리
- MongoDB는 Document 기반이지만 RDBMS에서 사용하는 스키마(schema) 개념의 부활, populate, 프로미스와 콜백 사용 가능, 편리한 쿼리 빌더 등의 장점으로 많이 쓰이는 ODM이다.