Spring

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

chandlerxx 2023. 11. 13. 16:41

컴퓨터 프로그래밍에서 SOLID란?

로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 소개했습니다.

프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다

 

1. SOLID


 

  • SRP : 단일 책임 원칙 (Single responsibility principle)
    ㄴ 한 클래스는 하나의 책임만 가져야 한다.
    ㄴ 변경이 있을때 side-effect가 적으면 SRP을 잘 준수한 것

  • OCP : 개방-폐쇄 원칙 (Open/closed principle) ★
    ㄴ 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. (단, 클라이언트 코드가 변경되면 안된다)
    ㄴ 다형성을 활용해 상위 클래스는 Closed, 하위 클래스를 Open 
    (ex. 인터페이스를 생성해서 신규 기능을 구현)

  • LSP : 리스코프 치환 원칙 (Liskov substitution principle)
    ㄴ 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다.
    ㄴ 정의된 기능을 무조건 만족시켜야 한다. (클라이언트 기준, Always pass)

  • ISP : 인터페이스 분리 원칙 (Interface segregation principle)
    ㄴ 범용 인터페이스 하나보다 여러개의 인터페이스가 낫다. 
    ㄴ 이때, 인터페이스의 변경이 일어나도 클라이언트에 영향을 주지 말아야한다.

  • DIP : 의존관계 역전 원칙 (Dependency inversion principle)  ★
    ㄴ 추상화, 인터페이스에 의존해야하고 구현 클래스(구현체)에 의존하면 안된다.
    ㄴ즉, Role(역할)에 의존해야한다. 

좋은 객체지향 설계란

역할(인터페이스)와 구현(구현 클래스)를 명확하게 구분하고, 클라이언트 코드의 변경없이 기능을 확장시킬 수 있어야 합니다.

 

2. 실무 고민


  • 인터페이스를 도입하게 되면 추상화 비용 발생(코드의 복잡도 증가로 인한 유지보수 어려움) 가능성 높음

따라서 기능을 확장할 가능성이 없다면 구현 클래스를 직접 사용하는 것도 하나의 방법입니다. 향후에 꼭 필요한 경우 리팩터링해서 인터페이스를 도입해도 됩니다. 적절하게 선택하여 사용해야 합니다.

 

 

출처