9장. LSP: 리스코프 치환 원칙(Liskov Substitution Principle)
1988년 바바라 리스코프가 정의한 하위타입에 관한 원칙.
상호 대체 가능한 구성요소를 이용해 소프트웨어 시스템을 만들 수 있으려면, 이들 구성요소는 반드시 서로 치환 가능해야 한다는 계약을 반드시 지켜야 한다.
상속을 사용하도록 가이드하기
위 설계는 LSP를 준수한다. Billing 애플리케이션의 행위가 License 하위 타입 중 무엇을 사용하는지에 전혀 의존하지 않기 때문이다. 하위 타입은 모두 License로 치환할 수 있다.
정사각형/직사각형 문제
Square는 Reactangle의 하위 타입으로 적합하지 않다.
User는 대화하고 있는 상대가 Rectangle이라고 생각하므로 혼동이 생길 수 있다.
이 상태에서 LSP 위반을 막기 위한 방법은 IF 문 등을 이용해서 Rectangle이 실제로 Square인지를 검사하는 메커니즘을 User에 추가하는 것이다.
이렇게 되면 User의 행위가 사용되는 타입에 의존되게 되므로 결국 타입을 서로 치환할 수 없게 된다.
LSP와 아키텍처
- 자바스러운 언어 : 인터페이스 하나와 이를 구현하는 여러 개의 클래스로 구성
- 루비 : 동일한 메서드 시그니처를 공유하는 여러 개의 클래스로 구성
- 동일한 REST인터페이스에 응답하는 서비스
잘 정의된 인터페이스와 그 인터페이스 구현체끼리 상호 치환 가능성을 기대하는 사용자들이 존재.
즉 인터페이스와 구현체끼리 상호 치환을 보장하도록 구성한다
LSP 위배 사례
예시)
A 택시 파견 REST서비스의 URI가 존재한다.
B 택시 업체 REST 서비스 URI가 조금씩 다를 경우에
A, B 두 기업의 서비스가 합쳐질 경우... 이 예외 사항을 처리하는 로직을 추가해야만 할 것이다.
합병 이후 또 다른 택시업체가 인수한다면....
REST 서비스들의 인터페이스가 서로 치환 가능하지 않다는 사실을 처리하는 복잡한 메커니즘을 추가하게 될 것이다.
결론
LSP는 아키텍처 수준까지 확장할 수 있고, 반드시 확장해야만 한다.
치환 가능성을 조금이라도 위배하면 시스템 아키텍처가 오염되어 상당량의 별도 메커니즘을 추가해야 할 수 있기 때문이다.
'IT 서적 > Clean Architecture' 카테고리의 다른 글
11장. DIP: 의존성 역전 원칙(Dependency Inversion Principle) (0) | 2022.03.21 |
---|---|
10장. ISP: 인터페이스 분리 원칙(interface Segregation Principle) (0) | 2022.03.21 |
SOLID 설계원칙 - 8장. OCP: 개방-폐쇄 원칙(Open-Closed Principle) (0) | 2022.03.04 |
SOLID 설계원칙 7장. SRP:단일 책임 원칙(Single Responsibility Principle) (0) | 2022.03.04 |
[클린 아키텍처] 2부. 벽돌부터 시작하기: 프로그래밍 패러다임 (구조적/객체지향/ 함수형 프로그래밍) (0) | 2022.02.27 |
댓글