인프런 커뮤니티 질문&답변

김민정님의 프로필 이미지
김민정

작성한 질문수

오브젝트 - 기초편

5-4-예제. 애플리케이션 객체 추가하기

DIP vs OCP

해결된 질문

작성

·

200

·

수정됨

2

다른 질문 답변에

DAO에 인터페이스를 사용하는 이유

DAO에 인터페이스를 사용하는 이유는 다양한 DAO 구현체를 제공하기 위해서가 아니라 의존성을 끊기 위해서입니다.

이렇게 답변을 하신게 있는데,
그렇다면 DAO에 인터테이스를 사용하는 주된이유는 SOLID원칙 중 DIP원칙을 통해서 의존성을 끊기 위해서라고 이해를 했습니다

그런데 OCP와 DIP가 의미적인 부분에서 일맥상통하는 부분이 있는 것 같기도 하고,, 좀 구별하기가 어려운 것 같습니다
추가적으로 같이 달아주신 블로그 링크도 확인했지만 여전히 모호한 것 같습니다

둘다 인터페이스를 통해서 구현을 할 수 있지만 OCP는 다양한 DAO구현체를 제공하기 위한 것에 초점을 맞춘 것이고, DIP는 의존성을 끊기 위한 것에 초점을 맞춘 것이라고 이해하면 될까요


흠,, 명확하게 이해하진 못한 것 같습니다 어떻게 이해해야될까요..?!

답변 1

1

조영호님의 프로필 이미지
조영호
지식공유자

김민정님 안녕하세요.

궁금하신 부분에 대해 좀 더 부연 설명드리도록 하겠습니다. 🙂

 

의존성 역전 원칙(Dependency Inversion Priciple, DIP)는 다음과 같이 정리할 수 있습니다.

a. 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 모두 추상화에 의존해야 한다.

b. 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.

DIP의 목적은 상위 수준의 중요한 정책이 하위 수준의 메커니즘에 의해 영향을 받지 않도록 만드는 것입니다.

여기에서 상위 수준의 정책을 객체 사이의 협력으로 생각하셔도 무방합니다.

해당 질문에서 ReservationService가 CustomerDAO를 이용해서 데이터를 조회한다는 것은 상위 수준의 정책입니다.

image.png

 

데이터베이스에서 Customer를 어떻게 쿼리하는지를 구현한 CustomerJdbcDAO는 세부사항입니다.

이 세부사항이 변경되더라도 ReservationService가 CustomerDAO와 협력해서 데이터를 조회하는 상위 수준의 협력은 영향을 받지 말아야 합니다.

이런 이유로 ReservationService와 CustomerJdbcDAO 모두 추상화인 CustomerDAO에 의존하도록 만든 것입니다.

여기에서 추상화가 핵심인데 DIP는 자주 변하는 것이 아니라 자주 변하지 않는 안정적인 추상화에 의존하라고 가이드하고 있기 때문입니다.

간단히 말해서 DIP는 중요하지 않은 세부사항의 변경으로 인해 중요한 상위 정책이 영향을 받지 않도록 추상화에 의존하도록 의존성을 제어하는 원칙입니다.

 

개방 폐쇄 원칙(Open-Closded Principle, OCP)은 다음과 같이 정리할 수 있습니다.

소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.

OCP는 유연한 설계란 기존 코드를 수정하지 않고도 기능을 확장할 수 있어야 한다고 이야기합니다.

OCP의 목적은 코드를 수정하지 않고도 다양한 환경에서 코드를 재사용할 수 있도록 만드는 것입니다.

어떤 메커니즘을 사용하건 이 목적을 만족할 수만 있다면 개방 폐쇄 원칙을 만족한다고 할 수 있습니다.

객체지향에서 OCP를 만족시키는 가장 일반적인 방법은 다형성을 사용하는 것입니다.

일반적으로 다형성을 이용해서 OCP를 만족시키기 위해서는 DIP와 LSP(Liskov Substitution Principle)를 조합해서 코드를 작성합니다.

강의에서도 이 방식을 소개하고 있기 때문에 DIP와 OCP가 혼란스럽게 느껴지신것 같습니다.

DIP를 적용했다고 해서 OCP가 보장되는 것은 아니기 때문입니다.

하지만 다형성을 통해 OCP를 달성하기 위해서는 기반 구조에 DIP를 적용할 필요는 있습니다.

OCP를 만족시키는 방법이 다형성만 있는 것은 아닙니다.

예를 들어 변경사항을 외부의 데이터로 빼서 코드는 수정하지 않은채 데이터만 변경해서 애플리케이션의 행동을 확장하는 것도 OCP의 한가지 방법입니다(룰 엔진이나 게임에서 많이 사용됩니다).

아래 공유드리는 책에 OCP를 만족시키기 위해 데이터를 사용하는 설계의 예가 나옵니다.

정리하면 OCP는 기존 코드를 수정하지 않으면서 행동을 확장하는 원칙을 가리키며 DIP는세부사항의 변경에 의해 상위 정책이 영향을 받지 않도록 의존성을 제어하는 원칙입니다.

둘 모두 추상화에 의존한다는 공통점이 있지만 의도는 조금 다릅니다.

흔히 OPC는 달성하려는 목적을, DIP는 이를 위한 메커니즘이라고 이야기 하기도 합니다.

 

더 상세한 내용이 궁금하시면 아래 책을 보시면 많은 도움이 되실 거에요.

https://product.kyobobook.co.kr/detail/S000001875106

 

정리하면 질문에 적어주신 아래 내용이 다소 부정확하기는 하지만 어느 정도는 핵심을 짚으신 것이라고 할 수 있습니다.

OCP는 다양한 DAO구현체를 제공하기 위한 것에 초점을 맞춘 것이고, DIP는 의존성을 끊기 위한 것에 초점을 맞춘 것이라고 이해하면 될까요

 

답변이 됐는지 모르겠네요. 🙂

 

김민정님의 프로필 이미지
김민정

작성한 질문수

질문하기