티스토리 뷰
[mongodb] MongoDB와 NoSQL 정의 소개 및 MongoDB Shell로 데이터를 insert 하기
개발하는 후딘 2022. 9. 13. 18:59몽고디비 클러스터 이동으로 json데이터를 다른 클러스터로 이관하는 작업을 하게 되었습니다.
몽고디비는 document 기반의 데이터베이스여서 RDBMS와 다르게
넣은 데이터 타입에 맞게 알아서 스키마를 갖춥니다.
작업을 시작하기 전에...
NoSQL이 무엇인지, 왜 써야되는지, 어떤종류가 있는지 를 소개하고
몽고디비에 데이터를 넣는 작업을 진행하겠습니다.
> NoSQL 데이터베이스가 무엇인가요?
NoSQL은 Not Only SQL 약자 입니다.
NoSQL 데이터베이스는 Table(표)형식을 갖추지 않은 비관계형 데이터베이스 입니다.
NoSQL은 관계형 데이터베이스 이외의 형식으로 데이터를 저장하는 데이터베이스 이기도 하지만
관계형 데이터베이스와 방식은 다르지만, 관계 데이터 도 저장할 수 있습니다.
즉, 유연한 스키마를 갖춘 데이터베이스 이며, 대량의 데이터와 높은 사용자 부하에서도 쉽게 확장이 가능합니다.
* 관계형 데이터베이스
행(rows) 과 열(columns)로 구성된 테이블 형식의 스키마를 갖춘 데이터베이스 입니다.
대표적인 관계형 데이터베이스는 MySQL, Oracle, PostgreSQL 등이 있으며
관계형데이터베이스의 스키마는 테이블, 행, 열, 인덱스, 테이블간의 관계 를 규정해야됩니다.
데이터베이스는 테이블 사이의 관계에서 참조 무결성을 실현 해야됩니다.
*참조 무결성: 두 테이블간의 참조관계를 선언하는 제약조건을 의미합니다.
자식 테이블의 외래키는 부모 테이블의 기본키와 도메인이 동일해야합니다.
자식 릴레이션 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것을 의미합니다.
> NoSQL 데이터베이스는 어떤게 있나요?
1) Key-Value Database
각 항목에 키(Key)와 값(Value)이 포함되어 있는 데이터베이스 입니다.
키-값 데이터베이스는 대량의 데이터를 저장해야하지만 검색을 위해 복잡한 쿼리를 수행할 필요 없는 사례에 적합합니다.
키-값 데이터베이스는 큰 분할성 이 특징입니다. 다른 유형의 데이터베이스로는 불가능한 범위까지 수평 확장을 가능하게 합니다.
Redis와 AWS DynanoDB가 키-값 형태의 데이터베이스 입니다.
2) Document Database
JSON(JavaScript Object Notation) 객체와 비슷한 문서(document)에 데이터를 저장합니다.
Document Database의 레코드가 document(문서) 입니다.
각 문서에는 필드(field)와 값(value) 의 쌍이 포함되어 있습니다.
애플리케이션 코드에서 데이터는 객체 또는 JSON 형식의 문서로 표시됩니다.
객체 및 JSON 형식이 개발자에게 효율적이고 직관적인 데이터 모델이기 때문에 빠르고 쉽게 작업할 수 있습니다.
유연한 스키마 를 갖춤으로서 애플리케이션 요구사항이 변경됨에 따라 데이터 모델을 발전 시킬 수 있습니다.
몽고디비가 Document Database 에 속합니다.
3) Graph Database
그래프 데이터베이스의 목적은 고도로 연결된 데이터셋(data set)을 사용하는 애플리케이션을 쉽게 구축하고 실행하는 것 입니다.
소셜 네트워킹, 추천 엔진 등 에서 그래프 데이터베이스를 활용합니다.
4) In-Memory Database
In-Memory 데이터베이스는 디스크가 아닌 메인메모리에 보유하고 있는 데이터베이스 입니다.
데이터양이 빠르게 증가할 때 데이터베이스의 응답속도가 떨어지는 문제를 해결할 수 있는 대안이기도 합니다.
인메모리 데이터베이스의 검색속도는 디스크를 검색해서 자료를 접근하는 방식보다 훨씬 빠릅니다.
ms 단위의 빠른 응답처리가 필요하거나, 트래픽이 잦은 서비스에서 많이 활용됩니다.
In-Memory 데이터베이스는 Redis, Memcached 등이 있습니다.
> 왜 NoSQL 데이터베이스를 사용해야되나요?
1) 유연성
유연한 스키마를 제공하여 빠르고 반복적인 개발을 가능하게 해줍니다.
즉, 스키마 선언없이 필드의 추가, 삭제가 자유로운 구조 입니다.
2) 확장성
스케일 아웃에 의한 서버확장이 용이 합니다.
고가의 강력한 서버를 추가하는 대신에 분산형 하드웨어 클러스터를 이용해 확장하도록 설계되어 있습니다.
3) 고성능
대용량 데이터를 처리하는 성능이 뛰어납니다.
디스크 대신 in-memory 기반으로 결과를 빠르게 리턴하여 낮은복잡도를 갖는 알고리즘으로 만들어져서 높은 성능을 갖고 있습니다.
특정 데이터 모델 및 액세스 패턴에 대해 최적화되어 관계형 데이터베이스를 통해 유사한 기능을 충족할 때보다 더 뛰어난 성능을 얻게 합니다.
4) 고기능성
여러대의 백업 서버 구성이 가능하여 장애 발생시에도 무중단 서비스가 가능합니다.
> 몽고디비 데이터베이스 Insert 하기
1. Mongodb Atlas에 로그인 후 클러스터를 선택하여 연결합니다.
(작성자는 무료클러스터를 사용하고 있습니다.)
핑크색 박스 영역을 클릭하면, 현재 접속한 클러스터에 대한 mongosh 로 수행할 수 있도록 클러스터 주소가 나옵니다.
2. 터미널에서 MongoDB Shell을 Open 합니다.
$ mongosh "mongodb+srv://(데이터베이스주소)" --apiVersion 1 --username (유저명)
3. 데이터베이스 조회 후 선택한 데이터베이스를 사용합니다.
- 데이터베이스 조회
해당 클러스터에 있는 데이터베이스 리스트를 조회할 수 있습니다.
$ show databases
- 데이터베이스 선택 및 생성
데이터베이스 리스트에 존재하면, 해당 데이터베이스명을 선택하여 사용할 수 있습니다.
입력한 (데이터베이스명)이 데이터베이스 리스트에 존재하지 않더라도
아래명령어를 입력하면 자동으로 데이터베이스가 생성됩니다.
$ use (데이터베이스명)
4. 데이터를 insert합니다.
콜렉션이 없더라도, 데이터를 삽입하면 자동으로 콜렉션이 생깁니다.
텅빈 데이터베이스에 데이터를 삽입하면, 삽입한 데이터의 형태로 콜렉션의 스키마가 변경됩니다.
- db.( collection명 ).insertOne( json데이터 )
한개의 데이터를 삽입할 수 있습니다.
$ var u = {
snsList: ["Instagram", "NaverBlog"],
nickname: "TestUser4",
birthOfYears: 2003,
}
$ db.users.insertOne( u )
- db.(collection명).insertMany( array데이터 )
여러개의 데이터를 삽입할 수 있습니다.
$ var users = [
{
snsList: ["Instagram", "NaverBlog"],
nickname: "TestUser1",
birthOfYears: 2001,
},
{
snsList: ["Instagram", "NaverBlog"],
nickname: "TestUser2",
birthOfYears: 2002,
}
]
$ db.users.insertMany(users)
Q. json형태로 된 데이터를 다른 클러스터의 데이터베이스에 import 하는 방법은요?
A. 데이터를 다른 클러스터로 이관하는 건데, 저의 경우에는 Studio3T에서 JSON파일 import로 해결했습니다.
1) 콜렉션을 클릭합니다.
2) 아래 사진의 import 버튼을 클릭하고, 임포트 파일형식을 json을 클릭하여, json파일을 업로드합니다.
3) 파일이 업로드되면 Run 버튼을 클릭 후, 해당 콜렉션에서 데이터가 잘 임포트됐는지 확인합니다.
Studio3T는 다큐먼트 기반의 데이터베이스의 스키마나 데이터를 확인하는데 정말 유용한 툴입니다!!
[참고자료]
'Backend > 꾸준히 TIL' 카테고리의 다른 글
[OS] 1장 운영체제 개요 (0) | 2022.09.14 |
---|---|
gitmoji 사용하여 이모지로 커밋 컨벤션 사용하기 (0) | 2022.09.14 |
[CI/CD] Error: listen EADDRINUSE: address already in use :::5000 (0) | 2022.09.05 |
[CI/CD] Error: Missing required flag: -a, --app App app to run command against See more help with --help 에러 (0) | 2022.09.05 |
[mongodb/mongoose] __v 필드 (0) | 2022.08.31 |
- Total
- Today
- Yesterday
- typeORM
- 바이트디그리
- Nest.js
- 미완
- OS
- nestjs jest
- TDD
- 나도 할 수 있다
- TypeScript
- 디지털디톡스
- RDBMS
- 참고
- 습관개선
- git
- 한달어스
- Jekyll
- IT용어
- 스마트폰중독
- nestjs
- 갓생살자
- MongoDB
- 한달독서
- 개발용어
- jest
- vscode
- 클린아키텍쳐
- gem
- MySQL
- Mongoose
- node.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |