MVC와 패턴 선택 연습
마지막으로 화면이 있는 작은 프로그램을 생각해 봅시다. MVC는 데이터와 업무 규칙, 표시, 사용자 입력 처리를 나누는 구조입니다. 앞에서 배운 객체 설계 패턴보다 더 넓은 범위의 역할 분리를 다룹니다.
세 역할을 구분합니다
- 모델: 값과 업무 규칙을 관리합니다. 화면이 없어도 규칙을 설명하고 실행할 수 있어야 합니다.
- 뷰: 모델의 상태를 사용자에게 보여 줍니다.
- 컨트롤러: 입력을 받아 적절한 모델 동작을 호출하고 흐름을 연결합니다.
class Counter:
def __init__(self):
self.value = 0
def increment(self):
if self.value >= 2:
return False
self.value += 1
return True
def show(model):
print(f"Count: {model.value}")
class Controller:
def __init__(self, model):
self.model = model
def on_increment(self):
if self.model.increment():
show(self.model)
else:
print("Limit reached")
controller = Controller(Counter())
for _ in range(3):
controller.on_increment()
출력은 Count: 1, Count: 2, Limit reached입니다. 최대 2까지라는 규칙은 모델에 있으므로 화면 문구를 바꾸어도 유지됩니다. 이 예제는 컨트롤러가 뷰를 직접 호출합니다. 다른 MVC 구현에서는 옵서버나 프레임워크가 갱신을 연결할 수 있으며, 모든 프레임워크가 같은 경계를 쓰지는 않습니다.
작은 프로젝트에 적용해 봅니다
독서 목록 앱을 만든다면 먼저 책 추가, 표시, 저장을 단순하게 구현하세요. 그다음 실제 변경 요구에 맞춰 판단합니다.
- 정렬 방법을 바꿔야 한다면 전략을 검토합니다.
- 여러 화면에 변경을 알려야 한다면 옵서버를 검토합니다.
- 외부 도서 API 형식이 맞지 않으면 어댑터를 검토합니다.
- 삭제 되돌리기가 필요하면 커맨드와 작업 기록을 검토합니다.
패턴을 많이 썼다는 사실이 좋은 설계를 보장하지는 않습니다. 바뀌는 부분이 명확하고, 읽는 사람이 동작을 따라가기 쉬운지가 더 중요합니다.
확인 문제
최대 개수 제한을 버튼의 비활성화로만 구현하면 어떤 문제가 있을까요?
해설 보기
다른 화면이나 API가 모델을 직접 호출하면 제한을 건너뛸 수 있습니다. 화면은 입력을 안내하고, 핵심 규칙은 모델에서도 지켜야 합니다. 같은 규칙을 여러 화면에 흩어 놓지 않는 것이 핵심입니다.