SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다.
이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다.
객체지향 설계의 5대 원칙이란
SRP(단일 책임 원칙),
OCP(개방-폐쇄 원칙),
LSP(리스코프 치환 원칙),
ISP(인터페이스 분리 원칙),
DIP(의존 역전 원칙)을
칭하며 각각의 앞자를 따서 SOILD 원칙이라 한다.
S SRP
단일 책임 원칙 (Single responsibility principle)
하나의 클래스는 하나의 책임만 가져야 한다.
변경이 있을때 파급효과가 적으면 단일책임 원칙을 잘 따른것이다.
응집도가 높고 결합도가 낮게 설계하라는 기본 원칙이다.
스프링에서는 객체의 생성을 IOC 컨테이너에서 주입받아 사용하여 구현객체를 생성하는 책임을 IOC 컨테이너에게 위임한다.
O OCP
개방-폐쇄 원칙 (Open/closed principle)
- 확장에는 열려있고, 변경에는 닫혀있어야 한다
소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다
다형성을 활용하여 인터페이스를 구현한 새로운 클래스를 만들어 새로운 기능을 만들어야 한다.
ServiceImpl, JpaRepositoryImpl 등으로 구현체를 만들어 인터페이스에 끼워 쓰는건 OCP를 지키기 위함이다.
DB 접근방식이 Mybatis로 변경되어도 MybatisRepositryImpl등으로 구현체를 변경시켜 사용이 가능해진다.(다형성)
Mybatis로 소프트웨어의 요소를 확장하여도 Repository와 Bean 영역만 바꿔줘도 되므로 실제 사용영역인 Service단의 변경은 닫혀있다.
L LSP
리스코프 치환 원칙 (Liskov substitution principle)
-프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
다형성에서 하위클래스는 인터페이스 규약을 다 지켜야 한다는 원칙이다.
단순히 인터페이스를 하위클래스에서 구현하여 컴파일 에러를 피하라는 것이 아니라 부모의 동작 규약을 지키라는 것이다.
(save라는 동작을 할 시 디비연동을 어떤방식으로 하던지 insert into 쿼리를 실행해야한다.)
(delete 쿼리를 실행하도록 해도 컴파일에는 문제가 없으나 LSP 리스코프 치환 원칙을 위배한 것)
I ISP
인터페이스 분리 원칙 (Interface segregation principle)
-특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
범용 인터페이스 하나보다는 대체가능성을 생각해 필수기능이 잘 구현된 인터페이스 여러개를 설계하라
인터페이스가 명확해지고 대체 가능성이 높아진다.
D DIP
의존관계 역전 원칙 (Dependency inversion principle)
-"추상화에 의존해야지, 구체화에 의존하면 안된다." , 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
구현 클래스에 의존하지 말고 인터페이스에 의존하라는 뜻 변화하기 쉬운 구현객체에 의존하게 되면 추후 변경 및 유지보수가 힘들어진다.
서비스단에서 레파지토리의 인터페이스에만 의존하게된다면(생성과 주입은 IOC 컨테이너에서) 스프링을 통해 DIP 원칙을 지킬 수 있다.
'SpringFramework | SpringBoot' 카테고리의 다른 글
[Mybatis] useGeneratedKeys와 selectKey (0) | 2023.11.09 |
---|---|
SpringBoot의 메인 메서드의 풀이 (0) | 2023.11.09 |
REST API URI 작성 요령 (0) | 2023.11.09 |
Properties에 디비 관련 설정[개발,운영] (0) | 2023.11.09 |
MyBatis에서 mapper.xml 재기동 없이 반영하기. (0) | 2023.11.08 |