Golang Functional Options 패턴 완벽 가이드
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Golang Master Class: Functional Options

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

Go 언어로 HTTP 클라이언트나 라이브러리 개발을 진행하는 개발자

난이도: 중급 이상 (구조 패턴 이해 필요)

핵심 요약

  • functional options 패턴은 기본값을 미리 설정한 객체에 필요한 옵션만 적용하여 유연한 구성 가능
  • Option func(*Client) 형태의 함수를 통해 클라이언트 설정을 분리 및 확장 가능
  • NewClient(base string, opts ...Option)에서 ...Option은 가변 인수로 여러 옵션을 동시에 전달 가능

섹션별 세부 요약

1. 문제 정의 및 배경

  • 타입 안전한 언어(Go)에서 기본값으로 초기화된 객체에 필요한 옵션만 적용하는 것이 어려움
  • JavaScript의 Object.assign과 유사한 패턴이 필요하지만 Go에서는 별도의 구조화된 방식 필요

2. HTTP 클라이언트 구현 예시

  • internal/client/http.goClient 구조체 정의
  • NewClient 함수에서 기본값(Timeout: 5s, Headers 등)을 미리 설정
  • opts ...Option 파라미터로 가변 인수를 받음

3. Option 함수 정의

  • opts.go에서 Option func(*Client) 타입 정의
  • WithTimeOut, WithBearerToken, WithHeaders 등의 함수가 클라이언트 필드를 수정
  • 예: WithTimeOut(d time.Duration)c.httpClient.Timeout = d를 실행

4. 사용 예시 및 적용

  • main.go에서 NewOnlineStore 생성자에 WithTimeOut, WithBearerToken 옵션 전달
  • httpOpts...로 가변 인수를 전달하여 복수 옵션 동시 적용 가능

결론

  • functional options 패턴은 유연한 구성과 코드 유지보수성을 동시에 달성 가능
  • Option func(*Client)와 가변 인수(...Option) 활용으로 불필요한 매개변수 제거
  • Go의 타입 안전성과 결합해 라이브러리 및 API 설계 시 권장되는 패턴