[SOLID] SRP 단일 책임 원칙

마라탕천재 ㅣ 2024. 8. 1. 00:01

1. SRP 란?

SRP(Single Responsibility Principle)는 하나의 클래스나 모듈은 단 하나의 책임만 가져야 한다는 원칙이다.

즉, 변경해야 할 이유가 오직 하나여야 하며, 이를 통해서 코드의 유지보수성과 재사용성이 향상됩니다.

예를 들어, 사용자 관리 시스템에서 '사용자' 클래스가 있다면, 이 클래스는 사용자 정보를 저장하고 검색하는 책임만 가져야 한다.

사용자 인증이나 권한 관리 같은 다른 기능은 별도의 클래스로 분리하여 구현해야 한다. 이렇게 하면 각 클래스의 역할이 명확해지고, 한 기능의 변경이 다른 기능에 영향을 미치지 않게 된다.

 

 

2. SRP 예시

이 Calculate 클래스는 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산 등 여러 계산 기능을 한 클래스에서 모두 처리하고 있다.

이는 SRP를 위반하는 예시이다.

 

SRP를 준수하기 위해서는 각 연산을 별도의 클래스로 분리하는 것이 좋다.

Calculator 클래스의 경우 다음과 같이 분리할 수 있다.

  1. Addition 클래스: 덧셈만 담당
  2. Subtraction 클래스: 뺄셈만 담당
  3. Multiplication 클래스: 곱셈만 담당
  4. Division 클래스: 나눗셈만 담당
  5. Modulo 클래스: 나머지 연산만 담당

이렇게 분리하면 각 클래스는 단 하나의 책임만을 가지게 되어 SRP를 준수하게 된다.

따라서 코드의 유지보수성과 재사용성이 향상되며, 한 연산의 로직을 변경해도 다른 연산에 영향을 미치지 않게 된다.

 

 

3. SRP 장단점

SRP도 단점이 존재한다. 기능적 측면에서 SRP의 장단점을 알아보도록 하겠다.

장점:

  • 유지보수성 향상: 각 클래스가 하나의 책임만 가져 변경이 용이
  • 코드 재사용성 증가: 작은 단위의 책임으로 분리되어 다른 곳에서 재사용하기 쉬움.
  • 테스트 용이성: 단일 책임 클래스는 테스트하기 쉽고 버그 발견이 용이
  • 가독성 개선: 클래스의 목적이 명확해져 코드 이해가 쉬움.
  • 변경의 영향 최소화: 한 기능의 변경이 다른 기능에 미치는 영향이 줄어듦.

 

단점:

  • 클래스 수 증가: 책임 분리로 인해 전체 클래스 수가 늘어날 수 있음.
  • 복잡성 증가: 클래스 간 관계가 복잡해질 수 있음.
  • 과도한 분리 위험: 책임을 지나치게 세분화하면 오히려 복잡성이 증가할 수 있음.
  • 성능 저하 가능성: 객체 생성 증가로 메모리 사용량과 통신 비용이 늘어날 수 있음.
  • 설계 시간 증가: 적절한 책임 분배를 위해 더 많은 시간과 노력이 필요할 수 있음.


이러한 장단점을 고려하여 프로젝트의 특성에 맞게 SRP를 적절히 적용하는 것이 중요하다.