피드로 돌아가기
Design Principles of Software: A Real-World Notification System in Go
Dev.toDev.to
Backend

SOLID 원칙 기반의 알림 시스템 설계로 확장성과 테스트 가능성 확보

Design Principles of Software: A Real-World Notification System in Go

Sergio Alberto Colque Ponce2026년 6월 17일8intermediate

Context

단일 함수 내 if-else 문으로 구성된 하드코딩 구조로 인해 새로운 알림 채널 추가 시 기존 코드 수정이 불가피한 취약한 설계 구조. 전송 로직과 전송 수단이 강하게 결합되어 SMTP 서버 등 외부 의존성 없이는 단위 테스트가 불가능한 병목 지점 발생.

Technical Solution

  • SRP 적용을 통한 채널별 전송 책임 분리 및 개별 Notifier 타입 정의
  • Notifier Interface 도입으로 구체 구현체가 아닌 추상화에 의존하는 DIP 구조 설계
  • Dispatcher 구조에 Notifier 슬라이스를 주입하여 기존 코드 수정 없이 채널을 확장하는 OCP 구현
  • 상속 대신 인터페이스 조합을 활용한 Composition 기반의 유연한 컴포넌트 조립
  • io.Writer 주입을 통한 Transport 계층 추상화로 외부 API 의존성 제거 및 테스트 격리 환경 구축
  • GitHub Actions를 통한 gofmt, go vet, go test 자동화로 설계 원칙의 강제성 부여

1. 새로운 기능 추가 시 기존 함수를 수정해야 한다면 OCP 위반 여부를 검토하십시오.

2. 외부 API 호출 로직이 비즈니스 로직과 결합되어 있다면 Interface를 통한 DIP 적용을 고려하십시오.

3. 테스트 코드 작성이 어렵다면 구체 클래스가 아닌 추상화된 인터페이스에 의존하고 있는지 확인하십시오.

4. 조건문이 계속 늘어나는 패턴의 코드를 전략 패턴(Strategy Pattern)이나 인터페이스 다형성으로 전환하십시오.

원문 읽기