[N324] TIL 및 회고

Sea Panda·2022년 12월 21일
0

부트캠프 TIL

목록 보기
32/46

0. 학습목표

  • NoSQL 단어 유래에 대해 이해하고 설명할 수 있다.
  • NoSQL 종류를 이해하고 구분할 수 있다.
  • NoSQL 종류벼 특징에 대해 설명할 수 있다.
  • 문서형(Document)데이터베이스를 활용할 수 있다.

1. 주요개념

1. NoSQL(Not Only SQL)

NoSQL은 Not Only SQL의 약어로 조핸 오스카슨(Johan Oskarsson)이 2009년 6월 샌프란시스코에서 조직한 모임에서 관계형 데이터 모델을 쓰지않는 연구를 빠른 시간에 다양한 사람들과 논의하기 위해서 트위터의 해시태그에 사용할 중복되지 않으면서도, 부정적이여서 사람들의 끌 수 있는 단어를 생각하다 NoSQL을 찾았고, 이를 해시태그로 사용하여 현재 비관계형 데이터베이스 기술을 아우르는 말이 되었다.

2000년대 초 웹 시장의 발전과 함께 데이터 소스와 데이터의 양이 폭발적으로 증가하기 시작했다. 이런 웹 서비스의 데이터는 XML, JSON으로 처리되는데 관계형 데이터베이스로 처리하기에는 데이터 설계시간이 오래걸리기 시작했다. 그리고 하나의 서버를 크게 만드는 것(수직확장)보다, 여러개의 서버를 연결(수평확장)시켜 확장하는 방법이 더 비용적으로 우수하게 되었다. 따라서 한 대에서 실행되도록 설계된 관계형 데이터베이스보다는 여러 대의 컴퓨터에 분산하여 저장할 수 있고, XML, JSON 등의 데이터를 처리하는데 시간이 짧은 NoSQL이 등장하게 된다.

관계형 DB와 비관계형 DB는 만들어진 방식, 저장하는 정보의 종류, 그리고 저장하는 방법 등에 차이가 있다. 관계형 DB는 테이블을 사전에 정의를 한 뒤에 그에 알맞은 형태의 데이터만 넣을 수 있다. 각각의 행은 하나의 속성에 대한 정보를 저장하고, 열에는 각각의 데이터 형식에 맞는 데이터가 저장된다. 특정한 형식을 지키기 때문에 데이터가 제대로 추가되었다면 꺼낼 때에는 수월하다. SQL을 활용해 원하는 정보를 쿼리할 수 있다. 즉, 관계형 DB에서는 스키마가 뚜렷이 보인다. 덕분에 테이블 간에 관계들이 어떻게 되는지 알 수 있다.

그렇다고 NoSQL이 스키마가 반드시 없는 것은 아니다. 관계형 DB가 데이터를 쓸 때 스키마에 맞춘다면, 반면에 비관계형 DB(NoSQL)은 데이터를 읽어올 때 스키마에 따라 읽어온다. 읽어올 때만 데이터 스키마가 사용되기 때문에 쓸 때는 따로 정해진 것이 없다는 의미는 아니다. 결국 어떻게 쓰냐가 어떻게 읽어와야 하는지에 대한 영향을 미친다.

SQLNoSQL
관계형 DB는 SQL을 이용해서 데이터를 테이블에 저장.
미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장.
Key-value, document, graph, wide-column형식 등의
방식으로 데이터를 저장할 수 있다.
고정된 스키마가 필요동적인 스키마.
행 추가 시 즉시 열 추가 가능
개별 속성에 대해서 반드시 모든 열에 대한 데이터를 입력하지 않아도 됨.
구조화된 쿼리 언어를 정보 요청에 사용데이터 그룹 자체를 조회하는 것에 초점
구조화 되지 않은 쿼리로도 요청가능
UnQL(Unstructured Query Language)라고도 함.
수직적 확장(높은 메모리, CPU를 사용하는 확장)
데이터베이스가 구축된 하드웨어의 성능을 많이 이용
고비용
수평적 확장(보다 값싼 서버 증설, 또는 클라우드 서비스를 이용하는 확장)
많은 트래픽 처리에 용이하도록 서버를 추가적으로 구축
높은 효율성

NoSQL 기반 DB data type
- Key-Value type: 데이터를 key-value의 쌍을 속성으로 하는 배열의 형태로 저장한다. Redis, Dynamo 등이 대표적인 Key-value형식의 DB이다.

- 문서형(Document) DB: 데이터를 테이블이 아닌 문서처럼 저장하는 DB를 의미한다. JSON유사 형식으로 데이터를 문서화하는 것이 일반적이다. 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리한다. 대표적인 문서형 DB에는 MongoDB가 있다.

- Wide-Column DB: DB의 열(Column)에 대한 데이터 관리를 집중하는 DB이다. 각 열에는 Key-value형식으로 데이터가 저장되고, 컬럼 패밀리(Column families)라고 하는 열의 집합체 단위로 데이터를 처리할 수 있다. 하나의 행에 많은 열을 포함할 수 있어서 높은 유연성을 자랑한다. 데이터 처리에 필요한 열을 유연하게 선택할 수 있다는 점에서 규모가 큰 데이터 분석에 주로 사용되는 DB형식이다. 대표적인 DB는 Cassandra, HBase가 있다.

