Design Patterns2008. 6. 28. 00:33

객체지향 설계 원칙 5-4 DIP (Dependency Inversion Principle) 의존 관계 역전 원칙

먼저 의존 관계 역전 이란 어떤 의미인지 알아보자.

A 객체가 B 객체를 멤버객체로 사용한다고 하면 A 객체는 B 객체를 사용하게 된다. B객체의 통제권이 A 객체에 있는것이다. B 객체는 A 객체의 존재도 알지 못한다. 이러한 관계에서 B 객체가 A 객체를 호출해야 하는 일이 필요할수 있다. B 객체가 A 객체를 Call 하는것을 의존관계 역전이라고 보면되겠다.

채팅프로그램을 하나 만들려고 한다. 그러면 네트웍 처리하는 부분을 개발해야 할것이다. 그래서 나는 네트웍 관련처리를 맡아서 할 소켓 객체를 하나 만들어서 사용하려고 한다.

간단하게 보면 다음과 같다.

사용자 삽입 이미지

[그림1]

이 구조에서 클라로직은 클라소켓 객체를 통해 서버와 통신을 한다. 클라소켁 객체의 Send 와 Receive 메소드를 비교해 보겠다.

클라로직에서 어떤 데이타를 서버에 Send 하고 그에 맞는 응답을 Receive 해야 한다고 가정한다. 그러면 클라로직은 클라소켓의 Send 메소드를 호출하면된다. Send 후에 Receive 를 받아야 하는데 서버에서 언제 데이타가 올지 모른다. 그러면 어떻게 해야 하나 ? 제일 간단한 방법으로는 클라소켓 객체에게 Receive 가 왔는지 계속해서 물어볼수 있을것이다. 이런 방법을 사용한다면 아주 비효율적인 방법이 될것이다. 그렇다면 가장효과적인 방법은 무엇일까 ? 바로 클라소켓이 서버로 부터 데이타를 받았을때 클라로직에게 알려주는것이다.

이 부분을 어떻게 구현할지 잠깐 살펴보도록 하자

사용자 삽입 이미지

[그림2]


클라이언트 쪽만 살펴보도록 한다. 먼저 클라로직과 클라소켓이 통신을 할수 있는 템플릿 클래스를 하나 만든다. 그리고 클라소켓에게는 AddEventObj 를 통해 자신의 객체 정보를 준다. 그러면 클라소켓은 Receive 가 왔을때 템플릿 클래스의 Receive 메소드만 호출하면 클라로직에 Receive 를 전달 할수 있다.

추상화를 많이 적용해보지 않았다면 이부분이 쉽게 이해가지 않을 것이다. 간단하게 샘플로 만들어 볼까 했는데 이놈의 귀차니즘이 ... (추후에 필요하다면 소스로 만들어서 추가 하겠다 ㅡㅡ)

% 참고로 이 부분을 C 형식으로 간단히 구현하고 싶으면 Callback 함수를 등록해서 사용하는 방법도 있을수 있다.

간략하게 DIP 에 대한 간략한 소개의 샘플을 만들어 봤다. 이런 객체 설계에 익숙해 지려면 많은 시간 꾸준히 패턴을 적용한 설계를 해봐야 할것 같다. 그러나 패턴을 적용하기 위한 설계 또한 상당히 위험하다.
그렇다고 아무것도 안하고 계속 현실에 안주 하기 보다 실패를 하더라도 무엇인가 시도해 보고 노력해야 할것이다.

아무것도 하지 않는다면 실패도 없지만 성공도 없다. (오늘 점심시간 만화에서 나온대사 이다. ㅡㅡ)
Posted by 상현달