SOLID 원칙 - 단일책임원칙, SRP (Single Responsibility Principle)
단일 책임원칙이란? (단일책임원칙, SRP ,Single Responsibility Principle)
단일 책임 원칙(Single-responsibility principle, SRP)은 컴퓨터 프로그램의 모든 기능/모듈이
기능의 한 부분에 대해 책임을 져야 하며, 그 부분을 캡슐화해야 한다는 원칙입니다.
그 모듈, 클래스 또는 기능의 서비스는 그 책임을 좁게 설정해야합니다.
SPR 는 커플링된 책임들을 여러 클래스를 나누라는 원칙이기도 합니다.
또한, 클래스는 단일 기능에 초점을 맞추고, 그 클래스는 단 하나의 작업만 수행해야 한다는 것을 의미합니다.
SRP를 준수해야하는 이유
- 더 많은 기능을 가지고 있다면, 더 많은 변화 가능성이 있기 때문입니다. (유지보수 cost의 증가)
- 클래스가 변경될수록 버그가 생길 가능성이 높아질 수 있기 때문입니다.
- 변경 사항은 다른 class / 모듈에 영향을 줄 수 있기 때문입니다.
- SRP를 준수하면 더 유지보수하기 쉽고 이해하기가 쉬워집니다.
- 테스트하기가 간단해지기 때문입니다.
SRP 도입의 예
// SRP 를 준수하지 않는 경우
public class UserSettingService
{
public void changeEmail(User user)
{
if(checkAccess(user))
{
...
}
}
public boolean checkAccess(User user)
{
....
}
}
위 예제에서는 UserSettingService 는 email을 바꾸고, 접근권한을 확인하는 두가지 메소드가 있습니다.
만일 이메일 변경이 승인되는 방식을 변경하거나, checkAccess가 수행되는 방식이 변경된다면 어떨까요?
두 가지 성격이 다른 경우임에도 불구하고 각각 UserSettingService를 수정해야 합니다.
이를 해결하기 위해 UserSettingService를 UserSettingService와 SecurityService로 분해하고,
checkAceess메소드를 SecurityService로 이동합니다.
그러면 아래 코드와 같이 되겠지요.
public class UserSettingService
{
public void changeEmail(User user)
{
if(SecurityService.checkAccess(user))
{
//Grant option to change
}
}
}
public class SecurityService
{
public static boolean checkAccess(User user)
{
//check the access.
}
}
SRP 를 준수하지 않는 사례
1. 한 클래스에 최대한 많은 기능을 한번에 집어넣으려 한다.
2. 한 클래스에서 메서드를 다른 컴포넌트에서 사용할 때, 불필요한 기능이 있긴 하지만 별 상관 없으므로 그냥 쓴다.
3. 한 메서드를 의존하는 다른 메서드들이 불필요한 기능들 때문에 코드가 엉망이 된다.
총평
절차지향적으로 코딩을 해왔다면, 어디서부터 어떻게 나눠야할지 좀 어색할 수도 있겠습니다.
다른 사람의 코드를 잘 살펴보고, 내가 짠 코드를 나중에 다시 보았을때 더 나눌수는 없을지?
코드를 수정할때 마다 이 기능은 여기 있는게 맞는지? 모듈화를 해야하지는 않은지?
등의 의문을 가지면서 계속해서 노력해야 SRP 를 잘 준수할 수 있을것입니다.
#SOLID,#SOLID원칙,#단일,#책임,#원칙,#SOLIDprinciple,#SRP,#단일책임원칙,#single,#responsibility,#principle
'개발용어' 카테고리의 다른 글
SOLID 원칙 - 리스코프 치환 원칙, LSP (Liskov Substitution Principle) (0) | 2022.05.09 |
---|---|
SOLID 원칙 - 개방폐쇄원칙, OCP (Open Closed Principle) (3) | 2022.05.07 |
객체지향(Object-oriented)용어 - 상속, 다형성, 메소드오버로딩, 메소드오버라이딩, inheritance, method override, method overload (0) | 2022.04.25 |
객체지향(Object-oriented)용어 - ADT, Class, Object, 클래스, 오브젝트 (0) | 2022.03.31 |
디자인패턴이란, GoF디자인패턴이란, 디자인패턴의유래, 패턴을쓰는이유, (0) | 2022.03.29 |
댓글