yoongrammer

단일 책임 원칙 (SRP: Single Responsibility Principle) 본문

OOP

단일 책임 원칙 (SRP: Single Responsibility Principle)

yoongrammer 2022. 2. 22. 15:09
728x90

목차

    단일 책임 원칙 (SRP: Single Responsibility Principle)


    클래스를 변경하는 이유는 단 한 가지여야 한다.

    로버트 C. 마틴

     

    단일 책임 원칙(SRP: Single Responsibility Principle)은 다섯 가지 SOLID 애자일 원칙 중 하나입니다.

     

    클래스를 변경하는 이유가 한 가지이기 위해서는 하나의 액터에 대한 책임만 가지고 있어야 합니다.

    여기서 책임은 하나의 특정 액터를 위한 기능 집합이고, 액터란 기능(=클래스 ,모듈)을 사용하는 주체입니다.

     

    SRP 적용 전


    왼쪽 둥근 사각형은 액터, 화살표는 책임(기능 직합)을 나타낸다.
    class Car():
    	def start(self):
    		pass
    	
    	def stop(self):
    		pass
    	
    	def drive(self):
    		pass
    	
    	def wash(self):
    		pass
    	
    	def changeTires(self):
    		pass
    	
    	def checkOil(self):
    		pass
    	
    	def getOil(self):
    		pass

    Car 클래스는 4가지 책임을 가지고 있어 SRP를 위반하고 있습니다.

    만약 Driver가 사용하는 코드를 변경하게 된다면 Dirver뿐만 아니라 다른 Client도 재컴파일 및 재배포를 해야 합니다.

     

    이처럼 클래스에 많은 책임이 있는 경우 책임 중 하나를 변경하면 사용자가 모르는 사이에 다른 책임에 영향을 줄 수 있으므로 버그가 발생할 가능성이 높아집니다.

     

    SRP 적용 후


    SRP 적용 후
    class Car:
    	def start(self):
    		pass
    	
    	def stop(self):
    		pass
    	
    	def getOil(self):
    		pass
    
    class Driver:
    	def drive(self):
    		pass
    
    class CarWash:
    	def wash(self):
    		pass
    
    class Mechanic:
    	def changeTires(self):
    		pass
    
    	def checkOil(self):
    		pass

     위와 같이 책임별로 클래스를 분리한다면 SRP를 따르게 됩니다.

    이렇게 하면 변경이 발생하더라도 다른 관련 없는 동작에 영향을 미치지 않게 됩니다.

     

    SRP를 따를때 이점


    • 쉬운 테스트 - 책임이 하나인 클래스는 테스트 케이스가 줄어들기 때문에 테스트가 쉬워집니다.
    • 낮은 결합 - 단일 클래스의 기능이 적어져 종속성이 줄어든다.
    • 쉬운 검색 - 작고 잘 조직된 클래스는 모놀리식 클래스보다 검색하기 쉽습니다.
    • 구현하기 쉬움 - 하나의 책임만 가지고 있기 때문에 구현및 이해가 쉽습니다.

    결론


    SRP는 변경으로 버그가 발생하더라도 다른 관련 없는 동작에 영향을 미치지 않도록 동작을 분리하는 것을 목표로 합니다.

    클래스나 모듈이 서로 다른 이유로 변경되기 시작한다면 SRP를 따르도록 분리해야 합니다.

    하지만 SRP에 대한 과도한 고려는 더 나은 설계 대신 이해하기 힘든 설계로 이어질 수 있으니 과도하게 사용하면 안 됩니다.

     

     

    728x90
    Comments