싱글턴 디자인 패턴은 소프트웨어 프로그래밍에서 가장 중요하고 자주 사용되는 패턴 중 하나입니다. 이는 애플리케이션 런타임 동안 클래스에 단일 인스턴스만 있도록 보장하고 해당 인스턴스에 대한 전역 액세스 지점을 제공합니다. 이 기사에서는 Singleton의 중요성, Golang에서 구현하는 방법, 특히 동시 환경에서 싱글턴이 가져오는 이점에 대해 논의합니다.
싱글톤은 클래스의 인스턴스를 단일 인스턴스로 제한하는 디자인 패턴입니다. 이는 다음과 같이 단일 제어 지점이나 단일 공유 리소스가 필요한 상황에서 특히 유용합니다.
더 이해하기 쉬운 Pattern 구현에 대한 몇 가지 사항을 나열하고 모든 것이 장밋빛인 것은 아니며 이와 관련하여 발생할 수 있는 몇 가지 문제를 보여 드리겠습니다.
싱글톤을 구현하기 위해 Golang을 사용하겠습니다. 이 언어에서는 여러 고루틴이 동시에 인스턴스에 액세스하려고 시도하는 경우에도 하나의 인스턴스만 생성되도록 동시성에 특별한 주의를 기울여야 합니다.
우리의 예를 실제 세계에 더 가깝게 만들기 위해 애플리케이션용 Logger를 만들어 보겠습니다. 로거는 로그 일관성을 보장하기 위해 고유해야 하는 애플리케이션의 일반적인 도구입니다.
먼저 단일 인스턴스를 갖고 싶은 구조를 정의합니다.
package logger import ( "fmt" "sync" ) type Logger struct {} var loggerInstance *Logger
NewInstance 함수는 싱글톤 구조의 단일 인스턴스를 반환하는 역할을 합니다. 동시 환경에서 보안을 보장하기 위해 뮤텍스를 사용하고 효율성을 위해 이중 확인 잠금을 구현합니다.
package logger import ( "fmt" "sync" ) type Logger struct{} var logger *Logger var mtx = &sync.Mutex{} func NewInstance() *Logger { if logger == nil { mtx.Lock() defer mtx.Unlock() if logger == nil { fmt.Println("Creating new Logger") logger = &Logger{} } } else { fmt.Println("Logger already created") } return logger }
로그 도구에는 항상 정보만 표시하는 Info, 오류를 표시하는 Error 등의 일부 로그 유형이 있습니다. 이는 애플리케이션에 표시하려는 정보 유형을 필터링하는 방법이기도 합니다.
그러므로 Info 유형의 로그를 표시하는 메서드를 만들어 보겠습니다. 이를 위해 로그 메시지를 수신하고 이를 INFO 형식으로 포맷하는 함수를 생성하겠습니다.
package logger import ( "fmt" "sync" "time" ) const ( INFO string = "INFO" ) type Logger struct{} var logger *Logger var mtx = &sync.Mutex{} func NewInstance() *Logger { if logger == nil { mtx.Lock() defer mtx.Unlock() if logger == nil { fmt.Println("Creating new logger") logger = &Logger{} } } else { fmt.Println("Logger already created") } return logger } func (l *Logger) Info(message string) { fmt.Printf("%s - %s: %s\n", time.Now().UTC().Format(time.RFC3339Nano), INFO, message) }
그리고 새 로거를 사용하기 위해 기본 패키지 내에서 이를 인스턴스화하고 로그를 생성하여 이 구현이 어떻게 작동하는지 확인하겠습니다.
package main import ( "playground-go/pkg/logger" ) func main() { log := logger.NewInstance() log.Info("This is an example of log") }
프로그램을 실행했을 때의 결과는 다음과 같습니다.
Creating new logger 2024-07-03T19:34:57.609599Z - INFO: This is an example of log
NewInstance가 실제로 하나의 인스턴스만 실행되도록 보장하는지 테스트하려면 다음 테스트를 수행할 수 있습니다.
package main import ( "fmt" "playground-go/pkg/logger" ) func main() { log := logger.NewInstance() log.Info("This is an example of log") log2 := logger.NewInstance() log2.Info("This is another example of log") if log == log2 { fmt.Println("same instance") } else { fmt.Println("different instance") } }
로그가 변경되었으며 이제 새 인스턴스 생성이 차단되었음을 확인할 수 있습니다.
Creating new logger 2024-07-03T19:45:19.603783Z - INFO: This is an example of log Logger already created 2024-07-03T19:45:19.603793Z - INFO: This is another example of log same instance
싱글턴 패턴은 애플리케이션 런타임 중에 특정 클래스의 인스턴스가 하나만 존재하도록 보장하는 강력한 도구입니다. 로거 예제에서는 애플리케이션 전체에서 로그 일관성을 보장하기 위해 이 패턴을 적용하는 방법을 확인했습니다.
이 내용이 Golang의 싱글톤을 더 잘 이해하는 데 도움이 되기를 바랍니다.
위 내용은 싱글톤 디자인 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!