1. SOLID
Last updated
Last updated
엉클 밥이 2003년 <클린 소프트웨어>에서 5가지 설계 원칙을 정리했다.
1979년 톰 드마르코와 페이지 존스가 언급한 응집도(cohesion)을 다루는 설계 원칙
AddProductToCartService는 언제 수정해야 할까?
장바구니에 상품을 담는 방식이 변경 되었을 때
장바구니 상태를 DB에 담는 방식이 변경 되었을 떄
정답은 둘 다 아니다. 1 -> Domain Model에서 처리 2 -> Repository, DAO 등에서 처리
이렇게 구현해주면 테스트하기 쉽고, 재사용하기 편하며, 더 작고 이해하기 쉬운 클래스를 얻게 된다.
1988년 버트런드 마이어가 제안한 설계 원칙으로 소프트웨어 개체는 확장에 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
이 목표는 추상화를 통해 달성 가능하고, Java에서는 interface를 활용한다.
Open: 모듈의 기능을 변경할 수 있어야 한다.
Close: 변경이 다른 곳으로 퍼져나가지 않아야 한다.
서비스 레이어에서 Spring Data Jpa의 save()를 호출할 때 DBMS가 변해도 서비스 레이어는 그저 save()만 호출하면 된다.
바버라 리스코프가 1988년 타입의 관계에 대해 이야기했는데
정리하면 서브타입은 그것의 기반 타입으로 치환 가능해야 한다
LSP를 지키고 있는지 파악하는 방법 중 하나는 상속이 '행위' 측면에서 IS-A 관계인지 파악하는 것으로
응집력이 없는 커다란 인터페이스를 여러 개의 작은 인터페이스로 나누는 것
엉클 밥은 DIP에 대해
상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 다 추상화에 의존해야 한다.
추상화는 구체적인 사항에 의존해서는 안된다. 구체적인 사항은 추상화에 의존해야 한다.