티스토리 뷰

반응형

객체지향 프로그래밍 설계를 위해서 지켜야 하는 5가지 원칙이 있다 바로 SOLID이다

 

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

-한 클래스는 하나의 책임만 가져야 한다

 

즉 클래스가 각 역할에 맞는 클래스로 구분되어야 한다는 것인데

객체지향의 특성이 추상화를 다시 한번 떠올려보자, 추상화(모델링)이라는 것이 각 목적과 관심에 맞게 특성들을 조합하는데

 

병원 애플리케이션에 의사라는 객체가 있다고 생각해보자 의사는 의사라는 직업만 가지고 있는 존재가 아닐 것이다

의사임과 동시에 자식의 부모, 배우자, 부모의 자식, 본인이 아프면 환자, 은행에 가면 고객

이렇게 다양한 역할이 있을 텐데 이를 구분하는 게 바로 단일 책임 원칙이다

또한 객체의 속성도 하나의 속성만 가지고 있어야 한다

예를 들어 키라는 속성에 나이가 들어가면 단일 책임원칙을 벗어나는 설계인 것이다

 

이렇듯 단일 책임 원칙은 클래스나 속성뿐만 아니라 메서드 그리고

데이터베이스의 테이블까지 단일 책임원칙을 생각하고 만들어야 한다 (물론 요구사항에 따라 달라질 수 있겠다)

핵심을 요약하자면 이를 변경/수정하였을 때 다른 곳에 파급효과가 적어야 한다는 것이다

 

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

-자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다

 

뭔가 말이 안 맞는 것 같은 얘기인데, 이를 최대한 쉽게 설명하자면

사용자가 어떠한 로직을 직접적으로 참조하고 있을 때 로직이 바뀌게 되면 당연히 다른 로직으로 참조하게 된다.

이는 정확히 정반대의 상황일 것이다 즉 자신의(user) 확장에는 닫혀 있고, 주변의 변화(logic)에는 열려 있는 것이다

OCP를 적용하지 않은 설계

 

하지만 상위 클래스 혹은 인터페이스를 추가하여 구현한다면 user의 확장을 열면서 logic에 변화에는 닫혀있게 설계할 수 있다

OCP를 적용한 설계

이를 교과서적으로 잘 구현한 것이 바로 스프링 프레임워크이다

 

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

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

 

즉 다형성에서 하위 클래스는 인터페이스의 규칙을 지켜야 한다는 것이다

(즉 자식 클래스에서 부모 클래스의 행위가 일관성이 있어야 한다는 것)

 

예를 들어 앞으로 가게 만든 자동차라는 상위 클래스가 있다

이때 아반떼라는 하위 클래스를 만들어 자동차를 상속받았는데

이 메서드를 뒤로 가게 만들면? 뒤로 가게 만들더라도 컴파일 오류는 발생하지 않는다

하지만 이게 바로 LSP 원칙에 위배되는 것이다

 

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

-특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

 

즉 사람이 환자를 만날 때는 (의사 인터페이스를 사용) 의사가 되고

자식을 만날때는 (부모 인터페이스를 사용) 부모가 되고

은행에 갈 때는 (고객 인터페이스를 사용) 고객이 되는 것이다

 

이렇게 인터페이스를 분리하여 의사 / 부모 / 고객 인터페이스가 각각 변해도

다른 인터페이스에는 영향을 주지 않기 때문에 보다 인터페이스가 명확해지고 대체 가능성도 높아진다

 

D : DIP (Dependency inversion princple) 의존관계 역전 원칙

-구체화가 아닌 추상화에 의존해야 한다

 

의존관계라고 하면 아까 OCP에서 보았던 USER / Logic 예시가 필요하다

지금 아래에 보이는 것이 바로 USER가 MainLogic에 의존하고 있는 것이다 이게 바로 DIP의 대표적인 예시인데

 

쉽게 얘기해서 구현된 클래스(Logic1, Logic2) 보다 추상화된 인터페이스(MainLogic)를 의존해야 한다는 뜻이다

 

OOP를 공부하며 객체 지향의 특성과 설계 원칙인 SOLID를 정리해봤다

하지만 객체 지향의 핵심인 다형성만 가지고는 OCP(개방-폐쇄 원칙) 그리고 DIP(의존성 역전 원칙) 같은 원칙들을 지킬 수가 없다

 

그래서 나온 것이 바로 Spring Framework이다

Spring Container가 DI(의존성 주입)을 통해 다형성을 사용하면서도 OCP와 DIP를 지킬 수 있게 해 준다

 

DI의 정리 글

 

반응형
댓글