블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
01.C#기초 (4)
02.C#고급 (13)
03.ASP.NET (28)
04.HTML&Script (17)
05.Silverlight (38)
06.C 언어 기초 (2)
07.iOS (14)
08.Java (5)
09.SQL (8)
10.컴퓨터보안 (10)
11.패턴이야기 (3)
12.유니티3D (1)
13.Ubuntu (7)
14.Node.js (6)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday

'프로그래밍/11.패턴이야기'에 해당되는 글 3건

  1. 2011.10.25 MVP(Model-View-Presenter) Pattern 2
  2. 2011.10.23 옵저버 패턴(Observer pattern)
  3. 2011.03.18 [ C# ] 싱글톤 패턴 (Singleton Pattern)




 오랜만에 윈폼(WinForm)프로젝트를 하면서, 사용한 설계패턴이다. MVP(Model-View-Presenter) 패턴이 생소 했는데, 익숙해 지니깐 여러므로 편하고, 관리하기 쉬웠다. 그럼 MVP 패턴에 대해 간단하게 정리 하도록 하겠다. 


 MVP 패턴은 1990년대 초기에 등장한 패턴으로 마이크로소프트가 사용해 가장 많이 알려진 패턴으로, 이 패턴은 MVC(Model-View-Controller)패턴을 기반을 둔 GUI(Graphical User Interface)를 만들기 위한 설계패턴이다. 즉, MVC 패턴의 여러 패턴 중 하나이다.
( 참고 : MVC 패턴은 너무나 잘 알려진 설계패턴으로 1979년에 제록스 팰러앨토 연구소에서 스몰토크 관련 일을 하던 Trygve Reenskaug에 의해 처음 설명되었으며, 아직까지도 가광을 받고 있는 패턴이다.)

 MVP 패턴은 View와 Model 간의 결합도를 낮추는데 있으며, Presenter는 Model의 데이터를 View에 출력할 수 있도록 할 뿐만 아니라, 이벤트(Event)를 View에서 받아 Model의 데이터를 갱신하도록 한다. 실제 구현에서는 Presenter는 View와의 결합도를 감소 시키기 위해서, Interface를 참조한다. 이를 통해 Presenter는 View의 실제 UI요소가 어떻게 구현되는지에 관계없이 데이터를 올바르게 표현 하도록 하는 것 이다. 아래 그림을 참고하면 이해가 쉬울 것이다.


 View  View Interface의 Display 맴버(Properties, Display Methods)를 구현하여 실제적인 UI요소를 그려준다.
 View Interface  Presenter에서 Concrete View를 지접 참조하지 않고 View Interface를 참조함으로써 Concrete View와의 커플링을 감소시키고, View의 실제 UI 요소가 어떻게 구현되는지 몰라도 데이터를 올바르게 표현할 수 있도록 해준다.
 Presenter  View와 Model간의 상호작용을 담당하며, Model의 데이터를 View Interface를 통해 Concrete View에 출력(바인딩)해주고, 사용자의 이벤트를 View에서 구독하여(실제적인 이벤트 핸들러 구현) Model의 데이터를 갱신하는 역할을 수행한다. Presenter를 통해 View와 Model간의 의존관계를 없앨 수 있다.
 Model  데이터와 상태를 유지하며, 데이터 처리 로직을 포함한다.

예제 코드는 첨부된 파일을 확인하면 되겠다.


위 그림은 샘플프로젝트의 구성인데, 크게 MultiLayer폴더와 SingleLayer폴더가 보일 것 이다. 이는 MVP 패턴을 멀티/싱로 해서 두개의 샘플을 구성한 것이다. 그리니 스타트 프로젝트를 happydong.SingleLayer.MVP 또는 happydong.MVP.View로 잡아서 실행 시켜보면 될 것이다.

Posted by happydong
, |





 
옵저버 패턴(Observer pattern) 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락을 주고, 자동으로 해당 객체들의 내용이 갱신이 되도록 하는 방식으로 일대다(ont-to-many) 의존성을 정의 한다. 일반적으로 분산 이벤트 처리를 목적으로 많이 사용한다고 한다. 아래는 예제로 보여줄 옵저버 패턴의 클래스 다이어그램(Class diagram)과 프로젝트 파일들을 나타낸 것이다.
(참고로 현재 예제코드는 윈품(WinForm)프로젝트로 만들어 보았다. )


 위 그림에 보면, 3개의 인터페이스(Interface)가 있고, 이 인터페이스 상속받아 구현한 객체가 있다. 좀더 자세히 보면 CountObserverCenter라는 녀석은 IObserverCenter 인터페이스를 상속 받아 구현되었다. 그리고 Screen1, Screen2는 IScreen 인터페이스를 상속받아 구현되었으며, IObserver 인터페이스를 상속 받아 구현되었다. (C#에서는 인터페이스 다중 상속이 된다는 걸 알고 있을 것이다.) Screen1과 Screen2는 UserControl이다. 그럼 각각의 객체의 역활및 소스코드에 대해서 알아 보도록 하겠다.

1. IObserverCenter와 CountObserverCenter

 - IObserverCenter는 Observer들의 추가, 삭제, 알림 기능을 할 수 있는 인터페이스만 정의 되어 있다.



 - CountObserverCenter는 IObserverCenter 인터페이스를 상속받았으므로, 추가,삭제, 알림 기능을 하는 메소드를 구현해 준다. 즉, 실질적으로 작동이 되도록 정의하는 것이다. CountObserverCenter의 역활은 특정 액션이 전달되면 각각의 Observer들에게 카운트를 증가시키라는 알림을 알려주는 역활을 하는데, 이는 _count와 _observerLIst 맴버를 이용하게 된다. 아래 소스를 보면 이해하기 쉬울 것이다.



2. IObserver와 IScreen 그리고 Screen1,Screen2

 - IObserver는 옵져버 센터에서 연락을 받을 수 있는 인터페이스만 정의 되어 있다. 다시말해 NotifyAction메소드를 통해서 알람 내용을 정의 할수 있는 것이다.



 - IScreen은 Screen1,Screen2가 공통으로 정의될 내용의 인터페이스가 정의 되어 있다. UpdateScreen 메소드를 통해서 해당 Screen의 내용이 갱신되도록 정의한다.



 - Screen1과 Screen2는 UserControl로서 IOserver 인터페이스와 IScreen 인터페이스의 내용을 상속받아 동작 내용을 정의 한다. 즉, IOserver 인터페이스의 NotifyAction 메소드가 호출되었을 때 작동해야할 내용을 정의하며, IScreen 인터페이스의 UpdateScreen 메소드가 호출되었을 때 내용을 정의 한다. (코드 설명은 주석을 참고 하기 바란다.)




위 그림은 Screen1과 Screen2의 디자인 모습인데, 간단하다. Panel Control 위에 Label Control를 올려 놓은 것이다. 그리고 소스는 Screen1에 대해서만 올려 졌는데, 그 이유는 Screen2또한 같은 소스 코드기 때문에 생략 한 것 이다.

자 그럼 위 내용 처럼 ObserverCenter와 Obsever가 준비되 었다면, 메인 폼(Form)에서 내용을 정의하고 실행 시켜보도록 하겠다. 우선, 메인 폼에 대한 디자인 모습은 아래와 같다.



간단한 디자인이다. 샘플이므로... 버튼이 하나 올려져 있는데, 이 버튼을 클릭할때 마다 Screen1과 Screen2의 Count를 증가 시켜줄 것이다. 그리고 SplitContainer Control이 있는데, 이는 Screen1과 Screen2를 올려 놓을 컨테이너이다. 그럼 폼의 코드를 살펴 보자.



폼에서는 간략하게 생성자에서 유저컨트롤들의 인스턴스를 생성해서, 추가시켜주는 내용과 버튼 이벤트를 받아서 알림 액션을 처리하는 내용 뿐이다. 생성자에서 CountObserverCenter를 인스턴스로 생성을하고 Screen1과 Screen2의 파라미터로 넘겨 주는 데, CountObserverCenter는 참조타입(Reference type)이기 때문에 객체의 주소값이 넘어 가게 된다. 이를 Screen1,2에서 받아서 맴버로 가지고 있기때문에 알람 액션에 대한 내용 전달 받을 수 있고, 처리할수 있는 것 이다.

해당 예제소스는 첨부파일로 첨부되어 있다. 다운 받아 확인 할수 있을 것이다.

Posted by happydong
, |





 싱글톤 패턴하나의 클래스에서 오직 하나의 인스턴스만 생성되도록 보장하는 기법으로, 개발할때 가장 자주 쓰이는 패턴이 아닐까 싶다. 싱글톤 패턴의 사용 예를 들어 환경설정을 관리하는 클래스라든지, 커넥션 풀(Connection Pool), 스래드 풀(Thread Pool)과 같이 풀(Pool)형태로 관리되는 클래스를 하나의 인스턴스로 관리하는 것이 일반적인 싱글톤 패턴이다. 그럼 C#으로 싱글톤 패턴에 대해서 코드로 알아 보도록 하자!!



코드 설명
_instance맴버를 캠슐화해서 프로퍼티(Property) Get만 선언해서 맴버가 생성이 안되어 있다면, 초기 생성을 해서 인스턴스를 넘겨주고, 이미 인스턴스가 생겨 있다면 그냥 자체를 넘겨 주는 것 이다.

이 간단한 코드는 많은 프로젝트에서 가장 유용하고 많이 쓰이고 있는 코드가 아닐가 싶다.

Posted by happydong
, |