1. SRP (Single Responsibility Principle : 단일 책임 원칙)
- 정의 : 한 클래스는 오직 하나의 책임만을 가져야 한다.
- 중요성 : 한 클래스가 여러 책임을 가지게되면, 해당 클래스는 변화의 이유가 여러 가지가 될 수 있다. 이는 유지보수를 복잡하게 만든다. SRP를 지키면 클래스의 변경 이유가 명확해지며, 코드의 가독성이 향상된다.
- 예제 : "UserManager" 크래스는 사용자 정보를 관리하는 책임만 가져야 하며, 로그 기록이나 UI표시와 같은다른 책임을 가지면 안된다.
2. OCP (Open/Closed Principle : 개방 - 폐쇄 원칙)
- 정의 : 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다.
- 중요성 : 기능의 추가나 변경이 필요할 때, 기존 코드의 수정 없이 (기존 코드를 "닫힌 상태로" 유지하면서) 새로운 코드를 추가하는 방식으로 확장성을 확보하는 것을 목표로 한다.
- 예제 : "PaymentProcessor" 인터페이스가 있을 때, 새로운 결제 방식을 추가하려면 기존코드를 수정하지 않고 새로운 클래스를 추가해 확장해야 한다.
3. LSP (Liskov Substitution Principle : 리스코프 치환 원칙)
- 정의 : 서브타입은 그것의 기본 타입을 대체할 수 있어야 한다.
- 중요성 : 하위 클래스는 상위 클래스의 기능을 확장만 할 수 있고, 변경하거나 제거해서는 안된다. 이를 통해 상위 클래스의 인스턴스 대신 하위 클래스의 인스턴스를 사용할 때 프로그램의 정확성이 깨지지 않도록 한다.
- 예제 : 모든 "Bird" 클래스의 객체가 "fly()" 메서드를 가진다면, "penguin" 클래스(하위 클래스) 역시 "fly()" 메서드를 제공해야 한다.
4. ISP (Interface Segregation Principle : 인터페이스 분리 원칙)
- 정의 : 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하도록 강제되어서는 안된다.
- 중요성 : 하나의 큰 인터페이스보다는 여러 개의 인터페이스가 나으며, 이를 통해 필요하지 않는 메서드에 의존하는 것을 방지 한다.
- 예제 : "MultifunctionPrinter" 인터페이스가 "print()", "scan()", "fax()" 를 모두 가진 대신, 각각 "Printer", "Scanner", "Fax" 인터페이스로 분리하는 것이 좋다.
5. DIP (Dependency Inversion Principle : 의존관계 역전 원칙)
- 정의 : 상위 모듈은 하위 모듈에 의존해서는 안되며, 둘 다 추상화에 의존해야 한다.
- 중요성 : 디자인을 추상화에 의존하게 함으로써 모듈 간의 유연성을 높이고, 결합도를 낮추며, 재사용성을 향상시킨다.
- 예제 : 데이터베이스 연결 코드가 "MySQLDatebase" 클래스에 직접 의존하는 대신, "DatabaseInterface" 인터페이스에 의존하도록 설계하는 것이 좋다.
'Spring > Spring 핵심 원리' 카테고리의 다른 글
| 싱글톤 컨테이너 (0) | 2023.08.16 |
|---|---|
| 스프링 컨테이너와 스프링 빈 (0) | 2023.08.15 |
| 애자일 소프트웨어 개발 4대 선언, 12가지 원칙 (0) | 2023.08.14 |
| 스프링 핵심원리 기본편 - 회원,주문 도메인 설계 (0) | 2023.08.14 |
| 스프링 핵심원리 기본편 - 스프링 이란? (0) | 2023.08.13 |