Java Spring

[SOLID] SRP : 단일 책임 원칙

pearl.k 2023. 7. 6. 14:41

SOLID의 첫 번째 원칙은 SRP (Single Responsibility Principle) 이라는 단일 책임 원칙이다. 단어 그대로의 뜻으로, 딱 하나의 책임을 가져야 한다는 의미.

 

1. 책임이란 무엇인가?

객체지향 Java 프로그램 설계 관점에서 볼 때, SRP에서 말하는 책임의 기본 단위는 객체를 말한다. 어떤 객체가 있으면, 그 객체는 단 하나의 책임만 가져야 한다는 의미.

책임이란 무엇일까? 책임은 객체가 맡은 무언가라고 볼 수 있다. 객체가 "해야 하는 것" or "할 수 있는 것" or "해야 하는 일을 잘 할 수 있는 능력" 등을 의미한다.

한 객체에 너무 많은 책임이 들어가면 프로그램이 복잡해진다. 또한, 책임이 많으면 규모가 큰 프로그램에서 오류가 났을 때, 책임 소재를 명확하게 하거나 디버깅하기 어렵다. 이럴 땐 다른 클래스에 책임을 나눠서 각자 맡은 일을 잘 수행하도록 하는게 좋다.

 

2. 변경

어떤 프로그램을 만들 때, SRP를 따르는 설계를 하기 위해서는 '변경'에 대해서 잘 알아야한다.설계 원칙을 공부하는 이유는 예측하지 못한 변경 사항이 발생하더라도, 유연하고 확장이 가능한 시스템을 설계하기 위해서이다. 이에 해당하는 한 가지 예시를 Spring 기본편에서 배웠다. (FixDiscountPolicy 를 변경된 RateDiscountPolicy로 수정, 확장 과정 실습)GoF 디자인 패턴 책과 Spring 기본편에서 배운 공통적인 내용을 참고하자. "좋은 설계란 기본적으로 시스템에 새로운 요구사항이나 변경이 있을 때 가능한 한 영향 받는 부분을 줄이는 것"어떤 클래스가 잘 설계되었는지 판단하려면, 변경 될 때를 보는 것이 좋다. 그 중에서도 언제 변경해야 하는지, 변경 이유를 파악해야 한다.우리가 생각할 수 있는 변경 이유 예시는 다음과 같다

  • 데이터베이스의 변경 (테이블, 스키마 등의 변경)
  • 새로운 기능 추가, 수정
  • 출력 방식 변경

 

3. 책임 분리

여러 책임을 수행하는 클래스는 단 하나의 책임만 수행하도록 분리해야 한다. 책임을 적절하게 분담하도록 변경하면 어떤 변화가 생겼을 때 영향을 최소화 할 수 있다.

책임 분리의 예시

+ 회귀 테스트란?

시스템에 변경이 발생할 때 기존의 기능에 영향을 주는지 평가하는 테스트를 말한다. 회귀 테스트 비용을 줄이기 위해서는 시스템에 변경 사항이 생겼을 때, 영향을 받는 부분을 적게 해야 한다. (SRP 규칙을 통해 객체에 하나의 책임만을 주어 영향 받는 부분을 최소화 함)