Spring
객체지향 설계 원칙 5가지 - SOLID
chandlerxx
2023. 11. 13. 16:41
컴퓨터 프로그래밍에서 SOLID란?
로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 소개했습니다.
프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다
1. SOLID
- SRP : 단일 책임 원칙 (Single responsibility principle)
ㄴ 한 클래스는 하나의 책임만 가져야 한다.
ㄴ 변경이 있을때 side-effect가 적으면 SRP을 잘 준수한 것 - OCP : 개방-폐쇄 원칙 (Open/closed principle) ★
ㄴ 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. (단, 클라이언트 코드가 변경되면 안된다)
ㄴ 다형성을 활용해 상위 클래스는 Closed, 하위 클래스를 Open
(ex. 인터페이스를 생성해서 신규 기능을 구현) - LSP : 리스코프 치환 원칙 (Liskov substitution principle)
ㄴ 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다.
ㄴ 정의된 기능을 무조건 만족시켜야 한다. (클라이언트 기준, Always pass) - ISP : 인터페이스 분리 원칙 (Interface segregation principle)
ㄴ 범용 인터페이스 하나보다 여러개의 인터페이스가 낫다.
ㄴ 이때, 인터페이스의 변경이 일어나도 클라이언트에 영향을 주지 말아야한다. - DIP : 의존관계 역전 원칙 (Dependency inversion principle) ★
ㄴ 추상화, 인터페이스에 의존해야하고 구현 클래스(구현체)에 의존하면 안된다.
ㄴ즉, Role(역할)에 의존해야한다.
좋은 객체지향 설계란
역할(인터페이스)와 구현(구현 클래스)를 명확하게 구분하고, 클라이언트 코드의 변경없이 기능을 확장시킬 수 있어야 합니다.
2. 실무 고민
- 인터페이스를 도입하게 되면 추상화 비용 발생(코드의 복잡도 증가로 인한 유지보수 어려움) 가능성 높음
따라서 기능을 확장할 가능성이 없다면 구현 클래스를 직접 사용하는 것도 하나의 방법입니다. 향후에 꼭 필요한 경우 리팩터링해서 인터페이스를 도입해도 됩니다. 적절하게 선택하여 사용해야 합니다.
출처