C#

C# 기초부터 고급까지 Chapter 2.1.1. SRP (Single Responsibility Principle) – 단일 책임 원칙

Juan_ 2025. 4. 27. 20:57
728x90

📚 Chapter 2.1.1: SRP (Single Responsibility Principle) – 단일 책임 원칙


✅ SRP란?

"하나의 클래스(또는 모듈)는 하나의 책임만 가져야 한다."
👉 변경 이유(Reason to change)가 단 하나여야 한다는 거다!

🔥 쉽게 풀자

  • "A 클래스는 ~도 하고 ~도 하고 ~도 한다" → ❌
  • "A 클래스는 단 하나의 일만!" → ⭕ (깔끔하고 유지보수 쉽다)

📚 왜 SRP가 중요한가?

문제 상황 결과
여러 책임을 가지면 한 책임 변경 시, 다른 책임도 영향을 받음
클래스 크기 폭발 읽기, 수정, 테스트가 어려워짐
코드 중복, 버그 증가 한 번에 여러 기능이 꼬임

✅ 단일 책임 원칙을 지키면 →

  • 수정 시 영향 최소화
  • 테스트 쉽고 빠름
  • 코드 읽기가 쉬움

🛠️ 기본 예제: 나쁜 설계

public class ReportManager
{
    public string Title;
    public string Content;

    public void SaveToDatabase()
    {
        Console.WriteLine("DB에 저장");
    }

    public void GeneratePDF()
    {
        Console.WriteLine("PDF 파일 생성");
    }
}

❌ 문제점

  • ReportManager가 "문서 관리"도 하고,
  • "DB 저장"도 하고,
  • "PDF 생성"도 하고 있다.

👉 책임이 세 개나 있음! (문서 관리, DB 저장, PDF 출력)


🛠️ SRP 적용: 좋은 설계

public class Report
{
    public string Title;
    public string Content;
}

public class ReportDatabaseSaver
{
    public void Save(Report report)
    {
        Console.WriteLine("DB에 저장");
    }
}

public class ReportPrinter
{
    public void PrintToPDF(Report report)
    {
        Console.WriteLine("PDF 파일 생성");
    }
}

✅ 개선 포인트

  • Report: 문서 내용 관리만
  • ReportDatabaseSaver: DB 저장만
  • ReportPrinter: PDF 출력만

→ 책임이 딱딱 분리되었다!!


📚 실무 버전 예시: 서비스 레이어에서

public class UserService
{
    private readonly UserRepository _userRepository;
    private readonly EmailService _emailService;

    public UserService(UserRepository userRepository, EmailService emailService)
    {
        _userRepository = userRepository;
        _emailService = emailService;
    }

    public void RegisterUser(string email, string password)
    {
        _userRepository.Save(email, password);
        _emailService.SendWelcomeEmail(email);
    }
}

UserService는 "회원가입 로직"만 한다.

  • 저장은 UserRepository가,
  • 이메일 발송은 EmailService가 책임진다.

→ SRP 덕분에 각 기능이 단독으로 수정/확장 가능하다!


✨ SRP 심화 – 진짜 잘하는 실무 포인트

설명
"And" 냄새 맡아라 클래스 이름에 "And" 들어가면 SRP 위반 의심!
메서드 수 10개 넘으면 "책임 분리" 고려하라
데이터 모델 vs 동작 가능하면 모델과 동작 분리 (DTO, Service 등)
테스트 작성할 때 힘들면 책임 분리 신호다

🎯 SRP를 지키면 생기는 실무 장점

항목 효과
변경 영향 최소화 수정해도 다른 기능 터지지 않음
기능 추가 쉬움 새 클래스 만들어 붙이면 끝
코드 리뷰 빨라짐 명확한 책임 구조
테스트 코드 작성 쉬움 독립 테스트 가능

✅ SRP 요약

항목 설명
목표 클래스는 하나의 책임만 가져라
수정 이유 오직 하나만 있어야 한다
신호 클래스가 비대해지고, 기능이 뒤섞이면 분리하자
728x90