CouchDB는 HTTP 기반의 REST API를 제공한다. 이 API를 이용해서 CouchDB의 모든 것을 관리할 수 있다. 나는 위키 문서를 저장하기 위한 위키 데이터베이스를 만들고, 여기에 문서를 저장하고, 읽고, 삭제 테스트를 해볼 거다. 이러한 과정을 API로 정리한다.
CouchDB는 Database management system(DMS)다. 이는 CouchDB가 여러 개의 데이터베이스를 동시에 운용할 수 있음을 의미한다. 데이터베이스는 관련된 데이터를 한데 모아 놓은 bucket이다. 이에 대한 상세한 내용은 API를 다루면서 이해할 수 있을거다.
나는 위키 문서의 정보를 저장하기 위해서 wiki라는 이름의 데이터베이스를 만들기로 했다.
# curl -X PUT http://localhost:5984/wiki
{"ok":true}
데이터베이스가 성공적으로 만들어졌다. 이 명령을 한 번 더 실행하면 "이미 데이터베이스가 존재"한다는 오류 메시지를 출력할 거다.
# curl -X PUT http://localhost:5984/wiki
{"error":"file_exists","reason":"The database could not be created, the file already exists."}
wiki 데이터베이스를 백업하기 위한 wiki-backup 이라는 데이터베이스를 새로 만들어보자. -v 옵션을 이용해서, 요청과 응답을 살펴보자.
# curl -vX PUT http://localhost:5984/wiki-backup
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 5984 (#0)
> PUT /wiki-backup HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:5984
> Accept: */*
>
< HTTP/1.1 201 Created
* Server CouchDB/1.5.0 (Erlang OTP/R16B03) is not blacklisted
< Server: CouchDB/1.5.0 (Erlang OTP/R16B03)
< Location: http://localhost:5984/wiki-backup
< Date: Mon, 05 May 2014 10:22:21 GMT
< Content-Type: text/plain; charset=utf-8
< Content-Length: 12
< Cache-Control: must-revalidate
<
{"ok":true}
* Connection #0 to host localhost left intact
문서 저장 및 업데이트 하기
wiki 데이터베이스에 데이터를 저장하기 전에, 문서의 스키마를 설계 했다.
필드이름
저장하는 데이터
Author
위키 문서를 만든 사람의 이름
Title
위키 문서의 제목
PostedDate
위키 문서를 등록한 날자와 시간
Body
위키 문서의 본문
Tag
위키 문서의 태그
위 스키마에 맞는 첫 번째 데이터를 만들었다.
# cat test0001.json
{
"Author":"yundream",
"Title":"리눅스 시스템 프로그래밍",
"PostedDate":"2014-5-5T17:30:12",
"Body":"리눅스 시스템 프로그래밍은 리눅스 시스템을 제어하는 프로그램을 만드는 일련의 과정이다....",
"Tag":["리눅스","시스템 프로그래밍","Perl"]
}
문서 저장은 PUT 혹은 GET 메서드를 이용하면 된다.
# curl -X PUT -d @test0001.json -H "application/json" http://localhost:5984/wiki/test0001
{"ok":true,"id":"test0001","rev":"1-56606932d33b3e15abdcc4c3ab815398"}
데이터베이스 이름 다음에 document id를 설정하면, 이 document id를 키로 couchdb에 저장된다. 만약 같은 이름의 document id가 이미 있다면, 실패한다.
문서를 업데이트하기 위해서는 업데이트할 문서의 "rev"와 "document id"를 명시하면 된다.
{
"_id":"test0001",
"_rev":"1-56606932d33b3e15abdcc4c3ab815398",
"Author":"yundream",
"Title":"리눅스 시스템 프로그래밍",
"PostedDate":"2014-5-5T17:30:12",
"Body":"리눅스 시스템 프로그래밍은 리눅스 시스템을 제어하는 프로그램을 만드는 일련의 과정이다. 편집중입니다.",
"Tag":["리눅스","시스템 프로그래밍","Perl"]
}
curl -X PUT -d @wiki_test.json -H "application/json" http://localhost:5984/wiki/test0001
{"ok":true,"id":"test0001","rev":"2-9d9b7769ff392452800b2c52f4119547"}
문서의 "rev"가 업데이트 된 걸 확인할 수 있다.
couchdb의 문서 관리 정책을 짐작할 수 있는 부분이다. 하나의 문서 버전에서 두 개 이상의 수정본이 존재할 수 있다. 다른 사람의 문서 버전에 신경쓰지 않고 문서를 수정하다가 나중에 합치면 된다. git의 branch와 유사한 방식이라고 볼 수 있겠다.
문서는 email처럼 첨부파일을 가질 수 있다. 파일을 첨부하는 방법은 크게 두 가지다. 첫번째 방법은 다른 위치에 파일을 저장하고, 이 파일에 대한 URL을 문서에 추가하는 거다. CouchDB는 문서에 첨부파일을 추가하기 위한 REST API를 제공한다. 두번째로 문서내에 직접 넣는 방법이 있다.
Standalone 첨부
CouchDB는 원본 문서를 건드리지 않고 첨부파일을 생성,변경 및 삭제할 수 있다.
첨부데이터의 타입은 Content-Type헤더로 지정할 수 있다. test001문서에 이미지를 하나 추가했다.
Contents
CouchDB core api
Server
Naming/Addressing
문서(Documents)
특수 필드
HTTP를 이용한 문서작업
데이터베이스 만들기
문서 저장 및 업데이트 하기
데이터베이스 읽기
문서 읽기
삭제
복사
모든 문서를 대상으로 하는 작업들
all_docs
데이터 첨부하기
Standalone 첨부
inline 첨부
Multiple Attachment
참고
Recent Posts
Archive Posts
Tags