2 MongoDB 맛보기

source: categories/study/database-mongodb/database2.md

2.1 MongoDB Atlas(Managed Cloud Service)

몽고DB를 여러분들의 PC, 노트북에 설치할 수도 있는데, 이 강의에선 그렇게하지 않고 클라우드 서비스를 사용할 겁니다.
MongoDB Atlas라는 몽고DB 클라우드 서비스를 사용할겁니다.
사용하는 것은 무료버전이고 개발하는데 전혀 지장이 없다.
서비스를 하실 때만 좀 더 성능이 좋은 유료버전을 사용하면 된다.

그래서 이 강의에선 몽고DB 아틀라스로 모든걸 할 예정이다.

위 Database가 실제로 저희가 사용할 몽고DB 서버가된다.

몽고DB 아틀라스라는게 물리적인 서버까지 지원해주는 것이 아니다.
물리적인 서버는 AWS, Gooble Cloud, Azure 이 3개 중에 하나를 선택해주면, 이 서버에서 소프트웨어적인 것들을 다 관리해주는 것이다.
즉, 위 3개가 데브옵스 영역을 해주는 것이다.

(데이터베이스 서버 비용 결제는 아틀라스에서 일괄적으로 진행하면된다. 선택하신 클라우드사 가입 그리고 비용 지불 방법은 신경 쓰지 않아도 된다.)

현재 위에 보면 제일 가까운 무료 서버로 AWS의 싱가폴이 있다.

개발 몽고DB 서버 설정 끝~.

2.2 데이터베이스 생성 및 연결

설정이 완료된 모습이다.
버전은 4.2 이상으로 하면된다.
강의 막바지에 설명해드리는 기능 중에 하나가 Transaction이라고 있는데 그 기능을 사용하려면 4.2 이상이어야된다.
4.0부터 지원하긴 하는데 4.2부터 쓰는 걸 권장한다.

나중에 운영 버전으로 버전 업그레이드를 하고 싶을 때 위와 같이 Edit Configuration으로 들어가면,

위와 같이 Cluster Tier 부분에서 원하는 기능으로 업그레이드를 해주시고

서버를 유료로 선택하면 지역도 더 많은 부분들이 생길 것이다.

그리고 유료 서비스를 사용하려면 위 Billing에서 카드를 등록하면된다.
그러면 매달 정기적으로 결제가 될 것이다.

여튼 위 화면에서 데이터를 관리하기도 하는데, 여기서 직접 관리할건 아니고 데이터베이스 서버에 연결하는 것을 해보겠다.

처음에 보안적으로 두가지 설정이 필요한데 일단 IP 제한을 할 수 있다.

운영 서버인 경우는 백앤드 서버의 IP와 회사 IP정도만을 등록해놓을 것이다.

4LJF7mOUMVHqvm4u

그런데 만약 password를 까먹었다면?

위와 같이 새롭게 password를 생성하고, Update User까지 해준다.
(이제 아까 비밀번호는 더이상 유효하지 않다.)

적용이 완료된 후 다시 접속하면 아래와 같이 접속이 가능하다.

접속이 완료되면 위와 같이 데이터베이스가 3개(admin, config, local)가 있는 것을 볼 수 있는데, 이 3개는 설정 관련된 것이므로 건들지 않는 것이 좋다.

2.3 create document

몽고DB 컴파스 왼쪽 아래쪽을 보면 MONGOSH라는 것이 있는데 이를 활용하면 터미널로 DB에 접속할 수 있다.
이 터미널을 통해 간단하게 DB를 조작하는 것을 보여드리도록 하겠다.

일단 db라고 치고 엔터키를 누르면 test라고 나온다.
아까 DB에 접속할 때, URL 끝에 test라고 되어있었는데, 지금 기본으로 설정된 db가 test인 것이다.
그런데 만약 다른 데이터베이스를 만들고싶다면 아래와 같이 입력한다.

그런데 분명 위와 같이 blog라는 데이터베이스를 만들었는데, 새로고침을해도 데이터베이스 목록에 blog란 데이터베이스가 나오지 않는다.
몽고DB에서는 데이터베이스가 바로 생성이되는 것이아니라 그 데이터베이스에 데이터가 생성이되면 그때 알아서 데이터베이스까지 생성이된다.

이제 blog 데이터베이스의 users라는 콜렉션(테이블)에 document(row)를 생성해보도록 하겠다.

document(row)를 생성했더니, 이제야 데이터베이스 목록에 blog가 생겼다.

그리고 그 안에 users라는 콜렉션도 있는 것을 볼 수 있다.
(콜렉션도 데이터베이스처럼 데이터 생성시 자동 생성되는 것을 알 수 있다.)

