SOLID 객체지향 설계원칙

zwundzwzig·2023년 4월 6일
0

OOP

목록 보기
1/3

로버트 마틴은 자신의 저서 클린 소프트웨어에서 설계가 잘못될 때 나타나는 증상으로 7가지를 정의한다.

  • 경직성 Rigidity : 설계를 변경하기 어려움
  • 취약성 Fragility :
  • 부동성 Immobility :
  • 점착성 Viscosity :
  • 불필요한 복잡성 Needless Complexity :
  • 불필요한 반복 Needless Repetition :
  • 불투명성 Opacity :

리펙토링의 저자 마틴 파울러가 얘기한 code smell과 비슷하면서도 더 높은 단계의 문제라고 저자는 설명한다.

그러면서 최적의 설계를 돕는 객체 지향 설계 5가지 원칙 SOLID 원칙을 제시한다.

Single Responsibility Principle

한 클래스는 단 한 가지의 책임만을 가져야 한다.

단일 책임 원칙, SRP라 부르면 된다. 처음 이 개념이 고안될 땐 응집도라 불렸다.

즉, 클래스는 그 책임을 완전히 캡슐화해야 한다.

책임이라는 워딩이 모호하기 때문에 저자는 변경 이유라고 표현한다. 어떤 역할에 대해 변경 사항이 발생할 때 영향 받는 기능을 특정 클래스에 모아둬 전체 서비스에 변경 사항이 적으면 SRP 원칙을 잘 적용한 설계라고 볼 수 잇다.

단일 책임 원칙을 잘 지키면 변경이 필요할 때 수정 대상이 명확해져 코드 간 경직성을 낮출 수 있다.

저자는 FACADE나, PROXY 패턴을 사용해 리팩토링해야 한다고 썼다.

Open-Closed Principle

소프트웨어의 클래스, 모듈, 함수 등은 확장에 대해 열려 있어야 하고, 수정에 대해선 닫혀 있어야 한다.

개방 폐쇄 원칙, OCP라 부르면 된다. 여기서 높은 응집도와 낮은 결합도 개념이 중요하다.

응집도가 높다는 건 특정 객체나 모듈이 하나의 관심사에 집중돼 변경 사항이 발생해도 다른 곳에 덜 영향을 미칠 수 있다는 점이다.

결합도가 낮으면 '의존성'을 줄여 서비스 확장 및 변경에 유연하게 대처할 수 있을 것이다.

인터페이스를 통한 추상화와 다형성을 통해 이를 지킬 수 있다. 인터페이스를 구현하는 의미에서 확장에 열려있다고 볼 수 있고, 객체를 직접 수정하지 않고도 변경사항을 적용할 수 있는 것 역시 인터페이스에서 접할 수 있는 개념이잖소.

추후 더 깊이있게 봐야할 개념 Dependency Injection, Inversion Of Container

Liskov Substitution Principle

자식은 언제나 자신의 부모로 치환 가능해야 한다.

자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 한다.

어떤 타입에 있어 중요한 속성이면 하위 타입에서도 마찬가지로 중요하다. 따라서 그 타입의 모든 메서드가 하위 타입에서도 똑같이 잘 작동해야 한다.

'정사각형은 직사각형이다.'

이 역시 인터페이스 개념을 통해 알 수 있는데, 메서드의 구현을 강제해 다형성을 지원하기 위한 원칙을 지켜야 한다는 것이다.

Dependency Inversion Principle

의존 관계를 맺을 때 거의 변화가 없는 것에 의존하라.

의존 관계 역전의 원칙.

한마디로 구현체인 클래스보다 인터페이스나 추상 클래스와 같은 추상화(역할)에 의존하라는 것이다.

다형성 개념에 연결된다.

Interface Segregation Principle

사용하지 않는 메소드에 의존하도록 강제돼선 안 되고 여러 인터페이스 분리가 좋다.

인터페이스 분리 원칙.

'비대한' 인터페이스를 지양하고 응집력 있는 인터페이스를 갖는 추상 기반 클래스를 갖도록 하자.

위임을 통한 분리를 통해 확장성이 커지는 것을 고려할 수 있다.


🧷 참고 교재

  • [제이펍] 클린 소프트웨어: 애자일 원칙과 패턴, 그리고 실천 - 로버트 C. 마틴
profile
개발이란?

0개의 댓글