자바칩

[Spring] 객체 지향 설계 5원칙 (SOLID) 본문

Study/Spring

[Spring] 객체 지향 설계 5원칙 (SOLID)

아기제이 2024. 6. 10. 18:22
728x90
  1. 단일 책임 원칙(SRP: Single Responsibility Principle)
    • 정의: 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
    • 설명: 클래스는 하나의 기능 또는 역할만을 가져야 하며, 그 기능을 변경하는 이유는 하나뿐이어야 한다. 이를 통해 클래스의 복잡성을 줄이고, 코드의 가독성과 유지보수성을 높일 수 있다.
    • 예시: 사용자의 정보를 관리하는 User 클래스와 사용자 인터페이스를 처리하는 UserInterface 클래스를 분리하여 각각의 책임을 명확히 한다.
  2. 개방-폐쇄 원칙 (OCP: Open-Closed Principle)
    • 정의: 자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
    • 설명: 새로운 기능을 추가할 때 기존 코드를 변경하지 않고 확장할 수 있어야 한다. 이를 통해 기존 코드의 안전성을 유지하고, 코드 변경으로 인한 오류를 줄일 수 있다.
    • 예시: 새로운 기능을 추가할 때 기존 클래스의 코드를 수정하지 않고, 기존 클래스를 상속받거나 인터페이스를 구현하여 새로운 클래스를 작성한다.
  3. 리스코프 치환 원칙 (LSP: Liskov Substitution Principle)
    • 정의: 서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다.
    • 설명: 서브 클래스는 기본 클래스의 기능을 확장하거나 변경하더라도, 프로그램의 흐름을 깨뜨리지 않아야 한다. 즉, 서브 클래스는 기반 클래스의 계약(행동)을 준수해야 한다.
    • 예시: Rectangle 클래스를 상속받은 Square 클래스가 Rectangle의 모든 메서드를 정상적으로 동작하게 해야 한다.
  4. 인터페이스 분리 원칙 (ISP: Interface Segregation Principle)
    • 정의: 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
    • 설명: 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다. 여러개의 구체적인 인터페이스를 만들어 클라이언트가 필요한 기능만 사용할 수 있도록 한다.
    • 예시: Printer 인터페이스를 Scanner 기능과 Copier 기능으로 나누어 각각의 클라이언트가 필요한 기능만 구현하도록 한다.
  5. 의존 역전 원칙 (DIP: Dependency Inversion Principle)
    • 정의: 자신보다 변하기 쉬운 것에 의존하지 마라.
    • 설명: 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화된 인터페이스에 의존해야 한다. 구체적인 구현이 아닌 추상화된 인터페이스에 의존함으로써, 모듈 간의 결합도를 낮추고 유연성을 높인다. 이를 통해 모듈을 쉽게 교체할 수 있다. 
    • 예시: Service 클래스가 Repository 클래스에 직접 의존하지 않고, Repository 인터페이스에 의존하게 하여 다양한 구현체를 주입할 수 있도록 한다.