| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- Web
- Routing Key
- 스프링 부트
- JWT
- JPA
- AWS
- Spring Container
- redis
- @ComponentScan
- Dead Letter Queue
- 컨테이너
- DLQ
- docker
- 서블릿 컨테이너
- 페이징
- securitycontextholderfilter
- Spring Data JPA
- 쿠버네티스
- docker compose
- DI
- 지연 로딩
- @Transactional
- dockerhub
- JdbcTemplate
- JPQL
- MSA
- kafka
- CORS
- Spring
- mybatis
- Today
- Total
look-forest
SOLID: 좋은 객체 지향 설계 5원칙 본문
SOLID 원칙

- SRP(Single Responsibility Principle): 한 클래스는 하나의 책임만 가져야
- OCP(Open/Close Principle): 확장에는 열려있고, 변경에는 닫혀있어야
- LSP(Liskov Substitution Principle): 하위 타입의 인스턴스로 대체할 수 있어야
- ISP(Interface Segregation Principle): 인터페이스는 최대한 분리해야
- DIP(Dependency Inversion Principle): 추상화에 의존해야지, 구체화에 의존하면 안된다
≫ 확장성 있고, 변경에 파급이 적어야 한다
1. Single Responsibility Principle
한 클래스는 하나의 책임만 가져야 한다
- '하나의 책임'이라는 표현은 모호하다
- 중요한 기준은 변경이다
- 변경이 있을 때 파급이 적으면 단일 책임 원칙에 따라 잘 따른 것
ex) UI 변경, 객체의 생성과 사용을 분리
2. Open/closed principle
소프트웨어 요소는 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다
- but, 다형성을 적용해도 코드 변경이 불가피

객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다 (스프링 컨테이너!)
3. Liskov substitution principle
객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
- 인터페이스 구현체를 믿고 사용하려면 이 원칙이 필요
- 하위 클래스는 인터페이스 규약과 기능을 다 지켜야 한다
ex) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반
4. Interface segregation principle
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
인터페이스가 명확해지고, 대체 가능성이 높아진다
- 인터페이스 덩어리가 크면 하나를 위해 전체를 구현하기 어렵다
- 작으면 쉽게 구현해서 갈아끼울 수 있다
ex)
자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
5. Dependency inversion principle
추상화에 의존해야지, 구체화에 의존하면 안된다
- 구현클래스에 의존하지 말고, 인터페이스(역할)에 의존하라는 뜻
- 언제든지 구현을 갈아 끼우기 위해
- 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다!
- 의존한다 = 그 코드를 알고 있다, 눈에 보인다 → 코드 변경 수반

추상화뿐만 아니라 구체화에도 의존하고 있다 → 코드 변경 필요
좋은 객체 지향 설계는, 확장성 있고 변경에 파급이 적어야 한다
객체 지향의 핵심인 다형성 만으로는 이를 지킬 수 없다
- 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다
- OCP, DIP를 지킬 수 없다
뭔가 더 필요하다
참고 자료
스프링 핵심 원리(김영한 님)
'Spring > Spring 핵심 원리' 카테고리의 다른 글
| [예제] SPRING으로 전환하기 (0) | 2023.04.29 |
|---|---|
| IoC/DI 컨테이너 (0) | 2023.04.29 |
| [예제] 스프링 없이 좋은 객체 지향 설계하기 (0) | 2023.04.29 |
| 좋은 객체 지향 프로그래밍? (0) | 2023.04.29 |
| Spring이란? (0) | 2023.04.29 |