220613_TIL / NoSQL

신두다·2022년 6월 13일
0

TIL

목록 보기
41/82

Key words

NoSQL, MongoDB (specifically MongoDB Atlas), Pymongo, XML/JSON/YAML

1. XML/JSON/YAML

  • NoSQL의 탄생 배경을 알기 위해, 웹상에서 주고 받는 데이터의 형태를 알아야 한다는 의미에서 살펴 본 개념이다.
  • 이 영상을 참고하자.
  • 간단히만 요약하면,
    • xml은 tag를 사용한다. tag를 사용하다보니 매번 열고 닫고 하기 귀찮고, 코드가 길어지는 비효율이 발생할 수 있다.
      • 참고로 XML은 HTML과 비슷하게 보이는데, 차이점에 대해서는 이 글을 추가로 찾아 봤다.
    • Json은 문법 오류(특히 오타)에 취약한 단점이 있다. 한 군데 틀리면 전체가 오류가 난다거나, 키에는 꼭 쌍따옴표만 쓸 수 있다거나 등. 그리고 주석 기능도 사용이 불가하다. (주석을 못 단다니..)
    • YAML은 Json의 여러 단점을 보완하고, 사람이 보기 쉽게 한다는 것에 목적을 두고 나온 것이다. 단, 그렇다보니 데이터의 직렬화(한 줄로 표현)이 불편해서 데이터 전송이나 API 등에는 잘 쓰지 않는다고 한다.
  • 셋에 대해선 또한 JSON은 XML에 비해 압도적으로 간결하고, YAML은 JSON보다 더 간결하다. 라는 말이 있는 것처럼, xml -> json -> yaml으로 대체/발전되는 흐름으로 탄생 배경을 이해하면 될 것 같다. (물론 그렇다고 json이 xml보다 무조건 우수하다는 식으로 생각하면 곤란해~)

  • 데이터의 형태 얘기가 나와서 말인데, 예전에 들었는데 가물가물했던게 있어서 여기 다시 기록해둔다.
    • 정형 데이터: 형태가 있고, 연산이 가능한 데이터를 말함. 예시: SQL(RDB), Excel, CSV
    • 반정형 데이터: 형태가 있지만, 연산이 불가능한 데이터를 말함. XML, HTML.
    • 비정형 데이터: 형태가 없고, 연산이 불가능한 데이터를 말함. 영상 데이터, 음성 데이터 등.

2. NoSQL

  • 지난 시간까지 난 주로 관계형 데이터 베이스에 대해서 접해왔고, 배웠고, 사용해왔다. 이 NoSQL은 비관계형 데이터 베이스 기술을 아우르는 말로 생각하면 된다.
  • NoSQL의 형태로는 Document, Key-Value, Column-Family, Graph 등이 있다. 이 종류에 대한 자세한 정보는 이 사이트를 참고하자. (사이트 좋아!!)
  • NoSQL이 등장하게된 배경
    • 이 배경을 잘 이해하면, NoSQL의 특징과 장단점에 대해 쉽게 알아차릴 수 있는 것 같다.
    • 2000년대 초반 웹 시장이 크게 성장하면서, 데이터의 양과 소스 또한 폭발적으로 증가하기 시작했다. 이에따라 RDB로 이 많은 데이터를 처리하기에 설계시간도 오래 걸리기 시작했고,
    • 기존에는 서버가 부족할 때 수직확장(서버를 더 큰 걸 쓰는 등)을 했는데 이는 비용이 많이 들어가는 방식이었다. 따라서 NoSQL은 하나의 서버를 크게 만드는 것보다, 여러 개의 서버를 연결시켜 확장하는 수평확장을 통해 많은 비용을 절감하는 방식으로 발전된다. (클러스터링, 네트워크 방식 등)
  • 너무 구구절절한가.. 간단하게 표현하면, 웹 시장이 커지면서 데이터는 더 많이 더 다양한 형태로 마구마구 들어오는데, 그 데이터 다 처리할 수 있도록 구조 짜는 것도 어렵고, 수정하는 것도 복잡해지고, 서버가 감당하도록 하려면 비용도 많이 들기 때문에 이러한 문제를 해결하고자 비관계형 데이터베이스의 형태가 등장하게 된 것으로 생각하면 된다!
  • NoSQL을 보다 잘 이해하기 위해서는 RDB와 NoSQL의 특징과 차이를 본게 큰 도움이 되었다.
    • RDB - 테이블을 사전에 정의하고 그에 알맞은 형태의 데이터만 넣을 수 있다. (스키마) 그렇다보니 무결성이 높고 쿼리문을 통해 쉽게 원하는 데이터에 빠르게 접근할 수 있다.
    • NoSQL - 스키마가 없는 건 아니지만 여기서 스키마는 주로 데이터를 읽어올 때 쓴다고 한다. NoSQL은 데이터를 일단 넣어! 이기 때문에 기존에 RDB에 담기 어려웠던 다양한 형태의 데이터를 빠르게 적재할 수 있는 장점이 있다. (심지어 데이터의 구조가 없는 대용량의 데이터라도 말이다.) 또한 NoSQL은 수평확장을 하기 때문에 확장성 측면에서도 RDB에 비해 훨씬 유리하다. (서버 확장하는데 더 싸니까!)
    • 필드에서는 이 둘중 택일을 한다기보단 목적에 따라 겸용하는 경우가 더 많은 것 같다. 데이터베이스의 무결성/ACID이 중요하거나, 들어오는 데이터가 구조적으로 일관적인 경우 주로 RDB를 쓰고, 구조가 거의 없는 대용량 데이터를 다루거나 빠르게 서비스를 구축하고 데이터 구조가 자주 업데이트 되는 경우에느 NoSQL을 쓴다고 함)
  • 아, 참고로 NoSQL은 RDB에 비해 보안이 취약하다고 한다.

