다음 단계는 map 방식의 구조에서 sqlite DB 형식으로 todo list 저장방식을 변경할 예정입니다.
그래서 구조변경을 쉽게할수 있는 interface 방식으로 구조를 변경하는 샘플입니다.
interface 의 장점은 특정 기능을 변경시, 간결하여 유지보수가 쉬운 장점이 있다.
예를 들면, todo lists 를 저장하는 방식을 메모리방식에서 DB 방식으로 변경시 수정사항을 최소화 할 수 있다.
코딩량이 줄어 든다는 의미는 아니고, 변경사항을 최소화하여 오류 발생 가능성을 최소화 할 수 있다.
기본 구조는 아래와 같다.
./model/model.go 변경 사항
1. interface 에 실제 함수 기능 선언
package model
import (
"time"
)
type Todo struct {
ID int `json:"id"`
Name string `json:"name"`
Completed bool `json:"completed"`
CreatedAt time.Time `json:"created_at"`
}
type dbHandler interface {
// private 처리함
getTodos() []*Todo
addTodo(name string) *Todo
removeTodo(id int) bool
completeTodo(id int, complete bool) bool
}
var handler dbHandler
func init() {
handler = newMemoryHandler()
// sqlite hanlder 만들면 아래처럼 변경만 하면 됨.
// handler = newSqliteHandler()
}
func GetTodos() []*Todo {
return handler.getTodos()
}
func AddTodo(name string) *Todo {
return handler.addTodo(name)
}
func RemoveTodo(id int) bool {
return handler.removeTodo(id)
}
func CompleteTodo(id int, complete bool) bool {
return handler.completeTodo(id, complete)
}
./model/memoryHandler.go - newMemoryHandler 구현 및 interface 내부 함수 구현
package model
import (
"log"
"time"
)
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
log.Println("add Todo success")
return todo
}
func (m *memoryHandler) removeTodo(id int) bool {
if _, ok := m.todoMap[id]; ok {
delete(m.todoMap, id)
return true
}
return false
}
func (m *memoryHandler) completeTodo(id int, complete bool) bool {
if todo, ok := m.todoMap[id]; ok {
todo.Completed = complete
return true
}
return false
}
func newMemoryHandler() dbHandler {
m := &memoryHandler{}
m.todoMap = make(map[int]*Todo)
return m
}
[참고자료]
'GO lang > web' 카테고리의 다른 글
[GO] Todo list - sqlite (0) | 2021.11.18 |
---|---|
[GO] Todo list - interface 구현2 (0) | 2021.11.18 |
[GO] Todo list - refactoring(구조변경) (0) | 2021.11.17 |
[GO] Todo list - map 자료구조 (0) | 2021.11.17 |
[GO] Web - Restful API, TDD (0) | 2021.11.04 |