🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Go 디자인 패턴 완벽 가이드 - 슬라이드 1/11
A

AI Generated

2025. 11. 2. · 31 Views

Go 디자인 패턴 완벽 가이드

Go 언어의 핵심 디자인 패턴을 실전 예제와 함께 학습합니다. 싱글톤, 팩토리, 빌더 등 실무에서 자주 사용되는 패턴들을 다룹니다.


카테고리:TypeScript
언어:Java
메인 태그:#Go
서브 태그:
#DesignPatterns#Singleton#Factory#Builder

들어가며

이 글에서는 Go 디자인 패턴 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 싱글톤_패턴
  2. 팩토리_패턴
  3. 빌더_패턴
  4. 옵저버_패턴
  5. 전략_패턴
  6. 데코레이터_패턴
  7. 어댑터_패턴
  8. 템플릿_메서드_패턴
  9. 커맨드_패턴
  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

#Go#DesignPatterns#Singleton#Factory#Builder#TypeScript

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

함께 보면 좋은 카드 뉴스

이전7/7
다음