들어가며
MySQL만 사용해보다가 이번에는 MongoDB를 사용해보게 됐다.
덕분에 DB에 대해 한번 더 복습할 수 있는 기회와 새로운 종류의 DB를 사용해볼 수 있게 되어서 기분이 좋다.
DB(Database) : SQL VS NoSQL
SQL
흔히 관계형 데이터베이스라고 불리는 SQL(RDBMS)는 행과 열로 이루어져있는 DB이다. 칸칸이 나누어져있는 엑셀이라고 생각하면 된다. 대표적으로 MySQL이 있음!
SQL의 가장 큰 특징은 정해진 스키마 즉, 정해진 규격에 따라 DB테이블에 저장된다는 것이다. MySQL을 공부하면 정해진 '문법'에 따라 정해진 '구조' (ex. 테이블, 필드 등)에 맞춰 저장을 해야했다. 또, 이미 테이블의 스키마를 정의해두면 정의된 스키마대로만 데이터를 담을 수 있다!
두번째 특징은 관계형이라는 점이다.
이게 무슨말인가 싶은데, MySQL에서 테이블을 생성할 때 user가 product를 구매하는 데이터를 담는 테이블을 생성한다고 가정해보자.
한 명의 user는 여러 개의 product를 구매한다.이때, user라는 테이블을 생성하고 그 테이블 안에 user의 정보와 product의 정보를 모두 담는 것이 아니라 user와 product 테이블로 나누어 관리하게 되는데 이걸 1대 N관계라고 부른다.
관계가 이해하기가 어려운 부분이라 잘 설명해둔 링크를 가지고 왔다.
관계형 데이터베이스 설계 (관계 종류 1:1 / 1:M / N:M )
SQL과 관계형데이터베이스를 공부하다보면 이런 궁금증이 생길 수도 있다
SQL은 Structured Query Language의 약자잖아요! DB언어인데 왜 관계형데이터베이스를 SQL이라고 불러요?
관계형 데이터베이스는 데이터베이스의 한 유형으로, 하나의 데이터 조직화 컨셉이다.
RDBMS 솔루션 (ex. MySQL)까지 묶어서 관게형 데이터베이스라고도 하며, 이러한 관계형 데이터베이스는 모두 SQL이라는 언어를 사용하므로 둘은 같다고 봐도 무방하기 때문에 관계형 데이터베이스 = SQL이라고 부르는 것이다.
NoSQL
비관계형 DB인 NoSQL은 스키마도 없고 관계도 없다. 대표적으로 MongoDB가 있다.
NoSQL에서는 데이터들을 문서(document)로 부르고 이는 JSON과 비슷한 형태로 저장되며, SQL과 달리 데이터를 유연하게 다룰 수 있다. 다만, 엄격하게 구조를 정해놓은 SQL보다 데이터의 일관성이 없거나, 중복될 수 있다는 단점이 존재한다.
MongoDB 사용하기 : atlas
MongoDB를 따로 설치하지 않고 웹으로 사용할 수 있도록 atlas에 회원가입하고 DB와 커넥션을 생성해주었다.
해당 과정은 어렵지 않으니 따로 작성하진 않았음!
MongoDB를 사용하기 위한 기본코드 (중괄호로 감싸진 부분들을 나에게 맞게 바꾸는 것 잊지말자.)
from pymongo import MongoClient
import certifi
ca = certifi.where()
client = MongoClient('mongodb+srv://{userName}:{Password}@cluster0.2mrec.mongodb.net/{db명}?retryWrites=true&w=majority', tlsCAFile=ca)
db = client.db{프로젝트명}
DB에 insert하는 쿼리는 SQL과는 비교도할 수 없이 간단하다.
위에서 설명했듯이 NoSQL은 JSON형태(혹은 Python의 dictionary)로 이루어져있기 때문에 JSON형태로 만들어 보내주면 된다.
doc = {
'name':'bob',
'age':27
}
db.users.insert_one(doc)
db에 저장하는 메소드는 db.도큐먼트명.메소드()의 형태로 사용한다.
값이 잘 들어간 걸 확인할 수 있다.
pymongo 메소드들
- insert_one() : db에 데이터를 저장한다
- find({}) : db에 저장된 모든 데이터를 불러온다
- find({}, {'_id':false}) : db가 자동으로 생성해주는 id값을 제외하고 불러온다
- find_one({'key':'value'}) : 특정 데이터를 불러온다
- update_one({'key':'value'}, {'$set':{'key':'value'}}) : 특정 데이터를 변경한다.
- delete_one({'key':'value'}) : 특정 데이터를 삭제한다.
예시들
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
마치며
되게 신선한 문법들인데 MySQL할 때보다는 쉬워서 배우기 어렵지 않았다. 또 이런 쿼리들은 쓰다보면 자연스럽게 외워지기 때문에 부담갖지 않고 재밌게 실습했다!
'Study > TIL' 카테고리의 다른 글
[TIL] 5/11 항해99 3일 차 - 미니프로젝트 (0) | 2022.05.12 |
---|---|
[TIL] 05/10 항해99 2일 차 - 미니프로젝트 (0) | 2022.05.10 |
[TIL] 05/09 항해99 1일 차 - 미니프로젝트 (0) | 2022.05.10 |
[TIL] 04/10 항해99 웹개발 종합반 0주 차 : 사전준비 - Flask (0) | 2022.04.10 |
[TIL] 04/08 항해99 웹개발 종합반 0주 차 : 사전준비(1) - Python (0) | 2022.04.08 |