이번주에 나에게 주어진 미션은 [준비, 입력, 처리, 출력] 의 네 단계로 작업을 설계하는 것이다. 이전에는 생각 나는대로 코드를 막 써내려가서 나중에는 나도 내 코드를 알아보지 못할 지경이었다. 이번주에는 생각을 하면서 작업 프로세스에 맞게 코드를 쓰려 한다.
저번주에 딜리버리 타이쿤 퀘스트 과제를 하며 작성했던 코드를 다시 [준비, 입력, 처리, 출력] 의 네 단계에 맞게 나누고 정리해보았다. 코드의 before & after를 공개한다.
Before
- shuffleFoodList는 foodList를 shuffle해주는 메서드이다.
- 메서드의 기능에 맞지 않게 JLabel로 내용을 출력해주는 부분도 메서드에 포함되어 있다.
- foodList를 shuffle해서 처리해주는 부분만 shuffleFoodList 메서드에 남기고 출력해주는 부분은 따로 빼면 좋겠다고 생각했다.
After
- foodList를 shuffle해서 처리해주는 핵심 기능만 shuffleFoodList 메서드에 남기고 이를 JLabel로 출력해주는 부분은 따로 빼서 정리하였다.
적어도 기능과 UI를 한 메서드 내에서 처리하는 일은 절대 없어야 할 것 같다. 지난주 코드를 살펴보면 메서드 안에서 기능과 UI가 함께 구현된 부분들이 꽤 많다. 아주 어색하고 이상하다. 다 정리해서 분리하자.
기능과 UI를 따로 분리하는 것을 가리키는 용어가 있나 궁금해서 검색해보다가 모델-뷰-컨트롤러 라는 것을 알게 되었다. 아래에서 간단히 정리해보겠다.
모델 - 뷰 - 컨트롤러
- 모델-뷰-컨트롤러(model–view–controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다.
- 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다.
- MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.
구성요소
모델-뷰-컨트롤러는 응용 프로그램을 세 가지의 구성요소로 나눈다. 각각의 구성요소들 사이에는 다음과 같은 관계가 있다.
- 컨트롤러는 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다. (예: 워드 프로세서에서 문서를 편집하는 것) 또, 컨트롤러가 관련된 뷰에 명령을 보냄으로써 모델의 표시 방법을 바꿀 수 있다. (문서를 스크롤하는 것)
- 모델은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다. 이와 같은 통보를 통해서 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가·제거·수정할 수 있다. 어떤 MVC 구현에서는 통보 대신 뷰나 컨트롤러가 직접 모델의 상태를 읽어 오기도 한다.
- 뷰는 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 온다.