• SOLID 원칙

    • 객체지향 프로그래밍(OOP) 설계의 5가지 기본 원칙
    • 코드의 유연성, 유지보수성 및 확장성을 높이기 위해 만들어졌다.
  • SRP (Single Responsibility Principle): 단일 책임 원칙

    • 하나의 클래스는 하나의 책임만 가져야 한다.
    • 적용 의의 -> 클래스에 너무 많은 역할과 책임을 부여하지 않도록 하기 위함
    • ex) 사람 클래스를 개발자 클래스, 의사 클래스, 군인 클래스로 분리
  • OCP (Open Closed Principle): 개방 폐쇄 원칙

    • 자신의 확장에 대해서는 열려(Open)있고, 수정에 대해서는 닫혀(Close) 있어야 한다.
    • 적용 의의 -> 기존 코드를 수정하지 않고 확장 가능한 구조로 설계하기 위해 적용
    • ex) Discount 인터페이스를 중간에 두고, 각 할인 정책을 별도의 구현체로 분리시켜 확장 가능하게 만들도록
  • LSP (Liskov Substitution Principle): 리스코프 치환 원칙

    • 서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다.
    • 적용 의의 -> 하위 클래스가 상위 클래스(혹은 구현하고자 하는 인터페이스)의 계약을 준수하여 예상치 못한 오류를 방지
    • ex) Dog dog = new JinDo()
  • ISP (Interface Segregation Principle): 인터페이스 분리 원칙

    • 특정 클라이언트를 위한 인터페이스를 여러 개 만드는 것이, 범용 인터페이스 하나를 만드는 것보다 낫다.
    • 적용 의의 -> 인터페이스가 크고 복잡해질수록 이를 구현하는 클래스들이 복잡해지는 것 방지
    • ex) 사람 인터페이스에 개발하기, 요리하기, 사격하기 메서드가 존재할 시, 이를 구현한 개발자 클래스에서는 불필요한 메서드(개발하기, 요리하기, 사격하기)를 모두 구현해야 하므로 처음부터 인터페이스를 분리(개발자, 요리사, 사냥꾼)할 것
  • DIP (Dependency Inversion Principle): 의존 역전 원칙

    • 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화된 인터페이스에 의존해야 한다.
    • 적용 의의 -> 저수준 모듈의 변화가 고수준 모듈에 미치는 영향을 최소화하고, 시스템의 유연성과 재사용성을 높인다.
    • ex) 도메인 계층(고수준 - 비즈니스 로직)의 리포지터리 인터페이스를 데이터 계층(저수준 - 구현 세부사항)에서 구축한 후, 해당 구현체를 도메인 계층(고수준)에서 참조
      • 도메인 계층의 요구사항을 중심으로 인터페이스를 설계하되, 이를 저수준에서 구현함으로써 고수준 계층이 간접적으로 저수준 계층을 참조하도록 구현
      • 고수준 계층은 구체적인 데이터 저장소(DB, 파일 시스템, API 등)에 의존하지 않고, 오직 인터페이스에만 의존하므로 변경에 유연해진다.
      • 저수준 계층(데이터 계층)은 도메인 계층이 정의한 인터페이스를 구현함으로써 도메인 계층의 요구사항을 충족시킨다.
      • 두 계층이 인터페이스라는 "약속"을 통해 서로를 이해하고 동작을 정의할 수 있다.