250102 에이콘 아카데미 수업에 기반하여 작성되었음을 알립니다.
NoSQL
No SQL 또는 Not Only SQL 이다. 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터 저장소다. 관계형 DB가 아니므로, RDBMS 처럼 고정된 스키마 및 JOIN 이 존재하지 않는다.
RDBMS의 한계 많은 데이터량과 데이터 처리량이 계속적으로 증가한다면 RDBMS는 아래와 같은 문제점을 만난다.
스키마 문제 : 빅데이터를 RDB의 스키마에 맞춰 변경해서 넣으려면 매우 긴 시간의 down time이 발생
스케일업의 한계 : RDBMS는 애초부터 스케일 아웃을 염두에 두고 설계되지 않았다. 관계 모델과 트랜잭션의 연산, 일관성, 속성을 유지하면서 분산환경(스케일아웃)에서 RDBMS를 조작하는 것은 어렵다.
2. 특징과 장점
거대한 Map으로서 key-value 형식을 지원한다.
RDBMS가 데이터의 관계를 Foreign Key 등으로 정의하고 Join 등 관계형 연상을 하지만 NoSQL은 관계를 정의하지 않는다.
대용량 데이터 저장을 한다.
분산형 구조를 통해 여러대의 서버에 분산하여 저장하고 상호복제하여 데이터 유실이나 서비스 중지에 대비한다. Schema-less : 스키마가 아예 없는 것은 아니지만 거의 없다고 봐도 무방하다
읽기 작업보다 쓰기 작업이 더 빠르며, 일반적으로 RDBMS에 비하여 쓰기와 읽기 성능이 빠르다.
3. CAP
분산형 구조는 일관성(Consistency), 가용성(Availability), 분산 허용(Partitioning Tolerance)의 3가지 특징을 가지고 있다. CAP 이론은 이 중 2가지만 만족할 수 있다는 이론이다. NoSQL은 대부분 이 CAP 이론을 따르고 있다.
일관성(Consistency) : 분산된 노드 중 어느 노드로 접근하더라도 데이터 값이 같아야 한다. (데이터 복제 중에 쿼리가 되는 일관성을 제공하지 않는 시스템의 경우 다른 데이터 값이 쿼리될 수 있다.)
가용성(Availability) : 클러스터링된 노드 중 하나 이상의 노드가 실패(Fail)라도 정상적으로 요청을 처리할 수 있는 기능을 제공한다.
분산 허용(Partition Tolerance): 클러스터링 노드 간에 통신하는 네트워크가 장애가 나더라도 정상적으로 서비스를 수행한다. 노드 간 물리적으로 전혀 다른 네트워크공간에 위치도 가능하다.
일반적으로 RDBMS는 일관성과 가용성을 만족한다. NoSQL은 가용성과 분산허용을 만족하는 제품군과 일관성과 분산허용을 만족하는 제품군으로 나눌 수 있다.
🙏 NoSQL (개념, 특징과 장점, CAP 이론, 데이터모델 분류)
MongoDB 개념
MongoDB 설치
운영체제에 따라 다운로드
Data Directory : C:\Program Files\MongoDB\Server\8.0\data\
path 걸기 : C:\Program Files\MongoDB\Server\8.0\bin
cmd에 mongod 입력하여 서비스 시작
MongoDB Compass 사용
Shell 사용
🙏 MongoDB 서버 설치 (2024년 1월 기준) , MongoDB는?
MongoDB CRUD 실습 1
insert
1개만 조회
1 : true
0 : false
MongoDB CRUD 실습 2
🙏 MongoDB CRUD Tutorials (2024년 기준)
find().limit()
find().skip()
find({조건})
$lte, gt, lt
$in
데이터가 없으면 있는 데이터만 나옴
$or
$and
정규표현식
find({}, {조건})
MongoDB - JAVA
실습에 필요한 컬렉션 생성
이클립스 실습
라이브러리는 Maven으로 가져온다.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>aa</groupId>
<artifactId>mongo01_basic</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
</project>
mongodb 서버 서비스 중 확인 localhost:27017
MongoTest1.java
public class MongoTest1 {
public static void main(String[] args) {
// MongoDB 연결 객체 생성
MongoClient client = MongoClients.create("mongodb://localhost:27017");
try {
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("customer");
System.out.println("자료 건수 : " + collection.countDocuments());
// 첫번째 자료 읽기
Document document = collection.find().first();
System.out.println("첫번째 자료 : " + document);
// 전체 자료 출력
System.out.println("전체 자료");
//FindIterable<Document> iter = collection.find();
//MongoCursor<Document> cursor = iter.iterator();
MongoCursor<Document> cursor = collection.find().iterator();
//MongoCursor<Document> cursor = collection.find().limit(2).iterator();
while(cursor.hasNext()) {
//Document document2 = cursor.next();
//String jsonResult = document2.toJson();
String jsonResult = cursor.next().toString();
System.out.println(jsonResult);
}
System.out.println();
cursor = collection.find().iterator(); // 다시 읽어줘야 한다.
while(cursor.hasNext()) {
Document doc = cursor.next();
System.out.println("이름 : " + doc.get("name") +
", 나이 : " + doc.get("age") +
", 성별 : " + doc.get("gender"));
}
cursor.close(); // cursor close 해줘야 함
client.close();
} catch (Exception e) {
client.close();
System.out.println("err : " + e.getMessage());
}
}
}
스키마는 대소문자 구분함 입력하는대로 스키마가 만들어 짐!
Block<Document> 대신에 Consumer<Document> 사용
public class MongoTest1 {
public static void main(String[] args) {
// MongoDB 연결 객체 생성
MongoClient client = MongoClients.create("mongodb://localhost:27017");
try {
... 생략
System.out.println("-----------------");
collection.find().forEach(printData);
cursor.close(); // cursor close 해줘야 함
client.close();
} catch (Exception e) {
client.close();
System.out.println("err : " + e.getMessage());
}
}
// Block<Document> 대신에 Consumer<Document> 사용
static Consumer<Document> printData = new Consumer<Document>() {
@Override
public void accept(final Document document) {
//System.out.println(document.toJson());
String name = document.getString("name");
Integer age = document.getInteger("age");
String gender = document.getString("gender");
System.out.println(name + "님의 나이는 " + age);
}
};
}
'Study > Acorn' 카테고리의 다른 글
250106 MongoDB (SpringBoot, 대용량 데이터 저장/읽기) (0) | 2025.01.06 |
---|---|
250103 MongoDB (Java - CRUD, 동적인 칼럼 처리) (0) | 2025.01.03 |
241231 도커 (nodejs 웹서버, 우분투 자바 설치, 도커 허브 푸쉬) (0) | 2024.12.31 |
241230 도커 (설치, 기본명령어) (0) | 2024.12.30 |
241227 인증/인가(Role) (0) | 2024.12.27 |