단일 책임의 원칙(Single Responsibility Principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 이 용어는 로버트 마틴이 그의 저서 기민한 소프트웨어 개발과 원칙, 패턴, 실례[1]으로 유명해진 객체 지향 설계 원칙[2]이란 문서의 같은 이름을 가진 단락에서 소개되었다.
로버트 마틴은 책임을 변경하려는 이유로 정의하고, 어떤 클래스나 모듈은 변경하려는 단 하나 이유만을 가져야 한다고 결론 짓는다.
예를 들어서 보고서를 편집하고 출력하는 모듈을 생각해 보자. 이 모듈은 두 가지 이유로 변경될 수 있다. 첫 번째로 보고서의 내용 때문에 변경될 수 있다. 두 번째로 보고서의 형식 때문에 변경될 수 있다. 이 두 가지 변경은 하나는 실질적이고 다른 하나는 꾸미기 위한 매우 다른 원인에 기인한다. 단일 책임 원칙에 의하면 이 문제의 두 측면이 실제로 분리된 두 책임 때문이며, 따라서 분리된 클래스나 모듈로 나누어야 한다. 다른 시기에 다른 이유로 변경되어야 하는 두 가지를 묶는 것은 나쁜 설계일 수 있다.
한 클래스를 한 관심사에 집중하도록 유지하는 것이 중요한 이유는, 이것이 클래스를 더욱 튼튼하게 만들기 때문이다. 앞서 든 예를 계속 살펴보면, 편집 과정에 변경이 일어나면, 같은 클래스의 일부로 있는 출력 코드가 망가질 위험이 대단히 높다.
< 출처:위키백과(https://ko.wikipedia.org) >
Collision 문제
- 동일클래스를 여러 유저(요구자)에 의해 변경요청이 발생하면 동일 클레스에대 해 변경 하면서 Merge 충돌, Source Repo 충돌 등 많은 생각지도 못했던 문제가 펼처지게된다.
- 하나의 클래스에서 너무 많은 것을 알고있고 그렇기에 여러 API과 연계되게되고 그 API 중 하나가 변경되면 같이 수정되야된다.
- DB, Calculate, Report 3가지 책임을 다 가지고있는 클래스가 있다고 가정해보자. 만일 리포트가 하나 추가된다면 연관된 모든 클래스들이 재컴파일 /배포되어야 한다.
하나의모듈(클래스)는 하나의 변경사유를 가져야한다.
- 동일한 이유로 변경되어야 하는것들은 동일 모듈에
- 다른 이유로 변경되어야 하는 것들은 다른 모듈에
시스템 설계시 SRP 고려해보다.
- 역할(서비스) 파악에 주의
- 역할(서비스) 들을 serve 하는 책임을 식별
- 책임을 모듈에 할당 : 각 모듈은 하나의책임
- 분리의 이유 : 다른 이유로 변경되고, 다른 때에 변경되서
SRP를 유지하기 위한 분리의 방법은 다음 처럼 여러 가지가 있다.
< SRP가 위배된 클래스 구조 >
< Inverted Dependencies : 인터페이스를 사용한 의존성 역전 >
< Extract Classes : 하나의 클래스를 책임에 맞추어 여러개로 분리 >
< Facade - 어디에 구현되어있는지 찾기 쉽움 >
< Interface Segregation >
<참고 : 백명석의 클린 코더스 강의 >