2016년 7월 14일 목요일

NoSQL과 MongoDB의 기본 개념

 안녕하세요? 김성중입니다.

 거의 모든 웹 앱은 정보를 (영속적으로) 유지하기 위해 데이터베이스에 의존합니다. 여기서 데이터베이스는 주로 관계형이거나 NoSQL입니다. NoSQL 데이터베이스는 이름이 의미하듯 SQL을 사용하지 않으며, 쉬운 사용법과 빠른 속도 덕분에 최근에 많이 사용되고 있습니다. NoSQL 데이터베이스는 문서 저장소, 객체 저장소, Key-Value 저장소로 구분할 수 있고, Redis, Memcached, Cassandra, MongoDB, Couchbase 등이 있습니다. NoSQL 데이터베이스가 일반적으로 관계형 데이터베이스보다 더 빠른 이유는 엄격한 데이터 일관성을 강제하거나 정해진 스키마를 따르지 않기 때문입니다.

 MongoDB란?

 몽고디비는 NoSQL 데이터베이스의 Document 저장소로 분류됩니다. 몽고디비는 데이터를 BSON(Binary JSON) 형태의 문서로 저장합니다. JSON을 기본 형식으로 사용하기 때문에 자바스크립트 앱을 위해 간편하고 편리한 인터페이스를 제공합니다. 몽고디비는 또한 상호 대화식 Shell, 데이터 불러오기/내보내기, 통계 보고용 앱과 같은 여러 도구도 함께 설치하여 사용할 수 있습니다.

 MongoDB 명령어

 몽고디비를 지역적으로 사용하려면 먼저 몽고디비 데몬인 mongod를 시작해야 합니다. mongod는 mongo 명령에서 비롯된 연결을 받아들입니다. 기본적으로 mongo는 localhost의 포트 27017에 연결을 시도하지만, --port와 --host 플래그를 사용해서 다르게 구성할 수 있습니다. 


 mongo로 몽고디비에 연결하면 아래 그림처럼 db 명령을 사용해서 현재 데이터베이스 이름을 볼 수 있습니다. 디폴트로 설정된 test 데이터베이스에 연결된 것이 보이시죠?


 다른 데이터베이스로 변경하려면 use 명령 뒤에 전환하고 싶은 데이터베이스 이름을 붙이면 됩니다. 예를 들어, yamiyami 데이터베이스로 전환하려면 다음과 같은 명령을 내립니다. 이 명령은 아직 yamiyami 데이터베이스를 생성하지 않았음에도 불구하고 동작합니다.



 새로운 데이터 삽입

 db는 현재 DB 이름을 출력하는 기능뿐만 아니라 데이터를 조작할 수 있는 DB의 최상위 객체이기도 합니다. 예를 들어 yamiyami 디비에 'sungjung'을 추가하고 싶다면, 먼저 `use yamiyami` 명령을 내려 yamiyami 디비로 전환합니다. 그 다음 아래 그림처럼 `sungjung`을 삽입합니다. 이 명령은 객체 {name:sungjung`}을 yamiyami 디비의 people 컬렉션에 추가합니다. yamiyami 디비는 아직 존재하지 않지만, 몽고디비는 이 디비를 바로 생성해 줍니다. 또한 show dbs와 show collections 명령을 사용해서 현재 yamiyami 디비와 people 컬렉션이 존재하는지 확인할 수 있습니다.


 또한, 아래와 같이 객체 배열을 전달하는 방법을 사용하면 insert() 호출 하나로 여러 항목을 추가할 수 있습니다.



 데이터 검색

 데이터를 디비에 추가했으므로 다시 읽을 수단이 필요합니다. 이를 위해 컬렉션의 find() 함수를 사용하면 됩니다. 아래 그림은 yamiyami 디비에서 컬렉션의 모든 항목을 검색한 결과입니다. 검색 결과에 보이는 _id 필드는 몽고디비에서 부여하는 객체에 대한 유일한 식별자입니다.


 아래 예제는 이름이 'sungjung'인 데이터를 검색하는 방법입니다. 검색 기준으로 name 필드에 /^sungjung/ (sungjung로 시작하는 문자열)이라는 정규표현식을 사용하였습니다. 더 정확한 질의를 원한다면 `db.people.find({name: 'sungjung}) 을 사용할 수 있습니다.



 데이터 갱신

 데이터는 컬렉션의 update() 함수를 사용해서 갱신합니다. 
  • @param1 : 질의 객체. 이 객체는 갱신해야 할 항목을 명시하여 find()와 동일 한 구문으로 사용
  • @param2 : 갱신되어야 하는 값.
  • @param3 : 옵션 객체.
  • 옵션1 - upsert : 값이 true로 설정될 경우, update()는 질의 기준에 맞는 기존 항목이 없을 경우 새로운 문서를 생성한다.(default: false)
  • 옵션2 - multi : 값이 true로 설정될 경우, updates()는 질의 기준과 일치하는 모든 문서를 변경한다.(default: false)
  • 옵션3 - writeConcern : 갱신의 쓰기 동작 방식을 정의.
 아래 명령어를 통해 'sungjung'은 'jeremy'로 바꼈고, 나이를 명시하기 위해 문서에 age라는 새로운 필드도 추가했습니다. 이는 RDB와 비교해서 NoSQL의 유연성을 보여주는 예임. 실행 시점에 NoSQL 디비는 개별 데이터에 새로운 필드를 정의할 수 있어요. 
 


 데이터 삭제

 마지막 CRUD 연산은 삭제입니다. remove() 함수를 사용하면 컬렉션에서 데이터를 삭제할 수 있습니다. 
  • @param1 : find() 형태의 질의 객체.
  • @param2 : 옵션 객체
  • 옵션1 - justOne : true로 설정하면 삭제가 하나의 문서로 제한된다.(default: false)
  • 옵션2 - writeConcern : update()의 writeConcern과 동일한 방식.
 아래 명령어를 통해 이름이 'sungjung'인 사람 중 한 명을 삭제하였습니다. name 필드가 'sungjung'인 데이터가 여러개 임에도 불구하고 한 명만 삭제되었습니다.



 컬렉션 삭제

 컬렉션의 drop() 함수를 사용해서 디비에서 전체 컬렉션을 삭제할 수 있습니다. 아래 명령어를 통해 yamiyami 디비 안에 있는 people 컬렉션을 삭제하였습니다.


 show collections 명령으로 해당 컬렉션이 더 이상 존재하지 않음을 확인하시면 됩니다.



 데이터베이스 삭제

 dropDatabase() 함수를 사용해서 현재 디비와 여기에 속한 모든 데이터를 삭제할 수 있습니다. 아래 명령어를 통해 yamiyami 디비를 삭제하였습니다.



댓글 없음:

댓글 쓰기