3. MongoDB

  • 오늘 실습 때 사용했던 NoSQL 형식의 데이터베이스다. MongoDB는 위에서 봤던 NoSQL의 종류 중 Document형 데이터베이스다.
  • 이 용어 차이는 참고!
  • 사이트에서 가입하고 팀을 만들고, 프로젝트를 생성했다.
  • 오늘은 MongoDB Atlas를 통해 클러스터를 생성하고 실습을 진행했다. MongoDB Atlas는 클라우드 데이터베이스 서비스로 인터넷을 이용해 어디서든 접속 가능한 서비스라고 한다.

4. Pymongo

  • MongoDB를 파이썬과 연결하는데 쓰이는 패키지다! 클러스터를 connect할 때 있는 3가지 옵션(CLI, Application, MongoDB GUI) 중 두 번째를 선택해서 VScode에서 작업할 수 있었다.
  • (오늘은 연결할 때 URI를 통했는데, 그러기 위해선 dnspython이라는 패키지가 필요하다고 한다. 참고. 오는 requirements.txt에 있었는지 직접 설치하진 않았다.)
  • 기본적인 코드는 아래와 같다. 데이터베이스와 연결해줄 Client를 가장 처음 만들어줘야 한다. URI 방식 말고도 연결하는 방법은 더 있는 것 같다.
from pymongo import MongoClient

client = MongoClient({URI})

# 참고: 'mongodb+srv://{유저 이름}:{유저 비밀번호}@cluster-prac.hubjn.mongodb.net/{기본 데이터베이스 이름}?retryWrites=true&w=majority'
  • 조작은 RDB에서 했던 것과 플로우가 다르다. 참고로 오늘은 특히 공식문서 보는게 도움이 많이 되었다.
# 데이터 베이스 생성/선택 (없는 데이터베이스면 생성됨)
db_1 = client["db_1"]

# 유사하게 컬렉션(테이블)도 조작 가능
collection_1 = db_1["new_collection"]

#컬렉션을 생성하면 데이터 넣기도 쉽게 가능하다.
collection_1.insert_one({"a":"hi", "b":[1, 2, {"c":"bye"}]})

# 데이터 검색 (가장 첫 값 가져오기)
doc_1 = collection_1.find_one()
print(doc_1)
  • 위 플로우만 잘 기억하면 될 듯.. 근데 아마 관련 작업을 미래에 하게 될 때 이 포스트를 다시 찾아오게 될 것 같은 예감이 든다.. 허허허~
  • 위에서 말 안한게 있는데, MongoDB에서 데이터 넣을 때 _id를 지정 안 해주면 자동으로 넣어주는데, 이게 데이터 고유번호이다!!!

4. 실습한 것

