SQLite 는 오픈소스로 누구나 자유롭게 사용 가능한 심플한 RDBMS 이다.
지난 세 번의 프로젝트에서 모두 NoSQL 로 대표되는 MongoDB 를 사용했고, 시퀄라이저를 활용한 MySQL 도 가능하지만 무료버전은 성능이 많이 떨어진다는 글이 많아서 이번에는 SQLite 를 사용해보기로 했다.
go-sqlite3 패키지를 사용하기 위해서는 GCC 가 필요하다. GCC는 GNU C compiler 로 C 언어 표준 컴파일러를 지원한다. 이것은 aqlite 가 C 언어로 만들어져 있고, 그것을 Go 언어에서 사용해야 하기 때문이다.
나의 경우 Mac과 Windows PC 를 모두 가지고 있기 때문에 Windows OS 환경에서 연습할 때는 tdm-gcc 에서 MinGW 를 설치하고 MinGW CLI 에서 아래 명령어를 실행했다. (리눅스나 Mac 환경에서는 그냥 실행하면 되었다.)
$ go get github.com/mattn/go-sqlite3
type dbHandler interface {
GetTodos() []*Todo
AddTodo(name string) *Todo
RemoveTodo(id int) bool
CompleteTodo(id int, complete bool) bool
}
type memoryHandler struct {
todoMap map[int]*Todo
}
func (m *memoryHandler) GetTodos() []*Todo {
list := []*Todo{}
for _, v := range m.todoMap {
list = append(list, v)
}
return list
}
func (m *memoryHandler) AddTodo(name string) *Todo {
id := len(m.todoMap) + 1
todo := &Todo{id, name, false, time.Now()}
m.todoMap[id] = todo
return todo
}
func (m *memoryHandler) RemoveTodo(id int) bool {
if _, ok := m.todoMap[id]; ok {
delete(m.todoMap, id)
return true
} else {
return false
}
}
func (m *memoryHandler) CompleteTodo(id int, complete bool) bool {
if todo, ok := m.todoMap[id]; ok {
todo.Completed = complete
return true
} else {
return false
}
}
이제 memoryHandler 는 dbHandler 인터페이스를 구체적으로 구현한 구현체가 되었다.
패키지가 로드될 때 처음 딱 한 번 호출되는 init 함수도 아래와 같이 변경한다.
func newMemoryHandler() dbHandler {
m := &memoryHandler{}
m.todoMap = make(map[int]*Todo)
return m
}
var handler dbHandler
func init() {
handler = newMemoryHandler()
}