본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 2. · 31 Views
Go 디자인 패턴 완벽 가이드
Go 언어의 핵심 디자인 패턴을 실전 예제와 함께 학습합니다. 싱글톤, 팩토리, 빌더 등 실무에서 자주 사용되는 패턴들을 다룹니다.
들어가며
이 글에서는 Go 디자인 패턴 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
1. 싱글톤 패턴
개요
애플리케이션 전체에서 단 하나의 인스턴스만 생성되도록 보장하는 패턴입니다. DB 연결이나 설정 관리에 주로 사용됩니다.
코드 예제
package main
type Database struct {
connection string
}
var instance *Database
var once sync.Once
func GetInstance() *Database {
once.Do(func() {
instance = &Database{connection: "mysql://localhost"}
})
return instance
}
설명
sync.Once를 사용하여 thread-safe하게 단 한 번만 인스턴스를 생성합니다. 여러 고루틴에서 호출해도 안전합니다.
2. 팩토리 패턴
개요
객체 생성 로직을 별도 함수로 분리하여 유연성을 높이는 패턴입니다. 인터페이스를 반환하여 구체적인 타입을 숨깁니다.
코드 예제
type Notification interface {
Send(message string)
}
type EmailNotification struct{}
type SMSNotification struct{}
func NewNotification(t string) Notification {
if t == "email" {
return &EmailNotification{}
}
return &SMSNotification{}
}
설명
타입에 따라 적절한 구현체를 반환하며, 호출자는 인터페이스만 알면 됩니다. 새로운 타입 추가가 쉽습니다.
3. 빌더 패턴
개요
복잡한 객체를 단계적으로 생성하는 패턴입니다. 선택적 파라미터가 많을 때 유용하며 가독성이 높습니다.
코드 예제
type Server struct {
host string
port int
timeout int
}
type ServerBuilder struct {
server *Server
}
func (b *ServerBuilder) Host(h string) *ServerBuilder {
b.server.host = h
return b
}
func (b *ServerBuilder) Build() *Server {
return b.server
}
설명
메서드 체이닝으로 객체를 구성하며, 필요한 속성만 설정할 수 있습니다. 복잡한 생성자를 피할 수 있습니다.
4. 옵저버 패턴
개요
객체의 상태 변화를 여러 구독자에게 자동으로 알리는 패턴입니다. 이벤트 기반 시스템에서 많이 사용됩니다.
코드 예제
type Observer interface {
Update(data string)
}
type Subject struct {
observers []Observer
}
func (s *Subject) Attach(o Observer) {
s.observers = append(s.observers, o)
}
func (s *Subject) Notify(data string) {
for _, o := range s.observers {
o.Update(data)
}
}
설명
Subject가 상태 변경 시 모든 Observer에게 알립니다. 느슨한 결합으로 확장성이 뛰어납니다.
5. 전략 패턴
개요
알고리즘을 런타임에 선택할 수 있도록 하는 패턴입니다. 동일한 작업을 다양한 방식으로 수행할 때 유용합니다.
코드 예제
type PaymentStrategy interface {
Pay(amount float64) string
}
type CreditCard struct{}
type PayPal struct{}
func ProcessPayment(s PaymentStrategy, amount float64) {
result := s.Pay(amount)
fmt.Println(result)
}
설명
결제 방식을 인터페이스로 추상화하여 런타임에 전략을 교체할 수 있습니다. 조건문 없이 깔끔한 코드 작성이 가능합니다.
6. 데코레이터 패턴
개요
기존 객체에 새로운 기능을 동적으로 추가하는 패턴입니다. 상속 대신 조합을 사용하여 유연성을 높입니다.
코드 예제
type Coffee interface {
Cost() float64
}
type SimpleCoffee struct{}
type MilkDecorator struct {
coffee Coffee
}
func (m *MilkDecorator) Cost() float64 {
return m.coffee.Cost() + 0.5
}
설명
기본 커피에 우유, 시럽 등을 래핑하여 가격을 누적합니다. 조합 가능한 기능 확장이 가능합니다.
7. 어댑터 패턴
개요
호환되지 않는 인터페이스를 연결하는 패턴입니다. 기존 코드 수정 없이 새로운 시스템과 통합할 때 사용합니다.
코드 예제
type OldPrinter struct{}
func (o *OldPrinter) PrintOld(s string) {
fmt.Println("Old:", s)
}
type PrinterAdapter struct {
old *OldPrinter
}
func (p *PrinterAdapter) Print(s string) {
p.old.PrintOld(s)
}
설명
새로운 Print 인터페이스를 구현하면서 내부적으로 기존 PrintOld를 호출합니다. 레거시 코드 재사용이 가능합니다.
8. 템플릿 메서드 패턴
개요
알고리즘의 골격을 정의하고 세부 구현은 서브타입에 위임하는 패턴입니다. 공통 로직을 재사용하면서 변형을 허용합니다.
코드 예제
type DataProcessor interface {
ReadData() string
ProcessData(data string) string
SaveData(data string)
}
func Execute(dp DataProcessor) {
data := dp.ReadData()
processed := dp.ProcessData(data)
dp.SaveData(processed)
}
설명
Execute 함수가 전체 흐름을 제어하고 각 단계는 구현체가 정의합니다. 일관된 처리 절차를 강제할 수 있습니다.
9. 커맨드 패턴
개요
요청을 객체로 캡슐화하여 실행을 지연시키거나 취소할 수 있게 하는 패턴입니다. Undo/Redo 기능 구현에 적합합니다.
코드 예제
type Command interface {
Execute()
Undo()
}
type Light struct {
on bool
}
type LightOnCommand struct {
light *Light
}
func (c *LightOnCommand) Execute() {
c.light.on = true
}
func (c *LightOnCommand) Undo() {
c.light.on = false
}
설명
명령을 객체로 만들어 실행과 취소를 구현합니다. 명령 히스토리 관리가 쉬워집니다.
10. 체인 오브 리스폰시빌리티 패턴
개요
요청을 처리할 수 있는 객체들을 체인으로 연결하여 순차적으로 처리 기회를 주는 패턴입니다. 미들웨어 구현에 자주 사용됩니다.
코드 예제
type Handler interface {
SetNext(h Handler) Handler
Handle(req string) string
}
type BaseHandler struct {
next Handler
}
func (b *BaseHandler) SetNext(h Handler) Handler {
b.next = h
return h
}
func (b *BaseHandler) Handle(req string) string {
if b.next != nil {
return b.next.Handle(req)
}
return ""
}
설명
각 핸들러는 요청을 처리하거나 다음 핸들러로 전달합니다. HTTP 미들웨어와 같은 파이프라인 구조에 적합합니다.
마치며
이번 글에서는 Go 디자인 패턴 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Go #DesignPatterns #Singleton #Factory #Builder
댓글 (0)
함께 보면 좋은 카드 뉴스
관찰 가능한 마이크로서비스 완벽 가이드
마이크로서비스 환경에서 시스템의 상태를 실시간으로 관찰하고 모니터링하는 방법을 배웁니다. Resilience4j, Zipkin, Prometheus, Grafana, EFK 스택을 활용하여 안정적이고 관찰 가능한 시스템을 구축하는 실전 가이드입니다.
Prometheus 메트릭 수집 완벽 가이드
Spring Boot 애플리케이션의 메트릭을 Prometheus로 수집하고 모니터링하는 방법을 배웁니다. Actuator 설정부터 PromQL 쿼리까지 실무에 필요한 모든 내용을 다룹니다.
스프링 관찰 가능성 완벽 가이드
Spring Boot 3.x의 Observation API를 활용한 애플리케이션 모니터링과 추적 방법을 초급 개발자 눈높이에서 쉽게 설명합니다. 실무에서 바로 적용할 수 있는 메트릭 수집과 분산 추적 기법을 다룹니다.
Zipkin으로 추적 시각화 완벽 가이드
마이크로서비스 환경에서 분산 추적을 시각화하는 Zipkin의 핵심 개념과 활용 방법을 초급자도 쉽게 이해할 수 있도록 실무 스토리로 풀어낸 가이드입니다. Docker 실행부터 UI 분석까지 단계별로 배웁니다.
Micrometer Tracing 완벽 가이드
분산 시스템에서 요청 흐름을 추적하는 Micrometer Tracing의 핵심 개념과 실전 활용법을 초급 개발자도 쉽게 이해할 수 있도록 실무 스토리와 비유로 풀어낸 완벽 가이드입니다.