본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/JAVA

[JAVA] 객체지향 설계 5원칙 SOLID 원칙

by 미노드 2024. 2. 8.

객체지향을 기반으로 개발하는데 있어 좋은 객체지향을 설계하기 위한 원칙이 있습니다.

개발자들이 좋은 객체지향 방식으로 설계되었다고 판단할 수 있는 원칙인데,
이 원칙 없이도 설계할 수 는 있으나, 객체 지향 원칙을 벗어나다보니 이후 유지보수나 리펙토링을 할 때
의견의 차이가 생길 수 있을 것 같습니다.

그러므로 설계할 때 약속된 원칙을 참고해서 설계하면 좋을 것 같아 정의 된 원칙 5개를 정리해보려 합니다.

- 좋은 객체지향 설계5원칙(SOLID)

• SRP: 단일 책임 원칙(Single Responsibility Principle)
• OCP: 개방-폐쇄 원칙 (Open/closed principle)
• LSP: 리스코프 치환 원칙 (Liskov substitution principle)
• ISP: 인터페이스 분리 원칙 (Interface segregation principle)
• DIP: 의존관계 역전 원칙 (Dependency inversion principle)

- SRP: 단일 책임원칙(하나의 클래스는 하나의 책임만 가져야 한다...   기준 변경시 어느부분까지 책임을지는가가 핵심.)
- OCP: 개방폐쇄 원칙 (확장에는 열려있으나, 변경에는 닫혀 있어야 한다. 그러나 mapper 변경같은것처럼 코드변경은 필요한 경우가있는데, 이 원칙을 깰수밖에 없다. 다형성을 사용한 변경. 객체를 생성하고 연관관계를 맺어주는 조립/설정자가 필요하다. 이게 스프링)
- LSP: 리스코프 치환 원칙 (프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 함. 하위 클래스는 인터페이스 규약을 다 지켜야 하는 것. 액셀기능은 무조건 앞으로 가게하는것을 지키면된다.)
- ISP: 인터페이스 분리 원칙 (클라이언트를 위한 인터페이스를 여러개로 분리해서 쓰는게 범용 인터페이스 하나보다 낫다)
- DIP: 의존관계 역전 원칙(추상화에 의존해야지, 구체화에 의존하지말라. 의존성 주입 원칙, 클라이언트는 구현체를 바라보는게아닌 인터페이스를 바라보게 설계하는 것, 변경을 유연하게 하기 위해.)

정리하자면....

SRP(단일 책임 원칙)을 생각하며 특정 책임만을 위한 클래스를 설계하고
LSP(리스코프 치환 원칙)을 생각하며 기존 기능의 정확도를 보장하며
ISP(인터페이스 분리 원칙)으로 범용보단 주요 인터페이스를 나눠 설계합니다.

이것까진 쉬운데...
OCP(개방 폐쇄 원칙)을  위해 변경을 닫고 확장으로 대응해야 한다...라는건 설계할 때 기존 기능의 변경 없이 새로운 기능이 확장 가능하도록 설계하자. 라는 것으로 해석됩니다.
그리고 DIP(의존관계 역전 원칙)으로 구현체를 바라보지 않고, 추상화된 것을 바라보며 실행해야 한다는 부분인데,

실행을 구현체가 아닌 인터페이스로 실행할 수 있도록 설계하라는 것으로 해석됩니다.

설계를 하는데 있어 이 원칙들을 따른다면, 이후 유지보수 하는데에도 용이한 코드를 만들 수 있고 협업도 편해질 수 있을거라는 기대가 있지만, 조율해서 팀이 원하는 설계를 따라가는데에 참고정도로만 하는게 좋아보입니다.
만약 기능이 확장될 필요없는 기능이라면 구현된 클래스를 바로 쓰는 것도 방법입니다.