SOLID

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

  • SRP : 단일 책임 원칙 (SINGLE RESPONSIBILITY PRINCIPLE)
  • OCP : 개방 폐쇄 원칙 (OPEN CLOSED PRINCIPLE)
  • LSP : 리스코프 치환 원칙 (LISKOV SUBSTITUTION PRINCIPLE)
  • ISP : 인터페이스 분리 원칙 (INTERFACE SEGREGATION PRINCIPLE)
  • DIP : 의존 관계 역전 원칙 (DEPENDENCY INVERSION PRINCIPLE)

SRP 단일 책임 원칙

SINGLE RESPONSIBILITY PRINCIPLE

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 하나의 책임이라는 것은 모호하다.
    • 클 수도 있고, 작을 수도 있음
    • 문맥과 상황에 따라 다르다
  • 중요한 기준은 변경이다. 특정 기능이 변경될 때 코드에서 파급효과가 적으면 단일 책임 원칙을 잘 따랐다고 할 수 있다.
  • SRP 를 지키지 못한 예시
    • UI 하나 고치는데 쿼리문, 어플리케이션 코드 등등을 전부 고쳐야 함.

OCP 개방-폐쇄 원칙 (가장 중요함 !!)

OPEN - CLOSED PRINCIPLE

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.
    • 예시: 다형성 활용
    • 인터페이스의 새로운 구현체를 만드는 것은 인터페이스가 바라보는 구현체를 교체해줘야하기 때문에 기존 코드를 변경해줘야한다. 즉, 확장에는 열려있지만 변경도 발생한다. (다형성을 활용했지만 OCP 를 지킬 수 없음)
    • 이 때, 객체를 생성하고 연관관계를 맺어주는 외부 조립, 설정자가 필요함. 이 역할을 Spring 이 해줄 수 있다.

LSP 리스코프 치환 원칙

LISKOV SUBSTITUTION PRINCIPLE

  • 객체는 프로그램의 정확성을 지키면서 하위 타입 인스턴스로 바꿀 수 있어야한다.
  • 다형성에서 하위 클래스는 인터페이스 규약을 전부 지켜야한다는 의미. 인터페이스를 구현한 구현체를 믿고 사용하려면 이 원칙이 반드시 지켜져야한다.
  • 컴파일에 성공하는 것을 넘어서 기능적 원칙도 준수해야함.
    • 예를 들어, 자동차를 만든다면 액셀을 밟으면 느리더라도 앞으로 가야한다는 원칙을 지켜야한다.

ISP 인터페이스 분리 원칙

INTERFACE SEGREGATION PRINCIPLE

  • 특정 클라이언트를 위한 전문화된 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  • 자동차 인터페이스를 -> 운전자 인터페이스, 정비 인터페이스로 분리
  • 사용자 클라이언트를 -> 운전자 클라이언트, 정비사 클라이언트로 분리시킬 수 있음
  • 하나의 인터페이스가 변하더라도 관련 없는 클라이언트는 영향을 받지 않음
  • 인터페이스의 역할이 명확해지고 대체 가능성이 높아진다.

DIP 의존관계 역전 원칙 (가장 중요함 !! 2)

DEPENDENCY INVERSION PRINCIPLE

  • "프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다."
    • 의존성 주입(DEPENDENCY INJECTION)은 이 원칙을 따르는 방법 중 하나다.
  • 구현 클래스에 의존하지 말고 인터페이스에 의존하라.
  • OOP 관점에서 : 역할(ROLE) 에 의존하게 만들어야한다. 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경며 사용할 수 있다. 구현체에 의존한다면 변경이 아주 어려워진다.
  • 하지만, 인터페이스에 의존하는 코드가 구현체를 변경하려면 구현체에도 의존할 수 밖에 없다.
    • EX) MemberRepository mr = new MemoryMemberRepository();
    • MemoryMemberRepository 구현체를 변경하려면 의존할 수 밖에 없다.

위에서 예시를 들듯, 다형성만으로는 OCP, DIP 를 지킬 수 없다.

+ Recent posts