MVC 디자인패턴

ww_ung·2025년 4월 5일

CS정리 & 기술면접

목록 보기
7/10

MVC패턴은 애플리케이션을 Model, View, Controller의 세가지 역할로 나누어 설계하는 구조 이다.

스프링에서 가장 기본이 되는 구조로 웹 애플리케이션을 개발할 때 유지보수성과 확장성을 높이기 위해 사용하는 중요한 아키텍처라고 할 수 있다.
즉, 사용자(Client)가 API를 기반으로 요청을 처리하고 반환하는 전체적인 동작 방식을 스프링 웹 MVC 또는 스프링 MVC라고 한다.

지금부터 MVC 디자인 패턴에 대해 알아보고자 한다.

Model(모델)

데이터와 비즈니스 로직을 담당하는 부분으로
DB와 연결되어 데이터를 저장하거나 불러오는 역할을 담당한다.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String email;
}

View(뷰)

사용자에게 보여지는 화면(UI)를 담당한다
HTML,JSP,JSON등으로 표현하며, Model의 데이터를 기반으로 화면을 구성합니다.

<!-- Thymeleaf 예시 -->
<p>회원 이름: <span th:text="${member.name}"></span></p>

Controller(컨트롤러)

사용자의 요청을 받아 처리하고, 적절한 응답을 반환한다.
Model과 View 사이를 연결하며
주로 사용자의 입력을 받고 비즈니스 로직 호출 후 결과를 전달한다(Mapping)

@Controller
public class MemberController {
    
    @GetMapping("/members/new")
    public String createForm(Model model) {
        model.addAttribute("memberForm", new MemberForm());
        return "members/createMemberForm";
    }
}

흐름 구조 (요청 -> 응답)

[사용자 브라우저]
     |
     | 요청 (예: /members/new)
     ↓
[Controller]
     |
     | 비즈니스 로직 호출
     ↓
  [Model]
     |
     | 처리된 데이터 전달
     ↓
  [View]
     |
     | HTML 생성
     ↓
[사용자에게 응답]

스프링으로 백엔드를 구현하다 보면 이보다 더 복잡한 흐름도 있지만,
이 기본 구조는 대부분의 웹 애플리케이션에서 유지된다.

  1. 사용자에게 회원가입 폼을 보여주는 화면 요청을 실시한다 (/members/new)
  • 회원가입 폼 조회(GET)
  1. MemberController가 요청을 받아 처리한다
  • 회원가입 폼을 화면에 출력한다(@GetMapping("/members/new")
  • 이 단계에서는 아직 아무 데이터도 저장되지 않는다
  1. 사용자가 폼을 작성하고 "회원가입" 버튼을 클릭한다
  • 이름,이메일,비밀번호 등을 입력하고 제출한다(HTTP POST 요청 발생)
  1. MemberController가 POST 요청을 처리한다
  • @PostMapping("/members") 메서드가 호출된다.
  • 폼 데이터가 @ModelAttribute를 통해 자동으로 MemberForm 객체에 바인딩된다.
  1. MemberService에서 저장 로직을 처리한다.
  • 비즈니스 로직을 처리하는 서비스 계층이다.
  • DB 중복 회우너 처리 체크 등의 비즈니스 로직을 수행한다.
  1. MemberRepository가 DB에 저장
  • 데이터 접근을 담당하는 계층이다(JPA, JDBC)
  • 실제로 데이터를 DB 또는 메모리에 저장하는 역할이다.
  1. 저장 완료 후 View로 응답
  • 회원가입 성공 시, 홈 화면이나 회원목록페이지 등으로 연결해준다.

그럼 무슨 기능이 MVC?

Model

핵심 데이터 및 비즈니스 로직을 담당
구성 요소:

  • Member (도메인 객체)
  • MemberForm (DTO)
  • MemberService (중복 검사 및 저장 로직)
  • MemberRepository (DB 저장 및 조회)

즉, 회원 데이터를 다루는 모든 코드, 저장, 검증 로직을 모델이라고 할 수 있다.

View

사용자에게 보여지는 화면(UI)을 담당
구성 요소:

  • 회원가입 폼 페이지 (createMemberForm.html)
  • 회원가입 성공 후 이동할 HTML 페이지 등

즉, 사용자가 실제로 보는 웹페이지를 뷰라고 할 수 있다.

Controller

사용자 요청을 받고 처리 결과를 View에 전달
구성 요소:

  • MemberController 클래스
  • @GetMapping, @PostMapping 등 요청 매핑 메서드

즉, 요청을 받고 모델을 호출하고, 결과를 뷰로 넘겨주는 연결 역할을 담당한다고 할 수 있다.

장점

MVC가 각각의 기능이 명확하게 나눠지므로 유지보수성과 가독성이 향상된다.
-> 수정할 때 해당 역할만 수정하면 되므로!
개발 분업에서 유리하다.
-> MVC로 나누어서 개발을 할 수 있기에 여러 개발자가 역할을 분담해서 진행할 수 있다.
코드의 재사용성 향상
-> View만 바꿔서 같은 Model 데이터를 다양한 방식으로 출력이 가능하다
유연한 확장성
-> 새로운 기능 추가 시 구조 변경 없이 Controller만 추가하면 된다.

단점

복잡성
-> 기능이 많아지고 많은 URL요청이 한 컨트롤러에 몰릴 경우, 코드가 복잡해진다.
흐름을 따라가기 어려움
-> 작은 규모의 프로젝트에서도 많은 흐름이 존재하므로 이해하기 어려울 수 있다.

0개의 댓글