Study Programming/Design Pattern

[SOLID] SRP(=Single Responsibility Principle, 단일 책임 원칙)

네모메모 2022. 6. 27. 20:41
반응형

 

 

 

SOLID 원칙 중 첫번째인

1.  SRP : Single Responsibility Principle = 단일 책임 원칙

           " 하나의 클래스는 하나의 책임을 가지고 책임을 캡슐화해야 한다. "

 

-  다른 말로 "어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함"을 의미

 


- 책임 이란?

     ㄴ> 기능변경 시 변화되는 부분을 하나의 책임의 단위로 묶을 수 있다.

     ㄴ> 각각의 책임은 서로 다른 이유로 변경되어야 한다.

            ex) 데이터를 읽어 오는 책임의 기능이 변경될 때 데이터를 보여주는 책임은 변하면 안 됩니다.

 


-  왜 '단일 책임'을 가져야 하는가?

  ㄴ> 책임의 개수가 많아질수록 한 책임의 기능 변화가 다른 책임에 주는 영향이 비례해서 증가하기 때문에 확장 및 유지보수가 어려워진다.

  

  ㄴ> ex) SRP 위반하여 여러 책임을 가지는 클래스A의 동작과정은 아래와 같다.

     사용자가 데이터 노출 요청 ->  display() 호출된다.

       -> display() 에서 HTTP 통신하는 loadHtml() 호출  리턴한 응답값을 파라미터로 updateGui(응답값) 호출한다. 

       -> updateGui(응답값) 에서는  응답값 데이터 파싱하는 parseDataToGuiData(응답값) 호출 후 리턴한 DTO 객체로 UI업데이트한다.

수정사항으로 "서버 통신 방식이 수정되어 응답값 데이터 타입이 변경되었다."

데이터를 제공하는 서버만 달라졌을 뿐인데, 연쇄적으로 코드가 수정필요하다;;

        [수정 필요 사항]

          loadHtml()  서버 통신 로직 수정 필요

          updateGui(응답값)  파라미터 타입 수정 

          parseDataToGuiData(응답값) 파라미터 타입 및 파싱 로직 수정

          (display()  에서 변수타입이나 기타로직 수정 필요)

          (UI업데이트 로직에 따라 수정 필요)

결국, 코드를 절차 지향적으로 변하게 하여 유지 보수를 엉망으로 만들게 된다.

 


 

"하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 '책임'져야 한다."

더보기

- '액터' : 시스템이 동일한 방식으로 변경되기를 원하는 사용자 집단
- ex) 스마트폰 객체는 '영상 시청용으로 사용할 액터A'와 '전화 통화용으로 사용할 액터B'는 같은 객체를 다른 방식으로 변경되기를 원할 수 있기 때문에 별개의 액터입니다.


- SRP를 설계할 때는 거시적인 관점에서 '해당 클래스에 어떤 액터가 의존하는지 고려하는 것'이 생각하는 것이 바람직합니다.
 '책임'이라는 기준을 세우기 위해 (단순히 해당 클래스만이 아니라) 시야를 넓혀 액터를 정의하는 것이 중요
 


 

- 좋은 포스팅에 좋은 질문들이 있어서 가져옮

1. 클래스가 여러 가지의 (public) 메소드를 가진다면, 복수의 책임을 갖는가?
-> 서로 다른 액터가 해당 클래스의 여러 가지 메소드를 사용하는 것이 아니라면, 복수의 메소드여도 단일 책임 원칙을 지키고 있는 것
 

2. 클래스가 다중 상속 (혹은 다중 구현)을 한다면, 복수의 책임을 갖는가?
-> 다중 상속을 받더라도 액터가 그 다중 상속한 것들을 모두 사용한다면 단일 책임 원칙을 준수
-> 오버라이딩이나 추가적인 사항으로 다른 요구사항을 수행한다면 다른 책임을 같게 된 것
 

3. 해당 클래스를 의존하는 사용자(클라이언트)가 여럿이라면 변경되는 이유는 여러가지가 되는가?
-> 사용자가 여러 명이어도 모두 동일한 요구 사항으로 해당 클래스를 사용한다면 단일 책임 원칙을 준수

 

 


 

 

-  SRP원리를 적용하면 좋은 점

더보기

 1. 무엇보다도 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있습니다
 2. 책임을 적절히 분배함으로써 코드의 가독성 향상, 유지보수 용이라는 이점까지 누릴 수 있으며 객체지향 원리의 대전제 격인 OCP원리뿐 아니라 다른 원리들을 적용하는 기초가 됩니다

 

 

 

 

 

 

 


[출처]

- 위키 : https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%B1%85%EC%9E%84_%EC%9B%90%EC%B9%99

- SRP

-> https://steady-coding.tistory.com/370

- https://www.nextree.co.kr/p6960/

 

- 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 - 최범균

 

 

 

 

반응형