본문 바로가기

소프트웨어

[소프트웨어/SOLID] 단일 책임 원칙(SRP)

SRP(Single Responsibility Principle)

단일 책임 원칙

책임의 의미

  • 해야하는 것
  • 할 수 있는 것
  • 해야하는 것을 잘 할 수 있는 것

예를들어서 UserDAO에서 Post인스턴스를 Create하거나 Update하는 쿼리를 가지고 있다면 그것은 위의 SRP 위반이라고 할 수 있다.

한 클래스에서 많은 책임을 가지고 있다면, 각 메서드나 속성간의 의존성이 심해질 수 있다.

변경

책임 => 변경의 의유

보통 시스템의 변경은 요구 사항의 변경에 의하여 발생한다, 소프트웨어에서의 변경은 당연하므로 이에 대한 영향을 최소화하는 것이 좋은 설계라고 할 수 있다. 해당 클래스가 많은 책임을 가지고 있으면 요구 사항마다 변경해야 하는 요소가 늘어날 수 있다. 따라서 책임을 분리하여 변경을 최소화해야 한다.

책임 분리

한 클래스에 대한 책임이 많을 수록 설계는 복잡해진다.

한 클래스가 많은 책임을 가지고 있으면 회귀(regression) 테스트, 수정, 변경하기 어려워 지므로 이를 분리하여 편이 좋다. 이를 책임 분리라고 한다.

산탄총 수술

한 책임이 여러 클래스로 분산되어 있는 경우를 말한다.

책임이 분산되어서 설계된 경우 이를 변경하기 굉장히 위험해진다. 변경이 발생되면 이를 반영하기 위해 동시에 여러곳의 클래스를 수정해야한다. 만약 하나라도 누락된 경우 장애 또는 버그로 인식될 수 있기 때문이다.

이 같은 경우 보안, 로깅, 트랜잭션과 같은 횡단 관심(cross-cutting concern)으로 분류할 수 있는 기능이 대표적이다.

관심지향 프로그래밍과 횡단 관심 문제

산탄총 수술은 대부분 횡단 관심 문제 때문에 발생하게 되는데, 이를 해결할 수 있는 방법으로 관심 지향 프로그래밍(Aspect-Oriented Programming)이 있다. 횡단 관심을 수행하는 코드를 aspect라는 특별한 객체로 모듈화하고 weaving이라는 작업을 통해 핵심 기능에 끼워 넣을 수 있다.

용어

  • Join point : 애플리케이션 실행 중의 특정한 지점, 메서드 호출, 실행 자체, 클래스의 초기화, 객체 생성 시점 등 존재
  • Advise : Join point에 실행하는 코드, before, after 등의 여러가 advise가 있다.
  • Point cut : Join Point의 집합체, 어디에 advise를 적용할지 제어할 수 있다.
  • Aspect : advise와 point cut을 조합한 조합물, 애플리케이션이 가져야할 로직과 그것의 실행 지점을 정의한 것
  • Weaving : 실제로 aspect, 코드의 해당 지점에 주입하는 과정, 컴파일타임과 실행 중 주입할 수 있다.