Java/Spring

[Spring] 5. MVC 모델

Sigfriede 2023. 6. 15. 13:58

  MVC 모델이란 프로그램의 처리 역할을 나누어서 프로그램을 작성하는 방법입니다. 역할은 모델(Model: M), 뷰(View: V), 컨트롤러(Controller: C)의 세 종류로 분류합니다. 이렇게 분류함으로써 프로그램 독립성이 높아집니다. 역할 분담을 통해 효율적인 개발, 개발하는 엔지니어의 분업화가 용이, 설계 변경에 유연하게 대응 가능하다는 장점이 있습니다.

  모델은 비즈니스 로직(Business Logic)을 담당합니다. 컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체입니다.

  뷰는 사용자 입력과 결과 출력 등 시스템에서 표현 부분을 담당하며 웹 애플리케이션에서는 주로 화면을 담당합니다.

  컨트롤러는 서비스 처리를 담당하는 모델과 화면 표시를 담당하는 뷰를 제어하는 역할을 합니다. 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터는 데이터를 기준으로 모델에 내용을 전달합니다 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시하는 역할을 합니다.

  MVC 아키텍처는 보통 프런트 컨트롤러(front Controller) 패턴과 함께 사용됩니다. 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해 주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 등의 작업을 수행합니다.

 

이미지 출처: 위키백과, 모델-뷰-컨트롤러 항목

 

  스프링 MVC란 웹 애플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크입니다. 주요 기능으로 화면 전환이나 사용자가 사용하는 브라우저와 서버 간의 입출력 데이터 전달을 단순화하는 등의 기능이 있습니다. 스프링 서블릿/MVC의 핵심은 DispatcherServlet이라는 프런트 컨트롤러입니다. 이는 MVC 아키텍처로 구성된 프레젠테이션 계층을 만들 수 있도록 설계되어 있습니다. 다음은 스프링 MVC에서 요청에서 응답까지의 흐름입니다.

  1. 프런트 컨트롤러 DispatcherServlet이 클라이언트로부터 요청 수신
  2. DispatcherServlet이 컨트롤러의 요청 핸들러 메서드 호출
  3. 컨트롤러는 비즈니스 로직 처리 호출, 처리 결과 받음
  4. 처리 결과를 모델로 설정, 뷰 이름 반환
  5. 반환된 뷰 이름을 받아 DispatcherServlet이 뷰 이름에 대응하는 뷰에 대해 화면 표시 처리
  6. 클라이언트가 응답을 받고 브라우저에 화면 표시

 

  DispatcherServlet에 DI로 확장 가능한 전략이 있습니다. 내용은 다음과 같습니다.

이름 전략
Handler
Mapping
URL과 요청 정보를 기준으로 어떤 컨트롤러를 사용할 것인지 결정하는 로직을 담당
Handler
Adapter
핸들러 매핑으로 선택한 컨트롤러/핸들러를 DispatcherServlet이 호출할 때 사용하는 어댑터
Handler
Exception
Resolver
예외가 발생했을 때 이를 처리하는 로직
View
Resolver
컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오브젝트
Locale
Resolver
지역 정보를 결정해주는 전략
Theme
Resolver
테마 정보를 결정해주는 전략
Request
ToView
Name
Translator
컨트롤러에서 뷰 이름이나 뷰 오브젝트를 제공해주지 않았을 경우 자동으로 뷰 이름을 생성해주는 전략

 

  MVC 모델에서는 독립성과 확장성이 주요 키워드라고 생각합니다. 각각의 기능을 독립적으로 분리해 놓음으로써 설계 시 프로그램을 어떻게 확장시켜 나갈지 고민하면 좋을 것 같습니다.

  다만 MVC 모델에도 여러 한계가 있습니다. 응용 프로그램의 규모가 커질수록 각 요소 간 상호 작용과 의존성 관리가 복잡해지는 경우가 있습니다. 이는 지나치게 의존성을 띄게 된다든지, 유지 보수가 어려워진다는 결과로 이어질 수 있습니다.

 

  ※ "스프링 프레임워크 첫걸음"이라는 책을 참고하여 쓴 게시글로, 책의 내용을 완전히 담지 않되 공부한 부분을 위주로 정리하여 작성하고자 했습니다. 따라서 글에는 책에서 다루지 않은 내용도 포함되어 있으며 문제가 되거나 부정확한 부분이 있다면 알려주시면 감사하겠습니다.

  ※ 책은 게시글보다 정확한 내용을 담고 있으며 코드, 그림, 예제를 이용하여 개념을 자세히 설명합니다.