본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 2. · 69 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)
함께 보면 좋은 카드 뉴스
카프카 모니터링과 운영 완벽 가이드
Apache Kafka의 모니터링과 운영 실무를 다룹니다. JMX 메트릭부터 Prometheus+Grafana, 컨슈머 랙 알림, 로그 관리, 매니지먼트 도구까지 카프카를 안정적으로 운영하는 데 필요한 모든 것을 배웁니다.
Kafka 보안 설정 완벽 가이드
Apache Kafka의 보안 설정을 단계별로 학습합니다. SASL 인증부터 SSL/TLS 암호화, ACL 인가, mTLS 상호 인증까지 실무에 필요한 보안 기법을 모두 다룹니다.
Kafka Connect 완벽 가이드
Kafka Connect를 활용하여 외부 시스템과 카프카를 손쉽게 연동하는 방법을 배웁니다. Source Connector와 Sink Connector의 개념부터 JDBC, Elasticsearch 연동까지 실무 예제와 함께 알아봅니다.
Kafka CLI 명령어 완벽 실습 가이드
카프카의 핵심 CLI 명령어를 실습 중심으로 학습합니다. 토픽 관리부터 메시지 송수신, 컨슈머 그룹 관리, 오프셋 제어, 브로커 설정 확인까지 터미널에서 직접 실행해보며 카프카의 동작 원리를 체득할 수 있습니다.
토픽과 파티션의 이해 완벽 가이드
Kafka의 핵심 데이터 구조인 토픽과 파티션의 개념부터 오프셋, 메시지 순서 보장, 삭제 정책까지 실무에 필요한 모든 내용을 다룹니다. 카프카를 제대로 이해하기 위해 반드시 알아야 할 기초를 탄탄하게 다집니다.