패턴 섞어쓰기
- 여러 패턴을 함꼐 사용해서 다양한 디자인 문제를 해결하는 방법을 복합 패턴이라고 부릅니다. 패턴으로 이루어진 패턴인 셈이죠.
- 패턴 몇 개를 결합한다고 해서 무조건 복합 패턴이 되는 것은 아닙니다. 복합 패턴이라고 불리려면 여러 가지 문제의 일반적인 해결법을 제시해야 합니다. 여러 복합 패턴을 먼저 살펴본 다음에 복합 패턴의 왕이라고 할 수 있는 모델-뷰-컨트롤러(MVC)를 알아보겠습니다.
- 하나의 디자인 문제를 해결하려고 여러 패턴을 함께 사용하는 경우가 종종 있습니다. 복합 패턴이란 반복적으로 생길 수 있는 일반적인 문제를 해결하는 용도로 2개 이상의 패턴을 결합해서 사용하는 것을 뜻합니다.
모델-뷰-컨트롤러 조금 더 알아보기
- 뷰
- 모델을 표현하는 방법을 제공합니다. 일반적으로 화면에 표시할 떄 필요한 상태와 데이터는 모델에서 직접 가져옵니다.
- 컨트롤러
- 사용자로부터 입력을 받으며 입력받은 내용이 모델에게 어떤 의미가 있는지 파악합니다.
- 모델
- 모델에는 모든 데이터, 상태와 애플리케이션 로직이 들어있습니다. 뷰와 컨트롤러에서 모델의 상태를 조작하거나 가져올 때 필요한 인터페이스를 제공하고, 모델이 자신의 상태 변화를 옵저버들에게 연락해주긴 하지만, 기본적으로 모델이느 뷰와 컨트롤러에 별 관심이 없습니다.
- 특징
- 사용자는 뷰에만 접속할 수 있습니다.
- 뷰는 모델을 보여주는 창이라고 할 수 있습니다. 사용자가 뷰에서 (재생 버튼을 누른다거나 하는 식으로) 뭔가를 하면 뷰는 무슨 일이 일어났는지 컨트롤러에게 알려 줍니다. 그러면 컨트롤러가 상황에 맞게 작업을 처리합니다.
- 컨트롤러가 모델에게 상태를 변경하라고 요청합니다.
- 컨트롤러는 사용자의 행동을 받아서 해석합니다. 사용자가 버튼을 클릭하면 컨트롤러 그것이 무엇을 의미하는지 해석하고, 모델을 어떤 식으로 조작해야 하는지 결정합니다.
- 컨트롤러가 뷰를 변경해 달라고 요청할 수도 있습니다.
- 컨트롤러는 뷰로부터 어떤 행동을 받았을 때, 그 행동의 결과로 뷰에게 뭔가를 바꿔 달라고 할 수도 있습니다. 예를 들어, 컨트롤러는 인터페이스에 있는 어떤 버튼이나 메뉴를 활성화하거나 비활성화 할 수 있습니다.
- 상태가 변경되면 모델이 뷰에게 그 사실을 알립니다.
- 사용자가 한 행동(버튼 클릭 등)이나 다른 내부적인 변화(재생목록에서 다음 곡이 재생되는 것 등)등으로 모델에서 뭔가를 바뀌면 모델은 뷰에게 상태가 변경되었다고 알립니다.
- 뷰가 모델에게 상태를 요청합니다.
- 뷰는 화면에 표시할 상태를 모델로부터 직접 가져옵니다. 예를 들어, 모델이 뷰에게 새로운 곡이 재생되었다고 알려 주면 뷰는 모델에게 곡 제목을 요청하고, 그것을 받아서 화면에 표시합니다. 컨트롤러가 뷰에게 뭔가를 바꾸라고 요청을 했을 때도 뷰는 모델에게 상태를 알려달라고 요청할 수도 있겠죠.
모델-뷰-컨트롤러에 사용되는 패턴 알아보기
- 모델은 옵저버 패턴을 써서 상태가 바뀔 때마다 뷰와 컨트롤러에게 연락합니다. 뷰와 컨트롤러는 전략 패턴을 사용하죠. 컨트롤러는 뷰의 행동에 해당하며, 다른 행동이 필요하면 그냥 다른 컨트롤러로 바뀌면 됩니다. 그리고 뷰 안에는 내부적으로 컴포지트 패턴을 써서 윈도우, 버튼 같은 다양한 구성 요소를 관리합니다.
- 컴포지트 패턴 - 뷰
- 디스플레이는 여러 단계로 겹쳐 있는 윈도우, 패턴, 버튼, 텍스트 레이블 등으로 구성됩니다. 각 디스플레이 항목은 복잡 객체(윈도우 등)나 잎(버튼)이 될 수 있습니다. 컨트롤러가 뷰에게 화면을 갱신해 달라고 요청하면 최상위 뷰 구성 요소에게만 화면을 갱신하라고 얘기하면 됩니다. 나머지는 컴포지트 패턴이 알아서 처리해주죠.
- 전략 패턴 - 컨트롤러
- 뷰와 컨트롤러는 고전적인 전략 패턴으로 구현되어 있습니다. 뷰 객체를 여러 전략을 써서 설정할 수 있죠. 컨트롤러가 전략을 제공하고요. 뷰는 애플리케이션의 겉모습에만 신경을 쓰고, 인터페이스의 행동을 결정하는 일은 모두 컨트롤러에게 맡깁니다. 전략 패턴을 사용하면 뷰를 모델로부터 분리하는 데에도 도움이 됩니다. 사용자가 요청한 내역을 처리하려고 모델과 얘기하는 일을 컨트롤러가 맡고 있으니까요. 뷰는 그 방법을 전혀 알지 못합니다.
- 옵저버 패턴
- 모델은 옵저버 패턴을 써서 상태가 변경되었을 때 그 모델과 연관된 객체들에게 연락합니다. 옵저버 패턴을 사용하면 모델을 뷰와 컨트롤러로부터 완전히 독립시킬 수 있습니다. 한 모델에서 서로 다른 뷰를 사용할 수도 있고, 심지어 여러 개의 뷰를 동시에 사용하는 것도 가능합니다.
Summary
- 모델-뷰-컨트롤러(MVC)는 옵저버, 전략, 컴포지트 패턴으로 이루어진 복합 패턴입니다.