1강에서 문서/뷰 아키텍처를 이용해서 프로젝트를 생성했다.
따라서 우리의 프로젝트 내부에는 App, MainFrame, View, Document 4개의 코드가 존재한다.
SDI아키텍처의 가장 큰 목적은 Logic과 유저인터페이스의 분리이다.
유저인터페이스(UI)는 View코드에만 작성하고, 이 View코드에 표시되는 Data는 Document코드에서 작성한다.
예를들어서 메모장 프로그램을 생각해본다면 텍스트를 입력받고 삭제하고 수정하는 코드는 Document에서 소유하고
이런 작업들이 이루어지는 과정을 사용자에게 보여주는 코드는 View에 작성하게 되는 것이다.
메인프레임은 이를 위한 뼈대이고, App코드는 기본적인 초기화 과정과 SDI요소들을 이어서 문서템플릿으로
등록시켜주는 진입코드라고 보면 쉬울 것 같다.
각 요소의 역할을 설명해보자면
MfcApplication.cpp
-> 프로그램의 도입부를 담당하는 코드이다. InitInstance라는 코드를 override하여
프로그램 시작에 필요한 다양한 초기화기능을 수행한다.
EnableTaskbarInteraction, SetRegistryKey, LoadStdProfileSettings, InitKeyboardManager등 다양한 초기화를 수행하는데
이러한 코드들은 프로젝트 생성시에 자동으로 만들어지므로 특별한 경우가 아니라면 별로 건드릴 일이 없다.
중요한 점은 App코드에서 메인프레임, Document, View코드를 묶어서 문서 템플릿으로 등록하는 코드가 존재한다는 점이다.
MainFrm.cpp
-> 이코드는 프로그램의 뼈대가 되는 Frame을 정의해주는 코드이다.
우리의 프로그램은 View와 Model(로직)의 결합으로 이루어진다고 볼 수 있다.
최소화, 최대화, 닫기버튼, 메뉴바, 메뉴아이템, 작성된 View의 배치 등등 큰 그림을 그리기위한 도화지라고 볼 수 있다.
우리는 이 메인프레임 위에 각종 View와 위젯들을 올려놓아서 이 프로그램이 원하는 동작을 하게 만들것이다.
MainApplicationView.cpp
-> 사용자 인터페이스를 정의하고, Document의 데이터를 사용자에게 보여주는 역할을 하는 코드이다.
버튼이나 리스트뷰어, 콤보박스, 체크박스, 라디오버튼 등 위젯에 대한 정의와 이벤트를 정의한다.
하지만 이곳에서 직접적으로 로직을 구현하지는 않는다.
버튼을 눌렀을때 A라는 알고리즘을 수행해줘~라는 요청을 Document에 전달할 뿐 구체적인 알고리즘을
이 곳에 작성하지는 않도록 유의하자.
탭을 이동하거나 마우스이동, 휠이벤트등으로 인해 Document의 데이터가 UI에 표시되어야 한다면,
UI에 무언가를 표시하는 View를 위한 로직만 이 코드에서 구현되야 한다. Data를 직접수정하지는 않아야한다.
MainApplicationDoc.cpp
-> 앞에서 설명했던 것 처럼 Data의 소유 및 수정을 관리하는 코드이다.
프로그램에서 핵심이 되는 데이터들을 소유하며 View로부터 요청을 받으면 데이터를 불러오거나 수정하는 알고리즘을
수행한다. 이때 View에서는 Document의 데이터값을 참조해서 UI를 업데이트하는 작업을 수행하게된다.
예를들면 .csv파일에서 student의 List를 읽어오면 이를 Document에 저장한다. 읽어 온 데이터가 어떤것들이 있는지
UI에 표시해야 하는데 이는 View에서 Document의 값을 읽어서 UI에 반영해야한다.
구조적으로 C#의 MVVM패턴이나 MVC패턴과 유사한 목적을 가지고있는 구조라고 볼 수 있다.
앞으로 이러한 규칙들을 준수하며 간단한 Data를 Save, Load하는 MFC 프로그램을 만들어 볼 것이다.