SQL기반의 관계형 DB는 DB의 ACID성질을 준수해야하는 경우, 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우에 사용하면 좋다. ACID성질을 준수하면 DB의 무결성을 보호할 수 있다. 전자 상거래, 금융 서비스를 위한 소프트웨어 개발에서는 이 성질을 준수하는 것이 필수 옵션으로 되어 있어 SQL을 이용한 솬계형 DB를 이용하는 것이 보편적이다. 또한 프로젝트의 규모가 많은 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우, 보통 관계형 DB를 사용한다. 다양한 데이터 유형과 높은 트래픽을 지원하도록 설계된 NoSQL DB를 굳이 사용할 이유가 없다.

NoSQL기반의 DB는 데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하거나, 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우, 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우에 사용하면 좋다. 대부분의 NoSQL DB는 저장할 수 있는 데이터 유형에 제한을 설정하지 않는다. 필요에 따라서 데이터의 새 유형을 추가할 수 있다. 그렇기 때문에 소프트웨어 개발에 정형화 되지 않은 많은 양의 데이터가 필요한 경우, NoSQL을 적용하는 것이 효율적일 수 있다. 그리고 클라우드 기반으로 DB저장소를 구축하면 저렴한 비용의 솔루션을 제공 받을 수 있다. 소프트웨어에 데이터베이스의 확장성이 중요하다면 여러 데이터 센터에 걸쳐서 많은 번거로움 없이 확장할 수 있는 NoSQL DB를 사용하는 것이 좋다. 또한 스키마를 미리 준비할 필요가 없기 때문에 빠르게 개발하는 과정에 매우 유용하다. 또한 소프트웨어 버전별로 많은 다운타임없이 데이터 구조를 자주 업데이트 해야하는 경우, 일일이 스키마를 수정해주어야 하는 관계형 DB보다는 NoSQL 기반의 비관계형 DB를 사용하면 더 좋다.

2. MongoDB

MongoDB는 문서형 데이터베이스를 사용하는 NoSQL 기반의 비관계형 데이터베이스이다.

문서들은 BSON(Binary JSON)형태로 저장되고 정해진 틀이나 데이터 타입이 없다. 따라서 자유롭게 문자, 숫자, 객체, 배열 등을 저장할 수 있다.

SQL과 비교하자면 자유롭게, 즉, 사전에 정의된 테이블 필드나 관계에 맞춰 할 필요없이 데이터를 추가할 수도 있다. 그렇기 때문에 보통은 일관되지 않은 데이터들을 추가해야하거나 혹은 재빠르게 데이터를 쌓아야 할 때 사용되기도 한다. SQL에 비해 비교적 자유롭지만 스키마가 아예 없는 것은 아니다. 각 문서를 저장할 때에는 자유롭게 저장해도 되지만 자유롭게 저장하는 만큼 읽어올 때에 일종의 스키마가 있어야 수월하게 가져올 수 있다. SQL에서는 각 테이블을 생성할 때에, 그리고 각 테이블의 관계들을 사전에 정의할 때에 스키마를 정했지만 NoSQL에서는 데이터를 읽을 때에 특정 스키마에 따라 데이터를 불러와야 하기도 한다.

MongoDB에서는 MongoDB Atlas라는 클라우드 데이터베이스 서비스로 인터넷을 이용해 어디서든 접속 가능한 서비스를 제공한다. 상세한 설정 방법은 링크를 참고하자.

3. Pymongo

Python에서는 MongoDB를 사용하기 위해서 pymongo라이브러리를 사용한다. Database 커넥터이기 때문에 MongoDB연결과 해제, 데이터 입출력과 조작, 결과 반환 등의 기능을 제공한다.

pymonogo 설치

pip install pymongo

MongoDB 연결하기

from pymongo import MongoClient
client = MongoClient({URI})

URI의 형식은 다음과 같으며 이는 절대적인 것이 아닌 Atlas의 경우이다.
실제 구체적인 URI는 다음 링크를 참고하자.

💡 URI

mongodb+srv://{USER}:{PASSWORD}@{HOST}/{DATABASE_NAME}?retryWrites=true&w=majority

작업흐름

Pymongo의 작업 흐름은 SQL을 이용했던 흐름과 다르다. 이전에는 connectioncursor를 통해서 연결을 맺고 쿼리를 실행했다면 이번에는 연결하는 것은 마찬가지로 connection으로 하지만 그 후에는 database를 선택하고 documents와 상호작용하는 방식은 다르다.

client = MongoClient({URI})        # 연결
database = client[DATABASE_NAME]   # DB 선택 or 생성
collection = database[COLLECTION_NAME]    #collection 조작

콜렉션을 생성한 뒤에는 문서를 해당 콜렉션에 삽입할 수 있다.

이전에 진행했던 SQL쿼리문들과 달리 여기에서는 추가하는 것이 매우 쉽다. 특히 테이블에 대한 사전 정의나 구조가 없기 때문에 JSON형태를 바로 저장할 수 있다.

collection.insert_one({document}) # insert_one: 문서 하나 추가

더 많은 명령어와 사용법은 공식문서를 참고하자.

💡 pymongo 공식문서

2. 회고

드디어 Sprint2의 정리를 끝냈다. 이번 단원에서는 다양한 프로그램을 사용해보는 거라 명령어 자체가 많이 없는게 좋다. 그리고 강의노트를 짧게 정리하면서 정말 내가 필요한 것만 찾아서 정리해야겠다고 다시금 다짐했다. 정리는 정말 복습하면서 정리한다는 느낌으로...짧게 가져가고 내가 하고싶은거 공부 해야겠다. 이제 곧 새해인데 일단 버텨...

0개의 댓글