db.users.insertOne({name:"hyungju-lee", email:"testtest@gmail.com"})

그런데 분명 document(row)를 생성할 때, 위와 같이 nameemail만을 생성했는데, 생성된 값을 보면

이렇게 _id:Objectid(~~~) 이런 것도 있는 것을 볼 수 있다.
이는 몽고DB에서 자동 생성해주는 유니크 키이다.
관계형DB라고 치면 PRIMARY KEY라고 생각하시면된다.

2.3 Schemaless 특성

관계형 DB에선 표로 저장된다.
하지만 몽고DB는 표가 아닌 ‘객체'로 저장을한다.
자바스크립트를 하신 분이라면 JSON이라는 객체를 아실텐데 JSON을 그대로 저장한다고 보시면 된다.
사실 JSON을 좀 더 효율적인 형태로 바꾼 BSON 형태로 저장하긴하는데, 그냥 JSON이라고 보시면 된다.

그래서 처음에 몽고DB를 몽고DB답게 써야된다고 말씀드렸던게, 그 차이가 여기서오는 것이다.
데이터 구조 자체가 관계형DB의 테이블(표)과는 완전히 다르기 때문에.

그래서 이러한 차이를 잘 활용하는 것이 굉장히 중요하다.

단순히 객체를 저장할 수도 있고, 객체 안에 객체 형태를 저장할 수도 있고 반대로 배열도 들어갈 수도 있다.

이러한 특징을 영어로 Schemaless라고한다.
관계형DB에선 엄격하게 "name에는 string만 들어가야되고 email에도 string만 들어가야된다" 이런 것들이 엄격하게 정해져있지만, 몽고DB는 보시면 자유롭다.
데이터가 서로 다른 형식이어도 상관이 없다.

2.4 update document

db.users.updateOne({name:"hyungju-lee"}, {$set:{age: 34}})

2.5 update nested document

db.users.updateOne({"name.first":"Elon"}, {$set:{"name.last":"musk2"}})

위와 같이 depth가 길면 따옴표를 해주고 .(점)으로 연결해야된다.
왜냐하면 사실 이게 자바스크립트 문법을 쓰는건데, 따옴표없이 쓰면 에러가 나기 때문이다.

2.6 Update with ObjectId

이전까지 탐색을 name 프로퍼티 키를 사용해서 했는데, 이게 문제가뭐냐면 데이터들이 계속해서 바뀔 수가 있잖아?
그래서 보통은 _id로 탐색을 하는 경우가 많다.

db.users.findOne({_id:"610891c50f8bb8540672549f"})
db.users.findOne({_id:ObjectId("610891c50f8bb8540672549f")})

예전 MongoDB 터미널에선 let ObjectID = require('mongodb').ObjectID 없이는 에러가 났었는데, 버전 업데이트를 통해 이제는 let ObjectID = require('mongodb').ObjectID 해줄 필요없이 db.users.findOne({_id:ObjectId("610891c50f8bb8540672549f")}) 이렇게해도 잘 조회된다.

db.users.updateOne({_id:ObjectId("610891c50f8bb8540672549f")}, {$inc:{age:1}})

2.7 delete document

db.users.deleteOne({_id:ObjectId("610891c50f8bb8540672549f")})

2.8 CRUD

지금까지 실습한 것에 대해 간단하게 용어 정리를 하겠다.

  1. Create
  2. Read
  3. Update
  4. Delete

DB 작업을하면 크게 위와 같이 4가지가 있다.
User를 만들어보기도 했고(Create) 조회(Read)해보기도 했다.
전체 데이터를 조회하기도 했고 특정 키를 통해 하나만 조회해보기도 했다.
그리고 그 User를 다양한 방법으로 수정(Update)도 해봤다.
그리고 마지막으로 삭제(Delete)도 해봤다.

위 4가지가 사실상 DB작업의 전부인데, 이걸 얼마나 잘 응용하고 조합하는지에 따라 복잡도가 올라갈 순 있지만 기본 핵심은 이렇게 4가지라고 보면된다.

2.9 Database 구조

처음에 몽고DB에서 blog라는 데이터베이스를 생성했다.
그리고 그 밑에 users라는 콜렉션을 만들었다.
그리고 각 콜렉션별로 데이터가 있다.
그 각각의 데이터를 document라고 부른다.

관계형 DB에선 용어가 위와 같다.
데이터베이스 용어는 똑같은데, 콜렉션은 테이블이라고 부른다.
그리고 도큐먼트가 아니라 row라고 부른다.

  • 관계형DB는 표 형식으로 저장하기 때문에 이름이 테이블, row 이렇게 부른다.
  • 몽고DB에서는 콜렉션, 도큐먼트라고 부른다.