본문 바로가기

프로그래밍, 개발

객체지향설계원칙(SOLID) ① - SRP

SRP

The single-responsibility principle (SRP) is a computer programming principle that states that "A module should be responsible to one, and only one, actor." The term actor refers to a group (consisting of one or more stakeholders or users) that requires a change in the module.
Robert C. Martin, the originator of the term, expresses the principle as, "A class should have only one reason to change". Because of confusion around the word "reason" he has also clarified saying that the "principle is about people." In some of his talks, he also argues that the principle is, in particular, about roles or actors. For example, while they might be the same person, the role of an accountant is different from a database administrator. Hence, each module should be responsible for each role.
The reason it is important to keep a class focused on a single concern is that it makes the class more robust.

SRP, 단일책임원칙은 "한개의 모듈은 오직 한개의 액터에만 책임을 가져야 한다."라고 하는 컴퓨터 프로그래밍의 원칙이다. 여기서 액터라는 것은 모듈에서 변화를 요구하는 사용자 혹은 책임자로 이루어진 그룹을 지칭한다. (액터는 시스템을 수행하는 역할을 하는 요소이다. - 사용자, 하드웨어, 외부시스템) 이 용어의 창시자인 로버트 마틴은 이 원칙을 하나의 클래스는 오직 한가지 이유로만 변화해야한다고 설명했다.

 

여기서 한가지 이유란? 원칙은 사람에 대한 것이며, 역할과 액터에 대한 것이다. 예를 들어, 같은 사람일지라도 데이터베이스에서 그 역할이 다르다면 다른 액터로 생각되어야 하며, 각 모듈은 각 역할에 대해서만 책임이 있어야 하는 것이다.

이렇게 클래스를 단일 관심사에만 집중시켜야 하는 이유는 바로 이것이 클래스를 더 견고하게 만들어주기 때문이다.

 

왜 한 개의 클래스가 2개 이상의 책임을 가지면 안 될까?

SRP를 100% 완벽하게 지키는 것은 사실상 어렵다. 하지만 SRP의 원칙을 염두하고 개발해야 하는 이유는, 기능 변경이 일어날 때, 그 파급효과를 줄이거나 제한하기 위해서다.

 

개발자가 판단해야 한다

  • 각 기능에 맞게 클래스의 책임을 분리하는 것은 다소 쉬운 일처럼 보인다. 하지만 실무에서 그것을 명확하게 나누는 것은 오롯이 개발자의 몫이다. 도메인 지식이 있어야 하며, SRP의 적용 경험이 풍부해야 더 정확한 판단을 내릴 수 있다.
  • 단일 책임을 갖고 있는 클래스 내에서도 분리할 수 있는 변수와 메소드가 하나로 합쳐져서 사용되고 있지는 않은지 확인해야 한다.
  • 하나의 클래스는 하나의 책임만 가진다. 그렇기 때문에 그 책임이 잘 드러나도록 클래스명을 짓는 것이 중요하다.
  • 책임을 분리하면 클래스 간 결합도가 낮아진다. 반면 동일한 책임을 가진 클래스들을 여러 개로 분리하면 응집도까지 낮아질 것이다. 결합도는 낮게, 응집도는 높게 즉 각 클래스들이 독립성을 가지도록 하는 것이 좋다.

 

참고한 내용

  • 위키피디아 SRP (link)
  • 완벽하게 이해하는 SRP (link)
  • 결합도와 응집도는 무엇일까? (link)
  • 객체지향개발 5대 원리 : SOLID (link)