티스토리 뷰
Photo by Tobias Fischer on Unsplash
개요
Golang 에서 쓸 수 있는 Key-value NoSQL Database 인 Bolt DB 를 이용해서 NoSQL 의 장점을 알아보자
* Key-value NoSQL Database 의 단점을 하나 짚고 넘어가자. Query 속도등에는 취약하다.
- 이런게 필요하고 많은 데이터 및 성능이 중요하다면 SQLite 로 가자
링크
- 예제 GitHub: https://github.com/nicewook/boltdb-bolthold-nosql
- BoltDB GitHub: https://github.com/boltdb/bolt
- 현재는 stable 상태로 더 이상의 업데이트는 없다고 천명했으며
- bbolt 로 fork 되어 개선되고 있다. https://github.com/etcd-io/bbolt
- BoltHold GitHub: https://github.com/timshannon/bolthold
- Bolt DB 를 바로 쓰기보다 BoltHold 또는 Storm https://github.com/asdine/storm 을 거쳐서 사용하면 훨씬 간편하게, 추가적인 query, index 기능을 사용하며 쓸 수 있다.
- 실무에서는 Storm 을 쓰긴 하지만 BoltHold 가 좀더 나은 점이 있는듯 하여 여기서는 BoltHold 를 이용해본다.
TL;DR
대표적인 NoSQL 의 장점인 운영중인 DB 의 스키마(?)를 수시로 변경할 수 있다는 점을 보여주려 한다.
1. 먼저 하나의 구조체를 정의하고, BoltDB 에 저장한다. 구현후에 운영을 한다고 상상해보자
2. 운영하다보니 새로운 필드가 필요하다. 기존의 데이터베이스를 migration 하거나 날려버리지 않고도 새로운 필드가 추가된 구조체를 덮어서 저장할 수 있다
- 즉, 데이터베이스 안에 특정 필드가 있고, 없는 레코드들이 함께 있게 된다.
3. 이번에는 필요없어진 필드를 없애보자
4. 마지막으로 다시 모든 필드를 다시 살려서 데이터베이스를 읽어보자
운영중인 시스템에서 새로운 요구사항이 발생하여 데이터베이스의 스키마를 변경하게 되더라도 NoSQL 은 이처럼 유연하게 대응이 가능하다.
Learning by doing
깃헙 예제를 가져와서 https://github.com/nicewook/boltdb-bolthold-nosql
bolt1.go 부터 bolt4.go 까지 순서대로 실행해보면 된다.
bolt1.go
1) 구조체를 만들고
2) bolthold 를 이용해 BoltDB 에 저장한 다음
3) 저장된 모든 레코드를 불러와서 출력한다.
-구조체 인스턴스를 이쁘게 출력하기 위해 http://github.com/davecgh/go-spew/spew 라는 패키지를 사용하였다.
|
1) User structure 는 ID, Name, Age 라는 필드를 가진다.
2) bolthold.Open() 으로 key-value.db 라는 파일을 생성하여 열고
3) User structure 의 인스턴스를 하나 생성한다.
4) store.Upsert() 로 저장해둔다.
5) store.Find() 로 다시 꺼낸 후 출력한다.
아래는 그 출력의 결과이다.
|
bolt2.go
위와 같이 bolt1.go 에서 정의한 구조체로 개발이 완료되고 운영되고 있다고 생각해보자.
그런데 User 구조체에 Email 필드를 추가해 달라는 요청사항이 들어왔다.
이때에 NoSQL 의 장점이 빛을 발한다. 그냥 User 구조체를 새로이 정의하고 사용하면 된다.
|
1) User 구조체에 Email 필드를 추가로 정의 하였다.
2) 새로이 정의한 User 구조체에 맞추어 user 인스턴스를 생성한다음 저장 - bolt1.go 에서 저장한 key-value.db 파일에 추가될 것이다.
3) 그러고 모든 레코드를 읽어와 출력하면 아래와 같이 나온다. - 자연스럽게 필드가 추가되었다.
|
bolt3.go
이번에는 기존의 필드를 지워보겠다.
|
1) 새로이 ID 3번이 출력되었고,
2) 3개의 User 레코드 모두에 Name 필드는 없다.
|
bolt4.go
이젠 지웠던 Name 을 다시 되살려보자.
User ID 1과 User ID 2 의 경우에는 Name 필드가 고스란히 남아 있음을 확인 할 수 있다.
|
User (ID: 1) - Email 필드가 없을때 생성한 녀석
User (ID: 2) - Email 필드를 추가하고 생성한 녀석
User (ID: 3) - Name 필드를 삭제한 후 생성했던 녀석
|
'golang' 카테고리의 다른 글
WSL2 에서 gvm 사용하기 (Go Version Manager) (0) | 2020.09.13 |
---|---|
WSL2 에 Go 설치하기 (3) | 2020.09.11 |
go 동시성 패턴: or-done-channel 정리 (0) | 2020.07.30 |
go build 의 -ldflags 옵션으로 빌드정보를 프로그램에 담아보자 (0) | 2020.07.22 |
Rob Pike의 The Laws of Reflection 블로그 포스팅 분석 (0) | 2020.02.28 |
- Total
- Today
- Yesterday
- github
- JIRA
- 노션
- solid
- websocket
- 체호프
- 클린 애자일
- Shortcut
- notion
- bun
- OpenAI
- postgres
- Gin
- 영화
- 2023
- 독서
- ChatGPT
- strange
- Bug
- API
- golang
- 독서후기
- go
- agile
- pool
- 인텔리제이
- 제이펍
- folklore
- 잡학툰
- intellij
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |