피드로 돌아가기
Single Responsibility Principle (SRP): Theory and Implementation in Swift
Dev.toDev.to
Backend

Swift에서 PayslipProcessor 클래스를 SalaryCalculator, PayslipContentGenerator, PayslipSender로 분리해 변경 원인별로 책임을 분리

Single Responsibility Principle (SRP): Theory and Implementation in Swift

cakoko2026년 3월 29일9intermediate

Context

PayslipProcessor 클래스는 급여 계산, 급여명세서 내용 생성, 전달이라는 3가지 기능을 모두 포함했다. 표면적으로는 모두 급여명세서 처리와 관련 있어 보였지만, 각 기능은 서로 다른 이유로 변경된다. 급여 계산은 급여 규칙 변경으로, 명세서 내용은 준수 요구사항 변경으로, 전달 방식은 통합 대상 변경으로 각각 수정되므로 한 클래스에 묶으면 테스트와 유지보수가 어려워진다.

Technical Solution

  • 책임을 변경 원인별로 분리: PayslipProcessor에서 급여 계산, 내용 생성, 전달을 담당하던 메서드를 제거
  • SalaryCalculator 클래스 도입: calculateNetSalary 메서드를 별도 클래스로 분리해 급여 규칙 변경 시 이 클래스만 수정
  • PayslipContentGenerator 클래스 도입: generatePayslipContent 메서드를 별도 클래스로 분리해 준수 요구사항 변경 시 이 클래스만 수정
  • PayslipSender 클래스 도입: sendPayslip 메서드를 별도 클래스로 분리해 전달 방식 변경 시 이 클래스만 수정
  • PayslipService 클래스로 오케스트레이션: 각 클래스 인스턴스를 주입받아 processPayslip 메서드에서 workflow를 조정하는 coordinator 역할 수행

Key Takeaway

단일 책임 원칙은 "이 함수가 이 객체에 속하는가"라는 질문보다 "이 클래스가 몇 가지 이유로 변경되는가"라는 질문으로 판단해야 한다. 변경의 원인이 서로 다른 actor(이해관계자)로부터 오면 그것이 책임을 분리해야 하는 신호다.


Swift로 도메인 서비스를 설계할 때 표면적으로 관련 있어 보이는 기능들도 변경 원인이 다르면 별도 클래스로 분리하고, 상위 service 클래스에서 dependency injection을 통해 각 클래스를 조정하는 구조를 적용하면 테스트 용이성과 유지보수성을 높일 수 있다.

원문 읽기
Single Responsibility Principle (SRP): Theory and Implementation in Swift | Devpick