Cocoa에서 사용된 디자인 패턴
OSXDEV
상당히 무모한 생각이지만 코코아에 사용된 디자인 패턴을 빨리 훑고 넘어가보도록 하자. 이 부분들을 각각 따로 연재로 빼도 될만큼의 분량이지만 일단 한번 쭉 봐두면 뒤에 공부할 때 그래도 도움이 될것이라 생각한다.
목차 |
[편집] 3.1 Model-View-Control
Model-View-Controller(MVC) 패턴은 애플리케이션을 논리적으로 분리시키는 역할을 한다. 길게 설명할 필요가 없을 정도로 유명한 패턴인데 애플리케이션 제작을 위한 프래임 웍 가운데 코코아 프래임웍 만큼 MVC모델이 잘 잡혀있는것도 보기 쉽지 않을 것이다. MVC모델 자체가 스몰톡에서 나온것이고 Objective-C가 스몰톡을 계승한다고 이야기 하고 있기 때문에 실제 어떻게 작동되는지 유심히 봐둘 필요가 있다. 항상 하는 이야기지만 Microsoft의 MFC에 있는 Doc/View구조보다 훨씬 논리적이고 깔끔한 코딩을 도와준다.
예를 들면 MFC에서는 보이지 않는 컨트롤러를 명시적으로 만들어 줄 것을 요구한다. 이때까지 예제에서 자주 컨트롤러가 언급된 것도 그 이유에서이다.
인터페이스 빌더를 이용해서 윈도우 위에 뷰를 얹어 놓거나 컨트롤을 얹어 놓은 다음 그것을 컨트롤러에 연결했던 기억이 날 것이다. 그 뒷단에 모델을 코딩해 넣으면 깔끔한 MVC모델을 볼 수 있을 것이다.
디자인 패턴 책에서 구현 원리를 읽으면서 이해하는것도 중요하지만 코코아를 이용해서 직접 그 패턴을 적용시키면서 코딩을 해보면 더 확실하게 머리에 들어오고 다음에 다른 환경에서도 좋은 디자인을 이끌어 낼 수 있을것이라 생각한다.
[편집] 3.2 Target/action
타켓/액션 패턴 역시 뒤에 설명할 Notification 패턴과 같이 커플링을 막아주는 역할을 하지만 사용되는 범위가 조금 다르다. 이것은 주로 버튼 같은 위젯이나 메뉴아이템의 액션을 정해주므로서 커플링 되는것을 막아주는 역할을 한다. 이 패턴에서는 컨트롤들은 액션 메시지를 그들의 타겟으로 보내는 역할을 해주는데 그 타겟이 보통 컨트롤러 객체가 되어서 컨트롤러 객체의 특정 메소드가 불리는 것으로 처리되며 개발자는 컨트롤러 객체에 각각의 동작이 발생했을 때 어떻게 할것인지 코드로 작성해주면 된다.
이때 타겟은 컨트롤러 객체가 되고 액션은 어떤 메시지인지를 말하는 것이다.
[편집] 3.3 Responder chain
Responder chain 패턴은 이벤트 핸들링 시스템에 사용되는 디자인 패턴으로 여러 오브젝트에 이벤트를 처리할 수 있는 기회를 제공한다.
먼저 코코아에서 제공되는 기본적인 이벤트는 아래와 같다.
Mouse events
Keyboard events
Tracking rectangle and cursor-update events
Periodic events
AppKit-defined events
System-defined events
NSApplication-defined events
마우스나 키보드의 이벤트가 발생하면 MacOS X 윈도우 서버가 그것을 NSEvent라는 객체로 만든다. NSApplication객체는 이 NSEvent객체를 sendEvent:를 통해서 First Responder에게 보내고 First Responder가 이 이벤트를 Handle하지 않으면 nextResponder에게 전달한다. (NSView객체는 일반적으로 자신의 superview가 nextResponder가 된다.)이렇게 해서 responder chain에 속해있는 객체들은 그 우선순위(먼저 handle할 수 있는)에 따라 이벤트를 처리할 수 있는 기회를 가지게 된다.
[편집] 3.4 Delegation
Delegation 패턴에서는 delegate라고 불리는 어떤 오브젝트는 다른 오브젝트를 대신해서 동작한다. 즉 오브젝트에서 처리해야할 어떤 일을 다른 오브젝트로 위임한다고 생각하면 된다. 만일 특정 객체가 딜리게이트로 사용된다면 개발자는 불려질 메소드를 구현하기만 하면된다. 결국 딜리게이션은 기능 확장을 위해 객체를 상속할 필요를 최소화 시켜주는 역할을 한다.
[편집] 3.5 Notification
노티피케이션은 메시지를 보내는 쪽과 메시지를 받는 여러곳이 커플링되는것을 막아준다. 만일 노티피케이션 디자인 패턴을 사용하지 않으면 스파게티 코드가 될 확률이 많아질 것이다. 실제 사용은 파운데이션 프래임웍의 NSNotification을 참고하면 되겠다.
[편집] 3.6 Singleton
이 패턴 역시 매우 유명한 패턴으로 시스템 내에 단 하나의 오브젝트만 존재하게 하는 것이다. 싱글톤 메소드는 오브젝트 생성자로 만일 그 오브젝트가 이미 존재하고 있다면 새로 만들지 않고 그것을 돌려주게 되어있다.
[편집] 3.7 Key-value coding
Key-Value 코딩은 오브젝트의 속성을 접근하는데 이름을 이용해서 간접적으로 접근 할 수있게 해준다. Foundation Kit의 NSDictionary와 AppKit에서 Outlet이 Key-Value coding이 사용되었다.
이번 연재가 좀 광범위하고 난해할지도 모르겠다. 각각 매 회로 분류해야 할 내용을 쭉 훑으면서 지나가서 어렵게 느껴질 수도 있겠다.
하지만 지금 당장 무슨 뜻인지 파악이 되지 않더라도 코코아로 개발을 하다보면 어느순간 자연스럽게 받아들여질 문제들이라고 생각한다. 이로서 계획된 연재를 모두 끝내게 되는데 필자로서는 아쉬움이 많이 남는다.
생각보다 많지 않는 시간과 그리고 필자 스스로의 부족함으로 이야기 해야할 더 많은 부분들에 대해서 제대로 이야기 하지 못하고 지나가는것 같아서 안타까울 따름이다.
마지막으로 한번 더 당부하고 싶은 말은 이걸로 뭐 할만한게 없을 수도 있지만 한번쯤 접해보는것은 많은 도움이 될것이라 믿는다.
MVC Song




