티스토리 뷰

golang

NoSQL 을 쓰는 이유

주먹불끈 2020. 8. 20. 19:28

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 필드를 삭제한 생성했던 녀석

 


반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함