[NOSQL]몽고DB

신동혁·2023년 1월 10일
0

1.NOSQL과 몽고DB란?

참고링크 : https://www.mongodb.com/ko-kr/nosql-explained

NoSQL이란 무엇입니까?

사람들은 보통 “NoSQL 데이터베이스”란 용어를 비관계형 데이터베이스를 지칭할 때 사용합니다. 누군가는 “NoSQL”을 “non SQL(비 SQL)“의 약자로, 또 누군가는 “not only SQL(SQL만을 사용하지 않는)”의 약자로 생각합니다. 어떤 경우든 대부분의 사람들은 NoSQL 데이터베이스가 관계형 데이터베이스 이외의 형식으로 데이터를 저장하는 데이터베이스라는 데 동의합니다.

흔히들 NoSQL 데이터베이스 또는 비관계형 데이터베이스는 관계 데이터를 저장하지 않는다고 오해합니다. NoSQL 데이터베이스는 관계형 데이터베이스와 방식은 다르지만 관계 데이터를 저장할 수 있습니다. 실제로 SQL 데이터베이스아 비교해보면, 대체로 NoSQL 데이터베이스에 있는 관계 데이터를 모델링하는 것이 SQL 데이터베이스보다 쉽다는 것을 알 수 있는데, 이는 관련 데이터를 테이블 간에 분할할 필요가 없기 때문입니다.

NoSQL 데이터 모델을 사용하면 관련 데이터를 단일 데이터 구조 내에 중첩시킬 수 있습니다 .

NoSQL 데이터베이스는 2000년대 말에 스토리지 비용이 크게 하락하면서 등장했습니다. 단순히 데이터 중복 감소를 목적으로 복잡하고 관리가 어려운 데이터 모델을 생성해야 하던 시절은 이제 지났습니다. 스토리지가 아니라 개발자들이 소프트웨어 개발의 1차 비용이 되었기 때문에 NoSQL 데이터베이스는 개발자 생산성에 맞게 최적화되었습니다.


참고링크 : https://aws.amazon.com/ko/nosql/

NoSQL 데이터베이스를 사용해야 하는 이유

NoSQL 데이터베이스는 탁월한 사용자 경험을 제공하기 위하여 유연성과 확장성을 비롯해 고성능의 매우 기능적인 데이터베이스를 필요로 하는 모바일, 웹이나 게이밍과 같은 다양한 현대적인 애플리케이션에 적합합니다.

  • 유연성: NoSQL 데이터베이스는 일반적으로 유연한 스키마를 제공하여 보다 빠르고 반복적인 개발을 가능하게 해줍니다. 이같은 유연한 데이터 모델은 NoSQL 데이터베이스를 반정형 및 비정형 데이터에 이상적으로 만들어 줍니다.
  • 확장성: NoSQL 데이터베이스는 일반적으로 고가의 강력한 서버를 추가하는 대신 분산형 하드웨어 클러스터를 이용해 확장하도록 설계되었습니다. 일부 클라우드 제공자들은 완전관리형 서비스로서 이런 운영 작업을 보이지 않게 처리합니다.
  • 고성능: NoSQL 데이터베이스는 특정 데이터 모델 및 액세스 패턴에 대해 최적화되어 관계형 데이터베이스를 통해 유사한 기능을 충족하려 할 때보다 뛰어난 성능을 얻게 해줍니다.
  • 고기능성: NoSQL 데이터베이스는 각 데이터 모델에 맞춰 특별히 구축된 뛰어난 기능의 API와 데이터 유형을 제공합니다.

SQL (관계형) vs. NoSQL(비관계형) 데이터베이스 비교

수십 년간, 애플리케이션 개발을 위해 가장 많이 사용된 데이터 모델은 Oracle, DB2, SQL Server, MySQL, PostgreSQL과 같은 관계형 데이터베이스에서 사용하는 관계형 데이터 모델이었습니다. 2000년대 중반에서 말에 이르러서야 다른 데이터 모델들이 채택되고 사용되는 현상이 눈에 띄기 시작했습니다. 이러한 새로운 데이터베이스와 데이터 모델 등급을 차별화하고 분류하기 위해 "NoSQL"이란 용어가 만들어졌습니다. 흔히 "NoSQL"이란 용어는 "비관계형"과 같은 의미로 사용됩니다.

다양한 기능을 가진 여러 유형의 NoSQL 데이터베이스가 있지만, 다음 표에서는 SQL과 NoSQL 데이터베이스의 몇 가지 차이점에 대해 보여줍니다.


MongoDB란?

MongoDB는 위에서 설명한 NoSQL 형식의 데이터베이스의 한 종류다. 몽고db 는 JSON과 비슷한 형태로 key,value 데이터를 저장한다. 기존에 많이 사용하던 SQL 형식의 데이터베이스와 용어도 살짝 다르다. SQL에서의 row를 MongoDB에서는 document라고 부르고, table을 collection이라고 부른다.

참고링크 : https://ckddn9496.tistory.com/96

또한 mongodb는 자동으로 document에 고유의 식별자를 부여해준다.(RDBMS의 PK랑 같은 역할) 이는 "_id"로 표시된다.

<MySQL과 MongoDB 비교( SQL vs NoSQL )>

  1. MongoDB는 빠르게 애플리케이션 구축을 할 수 있으며, 다양한 데이터 타입을 핸들링할 수 있습니다. 또한 스케일링에 대한 관리 기능을 제공하기에 많은 기업들이 cloud database로써 mongoDB를 선택하고 있습니다.

  2. MongoDB가 사용하는 document는 객체지향 프로그래밍에 언어와 자연스럽게 매핑되기에 개발이 단순화됩니다. mongoDB를 사용하는것 만으로도 객체를 관계형 테이블로 변환하는 복잡한 매핑 계층(ORM)이 사라집니다.

  3. MongoDB의 데이터 구조는 유연하기에, 새로운 비즈니스 요구사항에 대해 잘 반영해줄 수 있습니다. 반면, MySQL은 관계형 구조를 변경시키는데 애플리케이션에 큰 오버헤드를 가져옵니다.

  4. MongoDB는 분산 데이터센터에 대하여 스케일링이 가능하며, 데이터 볼륨 및 처리량이 증가함에 따라 중지 없이 쉽게 확장이 가능합니다. 반면, MySQL은 스케일링에 반드시 엔지니어의 작업이 필요합니다.

참고링크 : https://mjmjmj98.tistory.com/43

경우1) 추가적인 정보(row/record/document)를 DB에 넣는 경우
첫번째 사람은 이름, 나이를
두번째 사람은 이름, 나이, 키를 DB에 넣는다면
SQL에서는 이름, 나이, 키에 대한 컬럼을 지정한 테이블을 미리 만들어야 하고, 컬럼도 null값이 들어갈 수 있게 해야 한다. 만약 이때 세번째 사람의 정보로 이름, 나이, 몸무게를 DB에 넣고 싶다면 SQL에서는 불가능한 작업이 된다. 하지만 NoSQL에서는 미리 설정된 스키마에 맞춰야 한다는 조건이 없으므로 네번째 사람의 정보로 시력, 청력, 거주지 등등을 DB에 넣어도 문제가 될 것이 없다.

경우2) 관계가 있는 정보를 DB에 넣는 경우
SQL에서는 정보를 관계형으로 저장하기 때문에 중복된 데이터의 저장이 필요가 없다. 예를 들어 사람 테이블에는 사람들에 대한 정보가 있고 신청자 테이블에는 신청자에 대한 정보가 있다고 하면, 신청자 테이블에 넣어질 신청자(사람)는 사람 테이블에서의 primary key(기본키)를 foreign key(외래키)로 받아오면 된다. 그러면 신청자 테이블에 해당 신청자에 대한 사람 정보는 굳이 다 쓸 필요없게 된다. 하지만 NoSQL에서는 이런 작업이 불가하므로 신청자 테이블에 신청자에 대한 정보를 넣기 위해서 사람 테이블에 있던 사람 정보를 모두 신청자 테이블에 중복하여 넣어주어야 한다. 또한 사람 테이블에 해당 사람 정보를 수정하게 되면 신청자 테이블에 작성되어 있던 해당 사람 정보도 수정해줘야 하는 수고가 생긴다.

2.CRUD 문법

※ 몽고DB 버전 6를 기준으로 작성했습니다! 또한 python에서 pymongo 버전 4.3.3라이브러리를 이용해 mongodb에 crud하는 법도 같이 작성했습니다!

1) Create (생성)

  • 한 개 데이터 생성
    : db.컬렉션명.insertOne(json데이터)
    pymongo함수 --> db.컬렉션명.insert_one()
  • 여러개 데이터 생성
    : db.컬렉션명.insertMany([json데이터1,json데이터2 ...])
    pymongo함수 --> db.컬렉션명.insert_many()

2) Read (조회)

  • 컬렉션 모든 데이터 조회
    : db.컬렉션명.find()
  • 컬렉션 데이터 하나만 조회
    : db.컬렉션명.findOne()
    pymongo함수 --> db.컬렉션명.find_one()
  • 컬렉션 모든 데이터에서 특정 컬럼들 조회
    : db.컬렉션명.find({},{컬럼명1 :조건1, 컬럼명2 :조건2}
    : db.컬렉션명.find({key:value},{key:value},{key:value})

3) Update (수정)

4) Delete (삭제)

  • 하나의 컬렉션 삭제
    : 컬렉션객체.drop()
profile
개발취준생

0개의 댓글