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.go
에Client
구조체 정의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 설계 시 권장되는 패턴