본문 바로가기

GO lang/web

[GO] Todo list - interface 구현1

다음 단계는 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