본문 바로가기
  • 시 쓰는 개발자
개발 방법론

SOLID 5원칙

by poetDeveloper 2024. 3. 11.

좋은 객체 지향 설계의 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를 잘 따른 것. 계층이 잘 나뉘어져 있는 것도 SRP를 잘 지키는 과정.

 

OCP 개방-폐쇄 원칙 (Open/closed principle)

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

Q. 기능을 확장하려면 코드를 변경해야하지 않나? 어떻게 코드 변경 없이 확장하지?

A. 다형성을 활용한다. 이는 역할과 구현을 구분해놓는 것이다. 새로운 기능으로 확장하는 것은, 기존의 인터페이스를 토대로 "구현"하면 된다.

 

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

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

다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것이다. 인터페이스를 구현한 구현체를 믿고 사용하기 위한 원칙이다. 예를 들어 자동차의 액셀은 앞으로 가는 것인데, 액셀을 밟았을 때 뒤로 가게 만든다면 이것은 LSP를 위반한 것이 된다. 왜냐하면 인터페이스에서는 액셀을 앞으로 가는 것으로 했는데 구현체에서는 뒤로 가게 만들었기 때문이다. 그럼 하위 클래스가 인터페이스 규약을 지키지 않은 것이다. 이는 컴파일 성공과는 별개이다. 액셀을 밟았을 때 뒤로가게 만들어도 오류는 나지 않는다. 그러나 우리 의도(인터페이스)와는 다르게 작동하므로 LSP를 지키지 않은 것이다.

 

ISP 인터페이스 분리 원칙 (Interface segregation principle)

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

객체는 자신이 호출하지 않는 메소드에 의존하지 않아야 한다는 원칙이다. 큰 덩이를 여러개의 작은 덩이로 나눈다고 생각하면 편하다. 예를 들어, 자동차를 만들 때 운전관련 / 정비관련으로 나누었다고 생각해보자. 그럼 이를 운전 인터페이스, 정비 인터페이스로 분리할 수 있고 정비 인터페이스가 변해도 운전자 클라이언트에 영향을 주지 않는다. 이를 통해 인터페이스가 명확해지고, 대체 가능성이 높아진다.

 

DIP 의존관계 역전 원칙 (Dependency inversion principle)

프로그래머는 추상화(역할, 인터페이스)에 의존해야지, 구체화(구현)에 의존하면 안된다.

한마디로, 클라이언트 코드는 구현 클래스를 바라보지 말고, 인터페이스를 바라보라는 뜻이다. 어떤 서비스로직이 있을 때, MemberRepository라는 인터페이스만 바라볼뿐이지 그 인터페이스의 구현체는 모른다는 것이다. 즉, 역할(Role)에 의존해야 한다는 것과 같다. 클라이언트는 인터페이스에 의존해야 구현체를 쉽게 변경할 수 있다. 구현체에 의존하게 되면 변경이 어려워진다.

'개발 방법론' 카테고리의 다른 글

개발 마인드  (0) 2024.03.16
TDD란?  (0) 2024.03.09