SOLID 객체 지향 설계의 5가지 원칙

moontag·2022년 4월 13일
0

CS

목록 보기
3/3

좋은 객체 지향 설계의 5가지 원칙 SOLID

유명한 클린코드의 저자 로버트 마틴 (밥아저씨 Uncle Bob)이 5가지 원칙을 정리해두셨다

SRP: 단일 책임 원칙 (Single Responsibility Principle)
OCP: 개방-폐쇄 원칙 (Open Closed Principle)
LSP: 리스코프 치환 원칙 (Liskov Substitution Principle)
ISP: 인터페이스 분리 원칙 (Interface Segregation Principle)
DIP: 의존관계 역전 원칙 (Dependency Inversion Principle)

💥 OCPDIP가 중요하다 💥






SRP: 단일 책임 원칙 (Single Responsibility Principle)

한 클래스는 하나의 책임만 가져야 한다.

  • UI 변경, 객체의 생성과 사용을 분리한다
  • 변경했는데 파급효과가 적으면, 단일 책임 원칙을 잘 따른 것이다



OCP: 개방-폐쇄 원칙 (Open Closed Principle)

소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

  • 요구사항의 변경, 추가하더라도 기존요소는 수정하지말고 확장 가능해야 한다
  • 확장 시, 추상화와 다형성을 지켜서 역할/구현 분리하면 OCP가 가능하다
  • 변하지 않는 부분 - 변할 부분을 분리해서 만들기

<문제점> (구현 객체 변경시)
구현 객체를 변경하면 클라이언트 코드를 변경해야한다 > 다형성만으로 OCP 원칙을 못지킴 ❌
OCP 지키기 위해 객체생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요!!
=> OCP, DOP 지키기위해 Spring DI 사용!

  • 의존관게 주입(DI : Dependency Injection)
    클라이언트에서 구현체를 결정하는 것이 아니라 우리가 클라이언트에게 어떤 구현체를 사용할 것인지 알려주는 것



LSP: 리스코프 치환 원칙 (Liskov Substitution Principle)

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 계약에 의한 설계를 참고하라.

  • 다형성에서 자식 클래스는 인터페이스 규약을 모두 지켜야 한다
  • 부모 클래스를 상속한 자식 클래스는 부모의 역할을 정확히 물려받아야 한다
  • 자식 클래스에서 기능 추가해도 부모 클래스의 기존 메소드 역할을 그대로 수행해야한다



ISP: 인터페이스 분리 원칙 (Interface Segregation Principle)

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

  • 자동차 인터페이스 > 운전 인터페이스, 정비 인터페이스로 분리
    사용자 인터페이스 > 운전자 클라이언트, 정비사 클라이언트로 분리
  • 정비 인터페이스가 변경돼도 운전자 클라이언트에 영향을 주지 않는다
  • 인터페이스가 명확해지고 대체 가능성이 높아진다



DIP: 의존관계 역전 원칙 (Dependency Inversion Principle)

프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.

  • 상위모듈이 하위모듈에 의존하면 안된다. 둘 다 추상화에 의존해야 한다
  • 역할과 구현을 분리하고, 서비스에서 인터페이스만 바라보게끔 해라
  • 클래스(구현)가 아니라, 인터페이스(역할)에 의존하라
  • ex) 운전자 역할 - 자동차 역할 --- 자동차 구현( k3, 부가티, 테슬라 )
    이렇게 자동차 역할 인터페이스에 의존해야 구현체를 변경하기 용이해진다.










  • 구현객체를 변경할때 클라이언트 코드도 변경되므로, 다형성만으로는 OCP, DIP 못지킨다 ❌
  • OCP, DIP 지키기 위해 Spring의 DI를 사용한다 🔗








참고

'스프링 핵심 원리 - 기본편' - 김영한 인프런 강의
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#

profile
터벅터벅 나의 개발 일상

0개의 댓글