SRP(Single Responsility Principle, 단일 책임 원칙)

2023. 5. 3. 11:02JAVA/Spring

SRP(Single Responsility Principle, 단일 책임 원칙)

단일 책임 원칙은 어떤 원칙인가?

어떤 한 객체는 하나의 책임만을 가져야 한다는 원칙입니다. 여기서 책임이란 어떤 객체가 그 객체에 맞는 역할을 수행하기 위한 기능들을 의미합니다. 역할은 객체가 어떤 책임들을 수행할 것인지 정의한 것입니다. 제 주관적인 생각으로는 단일 책임이라는 표현보다는 단일 역할 원칙이라는 표현이 더 적절하다고 생각합니다. 즉, 한 객체는 하나의 역할만을 갖고 책임들을 수행해야 한다는 원칙이라고 생각합니다.

  • 역할 : 객체가 역할에 맞는 책임들을 수행할 것인지 정의한 것
  • 책임 : 역할에 맞는 기능들

 

예를 들면 자동차라는 객체의 주요한 역할은 운전하는 것입니다. 그렇다면 자동차 역할에 따른 책임들이 존재할 것입니다. 대표적인 책임들은 자동차라는 역할만이 할 수 있는 시동걸기, 가속, 제동 등이 있을 것입니다. 이를 그림으로 표현하면 다음과 같을 것입니다.

 

 

단일 책임 원칙의 위반 사례 : 역할에 맞지 않는 책임을 수행하는 경우

단일 책임 원칙의 대표적인 위반 사례는 한 객체가 역할에 맞지 않는 여러가지 책임들을 수행할때 발생합니다. 예를 들어 자동차 객체가 운전의 역할과 정비의 역할을 모두 수행하는 경우가 있습니다. 이를 코드로 표현하면 다음과 같을 것입니다.

public class Car {
  private String brand;
  private String model;
  private int mileage;

  public void drive() {
    // ...
  }

  public void refill() {
    // ...
  }

  public void changeOil() {
    // ...
  }

  public void replaceBrakes() {
    // ...
  }

  // getter and setter methods for brand, model, and mileage
}

 

Car 객체에 대한 역할에 따른 책임들을 분류하여 그림으로 표현하면 다음과 같을 것입니다.

하지만 자동차라는 객체는 운전자에 맞는 역할이지 정비와 관련된 책임들의 역할에는 맞지 않습니다. 따라서 위와 같은 changeOil, replaceBreak와 같은 책임(메소드)들은 자동차 객체의 역할에 적절하지 않습니다.

 

따라서 정비사 역할은 정비사(Mechanic)이라는 객체를 따로 생성하여 책임을 분리하는 것이 적절하다고 생각합니다.

 

 

정리

  • 단일 책임 원칙(SRP)이란 한 객체가 한 역할에 맞는 책임들을 수행해야 한다는 원칙입니다.
  • 한 객체에 역할에 맞지 않는 책임(메소드)들이 있다면 다른 객체로 분리하여 문제를 해결할 수 있습니다.
  • 책임의 기능 변경 또는 요구사항 변경이 되어 코드를 수정시 파급 효과가 다른 책임들로 전달되지 않아서 코드 수정이 되지 않는다면 단일 책임 원칙을 준수하였다고 말할 수 있습니다.

 

References

단일 책임 원칙(SRP)
SRP:단일 책임 원칙
완벽하게 이해하는 SRP (단일 책임 원칙)