Singleton Pattern

오동재·2022년 7월 3일
1
post-thumbnail

Singleton Pattern??

객체의 인스턴스가 오직 1개만 생성되는 패턴이다.

what?

예를 들어보자,

싱글톤을 사용하지 않은 경우

// users.go
package users

import "fmt"

type info struct {
	name string
	age  int
}

type Infos []info

func MakeDB() Infos {
	var users Infos
	return users
}

func (users *Infos) PushInfo(name string, age int) {
	tempInfo := info{name, age}
	*users = AddInfo(users, tempInfo)
}

func AddInfo(users *Infos, data info) Infos {
	return append(users.GetInfo(), data)
}

func (users Infos) GetInfo() []info {
	return users
}

func (users Infos) PrintUsers() {
	for _, i := range users {
		fmt.Printf("%s %d\n", i.name, i.age)
	}
}
//main.go
package main

import (
	users "study/dongjae"
)

func main() {
	userDB := users.MakeDB()

	userDB.PushInfo("dongjae", 21)
	userDB.PushInfo("dongjae jr", 11)
	userDB.PushInfo("papa dongjae", 45)
	userDB.PushInfo("grandpa dongjae", 71)

	userDB.PrintUsers()
}

위 코드는 싱글톤 패턴을 사용하지 않고 usersDB를 사용하는 예시이다.
main.go를 보면 userDB에 DB공간을 할당해주고 데이터를 넣는다. 헌데 이렇게 하면 users.go소스 코드가 차지하는 메모리와 userDB가 차지하는 메모리가 서로 달라 공간이 낭비되고, 혹여 선언이 두번 될 경우 원래 DB와 새로 선언된 DB는 아예 다른 DB이기 때문에 공간도 낭비되고 개발자가 의도한 방식이 아닐 수 있다.
이러한 메모리 낭비를 막고, DB의 유일성을 보장하기 위해서 singleton pattern을 사용한다.

싱글톤을 사용한 경우

//users.go
package users

import (
	"fmt"
	"sync"
)

type info struct {
	name string
	age  int
}

type Infos struct {
	data []info
}

var users *Infos
var once sync.Once

func PushInfo(name string, age int) {
	tempInfo := info{name, age}
	users.data = append(users.data, tempInfo)
}

func PrintUsers() {
	for _, i := range users.data {
		fmt.Printf("%s %d\n", i.name, i.age)
	}
}

func GetInfo() *Infos {
	if users == nil {
		//once.DO(func()) 는 func()가 몇번, 언제 호출되든 한번만 실행되게 함.
		once.Do(func() {
			// 이 코드는 단 한번만 실행되어야함 => sync Once 사용
			users = &Infos{}
		})
	}
	return users
}
//main.go
package main

import (
	users "study/dongjae"
)

func main() {
	users.GetInfo()

	users.PushInfo("dongjae", 21)
	users.PushInfo("dongjae jr", 11)
	users.PushInfo("papa dongjae", 45)
	users.PushInfo("grandpa dongjae", 71)

	users.PrintUsers()
}

이렇게 싱글톤을 사용하면 users package에서 DB를 다루기 때문에 메모리 공간을 절약할 수 있고, DB를 두 번 만들게 될 일이 없다. GetInfo 함수를 호출하면 DB가 없는 경우 DB를 초기화하고, DB가 있는 경우에는 있던 DB를 가져다 쓰기 때문이다.

profile
https://donggni0712.tistory.com 로 이사했습니다~

0개의 댓글