팩토리는 공장이라는 뜻을 내포하고 있다. 우리가 공장에 어떤 제품을 요청하면, 공장에서 그에 맞는 제품을 내놓는다. 이때 개발자는 공장의 내부를 알고 있을 필요가 없다. 그냥 공장에서 제공하는 제품의 목록과 이름을 알고 있으면 된다. 소프트웨어 공학에서 팩토리 메서드는 메서드의 구현을 서브 클래스에 위임하는 개발 방법이다. 개발자는 필요에 따라서 다양한 구현을 할 수 있으며, 이름으로 객체를 만들어서 쓸 수 있다.
데이터베이스에 접근해서 질의를 수행하는 애플리케이션을 개발한다고 가정해보자. 환경에 따라서 MySQL, Postgresql, Oracle, SqLite등 다양한 데이터베이스를 사용 할 수 있을 것이다. 그러면 추상 클래스를 만들고, 각 데이터베이스를 위한 서브클래스를 만들어서 메서드를 구현하면 된다. 이렇게 만든 데이터베이스 클래스는 아래와 같이 호출 하면 된다.
sql.Open("mysql") : mysql 데이터베이스 객체를 리턴한다.
sql.Open("postgresql") : postgresql 데이터베이스 객체를 리턴한다.
나는 팩토리 패턴을 이용해서 위 기능을 구현하기로 했다.
먼저 세션데이터를 관리하기 위한 Session interface를 만들었다. 이 interface는 Session 관리를 위한 4개의 메서드를 가질 것이다.
Create() : 세션을 만든다.
Get() : 세션을 가져온다.
Update() : 세션을 업데이트 한다.
Delete() : 세션을 삭제한다.
기타 몇개 에러까지 정의해서 아래와 같은 코드를 만들었다.
var (
SessionFoundError = errors.New("Session not found")
letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
)
func RandStringRunes(n int) string {
rand.Seed(time.Now().UnixNano())
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}
type Session interface {
Create(value string) string
Get(id string) (string, error)
Delete(id string) error
}
Update까지 구현하려니 귀찮아서 뺐다. 세션값을 랜덤하게 만들기 위해서 RandStringRunes 함수를 추가했다. Create 메서드는 RandStringRunes를 이용해서 랜덤한 세션아이디를 만든다.
세션 데이터는 key-value 형태로 저장한다. id는 세션 아이디로 key가 되며, 세션에 저장할 값이 value가 된다. 실제 구현시에는 value를 interface 타입을 사용하겠으나, 변환하기 귀찮아서 그냥 string을 사용했다.
메모리 기반 세션 메니저
이제 첫번째 구현을 만들어보자. 일단 가장 간단한 메모리 처리버전을 만들어보기로 했다. 이 코드는 세션아이디와 값을 golang의 map 에 저장한다.
type MemSession struct {
DB map[string]string
}
func MemSessionNew() *MemSession {
sess := &MemSession{DB: make(map[string]string)}
return sess
}
func (m *MemSession) Create(v string) string {
randStr := RandStringRunes(32)
m.DB[randStr] = v
return randStr
}
func (m *MemSession) Get(id string) (string, error) {
if v, ok := m.DB[id]; ok {
return v, nil
}
return "", SessionFoundError
}
func (m *MemSession) Delete(id string) error {
if _, ok := m.DB[id]; ok {
delete(m.DB, id)
return nil
}
return SessionFoundError
}
Contents
Factory method pattern
예제
메모리 기반 세션 메니저
REDIS 기반 세션 메니저
완전한 코드
개선 - 세션 프로바이더 만들기
Recent Posts
Archive Posts
Tags