250102 MongoDB (개념, 설치, 기본 CRUD, Java 연동)

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의 기본 개념에 대해 알아보자.


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);
		}
	};
}