PHpullh
학습 라이브러리/Go/인터페이스 설계 원칙

GO · 구조체/인터페이스

인터페이스 설계 원칙

Go의 암시적 인터페이스 구현을 활용한 설계 원칙. "소비자가 인터페이스를 정의한다"가 핵심입니다.

구조체/인터페이스중급interface-designconsumersmall-interfaceimplicit

핵심 설명

Go의 암시적 인터페이스 구현을 활용한 설계 원칙. "소비자가 인터페이스를 정의한다"가 핵심입니다.

Go code

package main

import "fmt"

// 원칙 1: 작은 인터페이스
type Saver interface {
	Save(data []byte) error
}

// 원칙 2: 소비자 측에서 정의
// 패키지 A가 인터페이스를 정의, 패키지 B가 구현
type Notifier interface {
	Notify(msg string) error
}

// 구현체들 — 인터페이스를 몰라도 됨
type FileSaver struct{ Path string }
func (f FileSaver) Save(data []byte) error {
	fmt.Printf("파일 저장: %s (%d bytes)\n", f.Path, len(data))
	return nil
}

type SlackNotifier struct{ Webhook string }
func (s SlackNotifier) Notify(msg string) error {
	fmt.Printf("Slack 알림: %s\n", msg)
	return nil
}

// 인터페이스를 받아 사용
func backup(s Saver, n Notifier) {
	s.Save([]byte("backup data"))
	n.Notify("백업 완료")
}

func main() {
	backup(
		FileSaver{Path: "/backup"},
		SlackNotifier{Webhook: "https://hooks.slack.com/..."},
	)
}

학습 팁

"인터페이스는 생산자가 아닌 소비자가 정의한다"가 Go의 핵심 설계 원칙입니다. 필요한 메서드만 포함하세요.

주의할 점

구현체 패키지에서 인터페이스를 정의하고 반환하는 것은 Java 스타일입니다. Go에서는 호출하는 쪽에서 필요한 인터페이스를 정의하세요.

자주 묻는 질문

인터페이스 설계 원칙란 무엇인가요?

Go의 암시적 인터페이스 구현을 활용한 설계 원칙. "소비자가 인터페이스를 정의한다"가 핵심입니다.

인터페이스 설계 원칙 학습 시 주의할 점은 무엇인가요?

구현체 패키지에서 인터페이스를 정의하고 반환하는 것은 Java 스타일입니다. Go에서는 호출하는 쪽에서 필요한 인터페이스를 정의하세요.