📘 클린 아키텍처 북스터디 정리입니다
📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장
잘 정의된 인터페이스와 그 인터페이스의 구현체끼리의 상호 치환 가능성에 기대는 사용자들이 존재하기 때문이다
class Rectangle {
void setWidth(int w) { ... }
void setHeight(int h) { ... }
int getArea() { return width * height; }
}
class Square extends Rectangle {
void setWidth(int w) {
super.setWidth(w);
super.setHeight(w); // 너비 = 높이
}
void setHeight(int h) {
super.setWidth(h);
super.setHeight(h);
}
}
Rectangle r = new Square();
r.setWidth(5);
r.setHeight(10);
System.out.println(r.getArea()); // 50을 기대했지만, 실제는 100
License만 알면 되고, 하위 타입인PersonalLicnese나 BusinessLicense 중 어떤 객체가 와도 무관함public interface License {
void calculateFee();
}
public class PersonalLicense implements License {
pulbic void calculateFee(){
// 개인 라이선스 요금 계산 로직
}
}
public class BusinessLicense implements License {
public void calculateFee(){
// 비즈니스 라이선스 요금 계산 로직
}
}
public class Billing {
public void process(License license) {
// License의 종류와 무관하게 동일한 인터페이스로 처리 가능
license.calculateFee();
}
}
if (driver.getDispatchUri().startWith("acme.com"))...
Billing 앱의 행위가 License 하위 타입 중 무엇을 사용하는 지에 전혀 의존하지 않기 때문이다.
이들 하위 타입은 모두 License 타입을 치환할 수 있다.
LSP의 정의를 예시로 잘 설명한 문장이라고 생각된다.
특히 "치환할 수 있다"는 개념을 단순히 타입 호환의 문제가 아닌, 행위의 일관성이라는 관점에서 바라볼 수 있게 해주었다.
하위 타입이 상위 타입으로 치환될 수 있다는 말에서 가장 핵심적인 부분은, 클라이언트의 행위가 달라지지 않아야 한다는 것이다.
즉, Billing과 같은 클라이언트는 License의 하위 타입이 어떤 구현이든 관계없이 동일하게 작동해야 하며,
하위 타입이 추가되거나 변경되더라도 클라이언트 코드를 수정하지 않아도 되는 구조가 바람직한 설계다.
이번 장의 마지막 결론에서 저자가 강조했듯이, LSP는 단순한 클래스 수준의 원칙에 그치지 않고
전체 시스템의 유연성과 안정성을 좌우하는 아키텍처 설계 원칙으로 확장 가능하며, 반드시 그렇게 되어야 한다.