오늘은 아래 실습을 해보았다.

  • 주어진 Json 데이터를 MongoDB에 입력하기
  • API를 통해 불러온 데이터를 MongoDB에 입력하기
    • 첫 번째 문제와 다르게 이건 딱 하나의 데이터가 아니라서 insert_one이 아니라 insert_many를 하는게 차이였다.
  • NoSQL에서 데이터 가져오기: 두 번째 문제에서 입력한 데이터 중 name만 가져와서 set형태로 저장한다.

내가 적었던 코드 중 일부만 가져다 기록해둔다.

[주어진 Json 데이터를 MongoDB에 입력하기]

# MongoDB와 연결
client = MongoClient(MONGO_URI) 

# db 생성 및 연결
db_1 = client[DATABASE_NAME] 

# collection 생성 및 연결
collection_1 = db_1[COLLECTION_NAME]

# insert data
collection_1.insert_one(openweather)

[API를 통해 불러온 데이터를 MongoDB에 입력하기]

# MongoDB와 연결
client = MongoClient(MONGO_URI) 

# db 생성 및 연결
db_2 = client[DATABASE_NAME] 

# collection 생성 및 연결
collection_1 = db_2[COLLECTION_NAME]

# insert data
collection_1.insert_many(octokit) 

# reference => https://pymongo.readthedocs.io/en/stable/tutorial.html#inserting-a-document => Search 'Bulk Insert'
  • 위 파이썬 파일 여러 번 실행하면 데이터 계속 누적 적재되니 주의해야 한다. (여기서 알 수 있는 건 NoSQL은 중복 데이터 관리 등이 이렇게 어려울 수 있는 단점이 있구나~~ 하는 것)
  • 아래는 기본으로 주어진 코드였는데 기억해두면 좋을 것 같아서 추가로 기록해둔다. 이전에 API 때 배운 거긴 하지만~ 리마인드~~
octokit = ''
dont_touch= []
response = requests.get("https://api.github.com/users/octokit/repos")
# 주의할 점 : github API 는 호출이 너무 많이 발생하면 자체적으로 제한을 걸 수 있습니다.
# 한번의 API 호출 후 1초 sleep 시간을 지정합니다.
time.sleep(1)

if response.status_code == 200:
    octokit = response.json()
    dont_touch = copy.deepcopy(octokit)

[NoSQL에서 데이터 가져오기]

 MongoDB와 연결
client = MongoClient(MONGO_URI) 

# db 연결
db_2 = client[DATABASE_NAME] 

# collection 연결
collection_1 = db_2[COLLECTION_NAME]

# 데이터 검색
res = collection_1.find()

# anwser
names = []

def Part_3_answer():
    for data in res:
        name = data['name']
        names.append(name)
    return set(names)

# print(Part_3_answer()) => 이걸로 잘 나오나 테스트했다.

# reference => https://pymongo.readthedocs.io/en/stable/tutorial.html#querying-for-more-than-one-document => 'Querying for More Than One Document'

5. 그 외

  • 과제 코드 동기들에게 공유할 때 비밀번호 등은 그냥 지우고 commit해서 올리곤 했는데, getenv를 통해서 별도의 파일에서 불러와서 할 수 있는 방법을 보았다! 예를 들어 env 파일 하나 만들어서 그 안에 공개되면 안되는 정보 입력해두고, gitignore에 해당 파일 정보를 넣어두면 commit할 때 해당 파일은 안 올라간다. 그리고 해당 비밀번호를 써야하는 파일에서 해당 정보를 불러올 때 getenv를 통해 불러올 수 있는 것. 나중에 한 번 써봐야겠다. 아마 필드가면 쓰게될 일이 많겠지?

Feeling


  • 오늘은 컨디션이 좋지 않아서 도전과제는 내일의 나에게 맡기기로 했다. 오늘 기본과제는 결과적으로는 되게 간단한거여서 이것만 하기는 뭔가 찝찝하긴 하다. 내일 도전과제도 해보자. (할 수 있을거야..)
  • 내일 벌써 스챌이라니 시간 너무 빠른거 아닌가..! 암튼 이번 섹션 프로젝트는 웹 어플리케이션 개발까지 하게 된다고 오늘 들었는데, 눈에 보이는 frontend 말고 항상 상상만 하던 backend의 구조를 직접 짜볼 수 있을 거라고 생각하니 굉장히 기대되었다.
  • 컨디션 관리 해야지.. 컨디션 관리!
profile
B2B SaaS 회사에서 Data Analyst로 일하고 있습니다.

0개의 댓글