medium.com/golang-issue/how-singleton-pattern-works-with-golang-2fdd61cd5a7f

 

How singleton pattern works with Golang

I always have to implement Singleton Pattern in my projects, but in Golang there are some peculiarities that we have to take care of. In…

medium.com

저는 항상 싱글톤 패턴을 제 프로젝트에서 구현해야 하지만, Golang에는 우리가 처리해야 할 몇 가지 특이한 점이 있습니다. 이 기사에서는 Golang을 사용하여 Singleton을 구현하는 두 가지 방법, 즉 "Not Thread Safe" 양식과 "Thread Safe" 양식을 제시하겠습니다. 목표는 구현 형태와 싱글톤 패턴을 구현해야 하는 시기를 실용적이고 기술적인 방식으로 제시하는 것입니다.

 

Problem to be solved

데이터베이스에 대한 연결을 열고 단일 인스턴스에 보관해야 하므로 데이터베이스에 과부하가 걸리지 않고 동시 연결의 한계가 초과되거나 코드가 최적화되는 문제가 발생하지 않습니다. 연결에는 계산 비용이 매우 많이 든다는 것을 알고 있습니다.

 

기본적으로 풀링(pooling)을 하려면 애플리케이션이 통신하기 위해 여는 모든 연결을 제어할 필요가 있습니다. 그래서 우리가 실행하는 모든 동작에서 선택, 삭제, 삽입 또는 갱신은 원자 형태의 메모리에 Singleton 패턴을 사용할 것입니다. Singleton 비동기 및 동기화 연결의 예입니다.

 


연결 풀링 문제를 해결하기 위해 Singleton 패턴을 사용하여 솔루션을 구현하기 전에 Singleton 패턴을 사용해야 하는 몇 가지 다른 예를 살펴보겠습니다.

 

다음은 전역 변수를 보호하기 위한 몇 가지 방법의 예입니다.

 

Protecting Global Variable Example 1

// type global
type singleton map[string]string

var instance singleton

func NewClass() singleton {

	if instance == nil {

		instance = make(singleton) // <-- not thread safe
	}

	return instance
}

Protecting Global Variable Example 2

var lock = &sync.Mutex{}

// type global
type singleton map[string]string

var instance singleton

func NewClass() singleton {

	lock.Lock()
	defer lock.Unlock()

	if instance == nil {

		instance = make(singleton) // <-- thread safe
	}

	return instance
}

Protecting Global Variable Example 3

var once sync.Once

// type global
type singleton map[string]string

var instance singleton

func NewClass() singleton {

	once.Do(func() { // <-- atomic, does not allow repeating

		instance = make(singleton) // <-- thread safe

	})

	return instance
}

위에서는 동기식 솔루션 예시 1 과 비동기식 솔루션 예시 2와 3이 있습니다. 예제 3은 인스턴스가 원자성이 되어 한 번에 선언되도록 함으로써 "race condition"으로부터 보호하는 가장 좋은 솔루션입니다.

이 기사의 목적은 전역 변수를 어떻게 보호하려고 하는지 정확하게 보여주기 위한 것입니다. Golang에서 우리는 이것을 하는 여러 가지 방법을 가지고 있습니다.

 

Examples of how to instantiate our Singleton (생략) ...

Goroutines and the Singleton Pattern

Golang을 사용한 싱글톤 패턴의 구현을 위한 가능한 해결책을 생각할 때, Goroutines와 마주치게 됩니다. 고루틴은 코드를 비동기적으로(asynchronously) 그리고 동시적으로(concurrently) 실행하도록 합니다. 그리고 고루틴을 애플리케이션에 사용할 때 모든 사고 방식과 구현 방식을 변화해야 했습니다. 애플리케이션은 더이상 동기적인 애플리케이션이 아니었습니다.

 

고루틴은 강력한 자원이며 올바르게 사용되면 일상적인 전투를 벌일 수 있는 강력한 동맹이 됩니다. 경쟁을 사용하는 코드를 구현할 때마다 우리는 우리가 다루어야 하는 몇몇 알려진 시나리오들을 가지고 있습니다, 프로그램 범위, 전역 변수들, 매개 변수 전달, 포인터들 등 이 모든 것들이 정확하고 최적화된 방식으로 경쟁과 함께 일할 수 있도록 처리되어야 합니다.

 

경쟁을 사용하여 발생할 수 있는 문제의 좋은 예는 전역 변수를 사용하는 것입니다. Singleton Pattern의 구현과 가능한 솔루션이 경쟁의 사용을 수용할 수 있도록 작성됩니다. Golang에서 작성된 프로그램의 런타임에 발생할 수 있는 스텔스 버그를 완화하기 위해 좋은 프로그래밍 방식을 사용하여 코드를 작성하겠습니다.

 

200 goroutines being initialized (생략) ...

What is Singleton Pattern ?

싱글톤 패턴의 설명은 다음과 같습니다:

"싱글톤은 소프트웨어 디자인 표준입니다. 이 표준은 클래스의 개체에 대한 전역 접근 지점을 유지하면서 클래스의 인스턴스 하나만 존재하도록 보장합니다."

싱글톤은 객체로의 인스턴스화를 제한하는 설계 패턴입니다. 한 번만 발생하도록 보장해야 합니다.

 

기본적으로 싱글톤은 전역 변수를 사용하는 방법입니다. 우리는 전역 변수의 사용이 얼마나 위험한지 알고 있습니다. 우리의 코드는 전역 변수의 접근에 취약하거나 시스템의 어느 부분에서든 그 값을 바꿀 수 있습니다. 그래서 프로그램을 디버그하려고 할 때, 어떤 코드 경로가 현재 상태로 이어지는지를 알아내는 것은 쉬운 일이 아닐 것입니다. 그래서 싱글톤 패턴을 안티 패턴으로 여기지 않고, 전역 변수를 보호하는 방법으로 간주합니다.

 

 


생략된 부분이 많고 번역도 미흡하지만 요약하자면

1. singleton 패턴은 전역변수를 보호하는 방법이다.

2. goroutine 에서 전역변수에 접근해야 하는 경우가 생긴다.

3. mutex, atomic, sync.Once을 Golang이 지원한다.

4. Once 가 가장 효율적인 방법이다.

'Golang' 카테고리의 다른 글

멀티 스레드 모델과 고루틴  (0) 2021.04.05
Golang, sync.Pool 디자인 이해하기(번역)  (0) 2021.03.21
Sort 정렬 인터페이스 구현  (0) 2021.02.21

+ Recent posts