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


로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리

  • 프로그래머가 시간이 지나도 유지 보수확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다.
  • 이 5가지 원칙은 애자일(Agile) 소프트웨어 개발 과 적응적소프트웨어 개발의 전반적 전략의 일부다.

  • SRP : 단일 책임 원칙 (Single responsibility principle)

    • 단일 책임 원칙이란 OOP적인 관점에서 생각을 해보았을 때 한 클래스의 변경사항이 발생해도 다른 클래스 혹은 코드상의 다른쪽의 변경점이 적다면 단일 책임 원칙이 잘 지켜지고 있다고 생각해볼 수 있다. 즉 상속관계를 예를 들었을 경우 부모클래스의 정보 수정만으로 상속받은 자식클래스 혹은 자식클래스와 비슷한 서브 기능들의 정보가 알아서 전부 변경될 경우이다.
  • OCP : 개방-폐쇄 원칙(Open/closed principle)

    • 개방, 폐쇄 원칙은 "소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다" 라고 명시되어있다 이렇게 읽어보면 한번에 이해하기 쉽지 않은데 다형성을 생각해보면 쉽게 이해할 수 있다.

    • public class TempService{
        ParentRepository temp = new TempRepository();
        ParentRepository temp = new TempRepository2();
      
      }
    • 변경이 없다는 것은 코드의 변경이 없다는 말이고, 다형성을 사용하고 있으나 OCP가 지켜지지 않고 있다.

    • 클라이언트는 역할만 보고 구현체가 변경되더라도 상관이 없다 위 코드는 ParentRepository는 동일하지만 할당되는 객체는 변경해서 사용하고 있다.

  • LSP : 리스코프 치환 원칙 (Liskov substitution principle)

    • "프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스를 바꿀 수 있어야 한다." 여기서 말하는 정확성이란 한 가지 기능에 대한 의미를 뜻한다 예를들어 상위 인터페이스의 메소드 중 jump라는 기능을 상속받은 하위클래스 2개가 인스턴스를 생성했다고하자(2개의 하위클래스는 각각 다른 도메인이다) 다람쥐, 캥거루 라는 2개의 하위인스턴스는 jump라는 함수를 실행했는데 여기서 캥거루는 일반적인 jump의 기능을 했지만 다람쥐는 jump를 실행했음에도 바닥을 기어가는 결과가 나온다면 리스코프 치환 원칙의 정확성이 깨지기 때문에 LSP원칙 위반이다.
  • ISP : 인터페이스 분리 원칙 (Interface segregation principle)

    • “특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.” 여기서 자동차 인터페이스를 운전 인터페이스와 정비 인터페이스로 분리했다고 가정하자. 그리고 사용자클라이언트는 운전자 클라이언트와 정비사 클라이언트로 분리한다. 만약 정비 인터페이스에서 수정이 일어났다고 하면 운전자 클라이언트에는 영향이 없겠으나, 범용적인 자동차 인터페이스로 사용하고 있었다면 이를 사용하던 운전자, 정비사 클라이언트 모두 수정이 필요했을 것이다. 예시를 통해 인터페이스가 특정 클라이언트를 위해 생성된다면 더 명확해지며 대체가능성이 높아진다.
  • DIP : 의존관계 역전 원칙 (Dependency inversion principle)

    • 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나다. 즉 구현클래스에 의존하지 말고 인터페이스에 의존하라는 뜻이다

Reference

'Spring, Spring Boot' 카테고리의 다른 글

Spring Web Layer  (0) 2023.01.12
Spring MVC 동작과정  (0) 2023.01.11
Spring AOP 정리  (0) 2022.01.01
Spring 어노테이션(Annotation) 정리  (0) 2021.12.28

+ Recent posts