MVC 패턴이란?
MVC는 Model-View-Controller의 약자로, 애플리케이션을 세 가지 주요 구성 요소로 분리하는 소프트웨어 설계 패턴이다.
주로 웹 애플리케이션에서 사용되며, 코드의 역할을 명확히 나누고 유지보수와 확장성을 높이는 데 유리하다.
- Model(모델):
애플리케이션의 핵심 데이터와 비즈니스 로직을 담당한다. 예를 들어 게시판이라면, 게시글 데이터를 조회·저장·수정하는 로직이 모델에 속한다. - View(뷰):
사용자에게 보이는 UI 화면을 담당한다. HTML, JSP, Thymeleaf 같은 템플릿 엔진이 여기에 해당하며, 데이터를 시각적으로 보여주는 역할을 한다. - Controller(컨트롤러):
사용자의 요청을 받아 Model에게 전달하고, 처리 결과를 View로 연결해주는 중간 조율자 역할을 한다. 예를 들어 로그인 요청을 받으면, Controller는 Model에게 인증을 요청하고 결과에 따라 알맞은 화면(View)을 반환한다.
MVC 패턴의 흐름
[User]
↓
[Controller] → [Model] → DB
↓
[View] → 사용자에게 결과 표시
- 사용자가 브라우저에서 요청을 보낸다. (예: /login)
- Controller가 요청을 받아 적절한 Model에게 작업을 요청한다.
- Model은 로직을 수행하고 결과를 Controller에게 반환한다.
- Controller는 결과를 View에 전달하고, View는 사용자에게 화면을 출력한다.
MVC 패턴의 장점
- 역할의 명확한 분리
구성 요소의 책임이 명확하게 구분되어 있어 코드의 가독성이 높고, 유지보수가 쉬워진다.
화면(View)을 수정해도 핵심 로직(Model)은 영향을 받지 않고, 그 반대도 마찬가지이다. - 낮은 결합도와 높은 응집도
각 구성 요소는 서로 강하게 의존하지 않기 때문에, 독립적으로 개발·수정·테스트가 가능하다.
코드 재사용성과 유연성이 높아진다. - 모델 재사용 가능
하나의 Model을 여러 View에서 사용할 수 있어, 웹, 모바일, 관리자 페이지 등 다양한 환경에 적용 가능하다. - 협업에 유리함
프론트엔드는 View 중심으로, 백엔드는 Controller와 Model 중심으로 개발할 수 있어 업무 분담과 협업이 효율적이다.
MVC 패턴의 한계점
- 간단한 프로젝트에선 과한 구조가 될 수 있다
작은 규모의 기능이라도 Model, View, Controller로 나누어야 하므로
오히려 코드가 복잡해지고 초기 개발 속도를 떨어뜨릴 수 있다. - Controller 비대화 현상 (Massive Controller)
설계가 잘못되면 Controller에 여러 책임이 몰려서, 로직이 복잡해지고 유지보수가 어려워질 수 있다.
→ 일반적으로 Service 계층을 도입해 책임을 분산시킨다. - 완전한 역할 분리가 어려운 경우가 있다
현실적인 코드에서는 View에 일부 로직이 들어가거나,
Controller가 Model에 과하게 의존하는 등 구조가 흐트러질 수 있다. - 테스트 코드 작성의 어려움
Controller가 여러 책임을 가지면 단위 테스트가 어려워지고,
의존성 주입이나 계층 분리가 되어 있지 않으면 테스트 코드 작성이 번거로워진다. - Model과 View의 의존성을 완전히 분리하기 어렵다
실무에서는 View에서 Model 객체를 직접 참조하는 일이 많으며,
이로 인해 설계 원칙에서 말하는 '완전한 분리'가 잘 지켜지지 않을 수 있다.
MVC 패턴의 설계 원칙
MVC 패턴을 올바르게 사용하기 위해서는 다음과 같은 구조적 원칙을 지켜야 한다:
- Model은 Controller와 View에 의존하지 않아야 한다.
Model은 순수하게 데이터와 로직만 처리하는 계층이어야 하며, 다른 구성 요소에 의존하면 안 된다. - View는 Controller에 의존하면 안 되고, Model만 참조해야 한다.
View는 Model에서 데이터를 받아 표현하는 데 집중해야 하며, 로직은 Controller나 Model에 맡겨야 한다. - Controller는 Model과 View에 의존할 수 있다.
사용자의 입력을 처리하고, 로직을 호출하고, 그 결과를 View에 전달하는 책임을 가지므로, 양쪽에 접근이 가능해야 한다. - View가 데이터를 필요로 할 때는 Controller를 통해 Model에서 받아야 한다.
View는 직접 Model을 호출하지 않고, Controller가 필요한 데이터를 준비해 전달해야 한다. (→ 실무에서는 View가 Model을 직접 참조하는 경우도 있지만, 이상적인 구조는 Controller가 중간 다리 역할을 하는 것)
'개발자 면접 노트' 카테고리의 다른 글
| RESTful API 설계의 핵심 원칙 (0) | 2025.06.26 |
|---|---|
| HTTP 상태코드 (0) | 2025.06.25 |
| Kotlin과 같은 등급은 Java인가 Spring인가? (3) | 2025.06.25 |
| Spring - 의존성 주입(DI)의 종류 (0) | 2025.06.25 |
| Spring - 의존성 주입(DI) (0) | 2025.06.25 |