🌱 DB
질좋은 웹서비스를 유저에게 제공하기 위해선 많은 데이터를 신속하고 정확하게 처리할 필요가 있다. 프로그램 file에 필요한 데이터를 저장할 경우, 파일의 용량이 너무 커져 어플리케이션의 효율적인 운용이 어려울 수도 있고 data persistancy가 망가질 염려도 있다. 더하여 거대한 양의 데이터들을 가지고 insertion / querying / updating 하는 일을 프로젝트 파일 하나 안에서 하는 것 역시 수고스럽다. 보안 문제가 있는건 더 말할 필요도 없고.
그래서 나온 것이 database(DB)다. 데이터베이스는 방금 말한 '파일에서 데이터를 다룰 때의 단점'을 보완할 수 있는 도구라고 생각하면 편하다. application의 전체적인 운영이 아닌 오로지 데이터를 잘 처리하기 위해 만들어진 것이 바로 데이터베이스인 것이다.
DB에는 SQL과 NoSQL이 존재한다. 이 자체만으로도 커다란 주제이기 때문에 세세한 설명은 넘어가겠지만 간단히 설명하자면, '관계형 데이터베이스'라고도 불리는 SQL은 정교하게 짜여진 schema에 데이터들을 집어넣고 테이블간 '관계'를 통해 데이터를 관리하는 DB이고 NoSQL은 SQL이 아닌 DB를 의미한다. 관계형이 아닌 모든 DB는 No-SQL로 분류되기 때문에 No-SQL에서 데이터를 관리하는 방식은 오브젝트 형식, 그래프 형식 등 매우 다양하다.
SQL에는 MySQL, Postgres, Oracle 등이 있고 NoSQL엔 MongoDB 등이 있다.
🌱 Mongo
우리가 사용할 No-SQL db이다. node와 함께 널리 사용되고 커뮤니티가 커서 자료를 찾아보기가 쉬워 이번 프로젝트에서 이용하기로 했다.
위 문서를 참고해 mongo를 각 운영체제에 맞는 방법으로 설치 뒤 실행하고 나면(xcode, homebrew 등을 추가로 설치해야 하기 때문에 오래걸린다) 기본적인 준비는 끝이다. 터미널에 들어가 mongo를 치면 mongo shell(mongosh)이 시작된다.
mongosh에서 가장 먼저 해야할 것은 collection을 만드는 일이다.
> show dbs
위 명령어를 치면 내 컴퓨터에 저장된 mongo db들을 전부 볼 수 있다. 여기서 'myHouse'라는 db를 하나 만들고 싶으면
> use myHouse
라고 작성한다. 그러면 쉘에 'switched to db myHouse'라는 답변이 올 것이다. 아직 myHouse db엔 아무것도 들어있지 않기 때문에 다시 show dbs를 해도 보이는 것은 없겠지만 db는 확실히 만들어졌다.
mongo에서 기본적으로 이용하는 데이터 타입은 BSON(Binary-JSON)이다. JSON과 매우 흡사하지만 js가 아닌 binary 형태로 데이터를 보존하여 JSON보다 많은 type의 데이터를 지원하고 data compress가 쉽다는 장점이 있다.
Mongo에서의 data CRUD 방식을 간단히 체험해보겠다.
> db.humans.insertOne({name:"부추",age:24})
humans는 collection이다. collection이란 간단히 말하면 SQL에서의 schema table과 비슷한 것으로서, 비슷한 데이터들의 집합을 모아놨다고 할 수 있다. 방금 humans라는 콜렉션을 만들어서 그 안에 24살 부추의 데이터를 집어넣었다. filed:value 형식의 document를 띔을 확인할 수 있다. 이를 받은 Mongo는 자기가 직접! Object Id를 생성해서 내 db에 방금의 데이터를 insert했을 것이다. 몽고는 알아서 primary key를 만든다는 특이점이 있다.
> db.humans.insertMany([{name:"파전",age:26},{name:"오징어",age:28}])
insertMany operation을 이용해 humans collection에 여러 명의 사람을 넣어보았다.
> db.humans.find()
위 커맨드를 입력하면 humans collection에 있는 모든 데이터를 볼 수 있다.
> db.humans.find({name:"부추"})
이름이 "부추"인 humans를 찾아서 보여주는 명령어이다. find method는 기본적으로 찾는 document의 cursor를 제공한다는 특징이 있다.
> db.humans.find({age:{$gt:25}})
age가 25보다 큰 humans를 찾아서 보여주는 명령어이다.
> db.humans.updateMany({name:{$in:["부추","파전"]}},{age:30})
이름이 부추 혹은 파전인 사람 모두를 찾아 age를 30으로 바꿔버리는 명령어이다.
> db.humans.deleteOne({age:30})
age가 30인 human 한 명을 찾아 지워버리라는 명령어이다.
> db.humans.deleteMany({})
위 명령어를 쳤을 경우, deleteMany()안의 조건이 '모두'에 해당하므로 humans collection에 있는 모든 데이터가 사라지게 된다.
충분히 myHouse db와 논 것 같으니 이제 myHouse DB도 삭제하도록 하자.
> db.dropDatabase()
이제 show dbs를 해도 myHouse는 보이지 않을 것이다.
Mongo의 CRUD에 대한 자세한 사항, 각종 methods, 그리고 복잡한 쿼리 방법은 모두 docs에 나와있다.
이렇게 쉘로 몽고 데이터베이스를 다룰 수 있는 방법이 있지만.. 실질적인 프로젝트는 mongoose를 이용해서 할 것이다. 몽고쉘을 이용하는 방법을 배우는 데엔 실제 데이터가 잘 업데이트 되었는지 확인하려는 목적이 크기 때문에 docs를 응용할 수 있을 정도로만 방법을 익혀두는 것이 적당하다.