Spring 스프링 MVC (Model-View-Controller) 개념 정리

개발일지

이번 개발일지에서는 스프링 MVC, 즉 Model-View-Controller 패턴에 대해 간략하게 정리하고자 합니다. MVC 패턴은 웹 애플리케이션을 개발할 때 널리 사용되는 구조적 패러다임으로, 애플리케이션을 세 가지 주요 구성 요소, 즉 모델(Model), 뷰(View), 컨트롤러(Controller)로 분리하는 것을 중심으로 합니다.

모델은 애플리케이션의 데이터와 비즈니스 로직을 담당하며, 뷰는 사용자에게 보여지는 UI 부분을 처리합니다. 컨트롤러는 사용자의 입력과 시스템의 출력을 연결하는 역할을 하며, 모델과 뷰 사이에서 조정자의 역할을 합니다. 이 세 부분의 분리는 유지 보수성, 확장성 및 테스트 용이성을 향상시킵니다.

실제 프로젝트에 스프링 MVC를 적용하면서, MVC 패턴의 흐름과 각 구성 요소의 상호 작용에 대한 이해를 깊이 있게 다져가고 있습니다. 또한, 실제 적용을 통해 나타나는 다양한 문제 상황들을 해결함으로써, 이론적 지식과 실용적 기술을 동시에 강화하는 기회가 되고 있습니다.

이러한 학습과 경험은 앞으로의 개발 과정에 있어 중요한 밑거름이 될 것이며, 스프링 MVC의 깊은 이해는더욱 견고하고 효율적인 웹 애플리케이션을 구축하는 데 큰 역할이 될 것 입니다.

스프링 MVC 란?

스프링 MVC(Model-View-Controller) 패턴은 웹 애플리케이션의 구조를 체계화하기 위해 사용되는 디자인 패턴입니다. 이 패턴은 애플리케이션을 세 가지 주요 구성 요소, 즉 모델(Model), 뷰(View), 컨트롤러(Controller)로 분리합니다. 이러한 분리는 개발과정의 복잡성을 줄이고, 애플리케이션의 확장성, 유지 보수성을 높이는 데 도움이 됩니다.

모델(Model)

모델은 애플리케이션의 데이터와 비즈니스 로직을 나타냅니다. 이는 사용자의 데이터, 데이터 처리 로직, 그리고 데이터를 저장하고 관리하는 로직을 포함합니다. 스프링 MVC에서 모델은 데이터를 저장하고, 변형하며, 데이터에 관한 로직을 수행하는 역할을 합니다.

  • 데이터 저장 및 관리: 모델은 예를 들어 사용자 정보, 주문 내역과 같은 데이터를 저장합니다. 이 데이터는 데이터베이스, 파일 시스템, 메모리 등 다양한 방법으로 저장될 수 있습니다.
  • 비즈니스 로직: 데이터를 처리하는 규칙이나 계산 로직이 포함됩니다. 예를 들면, 주문의 총액을 계산하거나 사용자의 유효성을 검사하는 로직 등이 있습니다.
  • 데이터 접근 객체(Data Access Object, DAO): 데이터베이스나 다른 저장 시스템과의 상호작용을 담당합니다. CRUD(Create, Read, Update, Delete) 작업을 수행하는 메서드를 제공합니다.

뷰(View)

뷰는 사용자에게 정보를 시각적으로 표현하는 부분입니다. 스프링 MVC에서 뷰는 주로 JSP, Thymeleaf와 같은 템플릿을 사용하여 HTML을 생성합니다. 뷰는 모델이 제공하는 데이터를 기반으로 사용자 인터페이스를 구성합니다.

  • 사용자 인터페이스: 사용자가 볼 수 있는 페이지를 생성합니다. 이 페이지는 사용자의 요청에 따라 동적으로 내용이 바뀔 수 있습니다.
  • 프레젠테이션 로직: 화면에 표시되는 데이터 형식을 처리합니다. 예를 들어, 날짜 형식을 지정하거나 목록을 페이징하는 기능이 있습니다.
  • 데이터 표시: 모델로부터 받은 데이터를 사용자에게 보여주는 방식을 정의합니다. 예를 들어, 데이터베이스에서 조회한 상품 목록을 웹 페이지에 표시합니다.

컨트롤러(Controller)

컨트롤러는 사용자의 입력을 처리하고, 모델을 업데이트하며, 적절한 뷰를 선택합니다. 사용자의 요청을 받아서 그 요청에 맞는 처리를 수행하고, 결과를 모델에 반영한 후, 표시할 뷰를 결정합니다.

  • 요청 처리: 사용자의 요청을 받아들이고 이해합니다. 예를 들어, 웹 폼의 데이터를 받거나, 특정 URL로의 요청을 처리합니다.
  • 모델 조작: 사용자의 요청에 따라 모델의 상태를 변경합니다. 예를 들어, 새로운 주문을 생성하거나, 사용자 정보를 업데이트합니다.
  • 뷰 선택: 처리 결과를 표시할 뷰를 결정합니다. 예를 들어, 데이터 처리가 성공했을 때와 실패했을 때를 다르게 표시할 수 있습니다.
  • 요청 경로 매핑: URL 요청을 특정 컨트롤러 메서드에 매핑합니다. @RequestMapping 같은 어노테이션을 사용하여 이를 구현합니다.

스프링 MVC 구조

스프링 프레임워크의 MVC 아키텍처는 웹 애플리케이션 개발을 위한 유연한 구조를 제공합니다. 이 아키텍처는 여러 중요한 구성 요소들로 이루어져 있으며, 각각의 역할과 상호작용이 애플리케이션의 효율성과 유지보수성을 크게 향상시킵니다.

  1. DispatcherServlet
    • 역할: 스프링 MVC의 중심 컴포넌트로, 모든 HTTP 요청을 받아 처리하는 프론트 컨트롤러입니다. 모든 요청을 적절한 핸들러(컨트롤러)에게 전달하고, 핸들러의 실행 결과를 받아 적절한 뷰로 보내 렌더링할 수 있도록 합니다.
    • 작동 방식: web.xml 또는 자바 기반의 설정을 통해 구성되며, HTTP 요청을 수신하고, 해당 요청을 처리할 핸들러와 뷰를 결정하는 중추적인 역할을 수행합니다.
  2. HandlerMapping
    • 역할: HTTP 요청(URL, HTTP 메소드 등)을 처리할 컨트롤러의 메소드에 매핑합니다.
    • 작동 방식: URL 패턴과 컨트롤러 메소드 사이의 매핑을 정의하고, DispatcherServlet에 의해 요청이 들어올 때 적절한 컨트롤러를 찾는 데 사용됩니다.
  3. Controller
    • 역할: HTTP 요청을 처리하는 구체적인 비즈니스 로직을 담당합니다. 클라이언트의 요청에 대해 어떤 처리를 할지, 그리고 어떤 응답을 반환할지 결정합니다.
    • 작동 방식: @Controller 어노테이션을 사용해 선언되며, @RequestMapping을 통해 특정 URL에 대응하는 메소드를 정의합니다.
  4. Model
    • 역할: 뷰에 전달할 데이터를 포함합니다. 컨트롤러가 처리한 결과를 저장하며, 뷰가 이 데이터를 사용하여 사용자에게 정보를 표시합니다.
    • 작동 방식: 주로 메소드의 매개변수로 전달되며, 컨트롤러 내에서 데이터를 추가하거나 수정합니다.
  5. View
    • 역할: 최종적으로 사용자에게 보여질 UI를 렌더링합니다. 데이터 표시 방법을 정의하며, 주로 HTML, JSON, XML 형태로 결과를 제공합니다.
    • 작동 방식: JSP, Thymeleaf 등 다양한 뷰 기술을 사용할 수 있으며, 컨트롤러에서 반환한 모델 데이터를 기반으로 사용자 응답을 생성합니다.
  6. ModelAndView
    • 역할: 컨트롤러가 처리 결과와 함께 반환하는 객체로, 모델 데이터와 뷰의 이름을 포함합니다.
    • 작동 방식: 컨트롤러는 이 객체를 사용하여 데이터와 뷰 정보를 DispatcherServlet에 전달하며, DispatcherServlet은 이 정보를 사용하여 최종 응답을 생성합니다.
  7. ViewResolver
    • 역할: 컨트롤러가 반환한 뷰 이름을 바탕으로 실제 뷰 객체를 찾아 반환합니다.
    • 작동 방식: 뷰 이름에 해당하는 실제 뷰 템플릿 파일을 찾아, 렌더링을 위한 뷰 객체를 DispatcherServlet에게 제공합니다.
  8. HandlerAdapter
    • 역할: DispatcherServlet과 실제 컨트롤러 사이의 중계자 역할을 합니다. 컨트롤러의 메소드를 호출하고, 결과를 DispatcherServlet에게 반환합니다.
    • 작동 방식: 다양한 종류의 컨트롤러를 지원하기 위해, 적절한 컨트롤러 메소드를 실행하고 그 결과를 처리합니다.
  9. Interceptors
    • 역할: 요청을 처리하기 전후에 추가적인 작업을 수행할 수 있도록 합니다. 로깅, 인증, 권한 체크 등의 기능을 구현할 때 사용됩니다.
    • 작동 방식: 컨트롤러가 호출되기 전, 후, 완료 후에 특정 작업을 수행할 수 있습니다.
  10. Exception Handler
    • 역할: 애플리케이션에서 발생하는 예외를 처리합니다. 특정 예외에 대한 사용자 정의 응답을 제공할 수 있습니다.
    • 작동 방식: @ExceptionHandler 어노테이션을 사용하여 예외를 처리하는 메소드를 정의할 수 있으며, 이를 통해 오류 발생 시 적절한 응답을 반환합니다.

스프링 MVC 수행과정

스프링 MVC 프로세스는 클라이언트로부터 HTTP 요청이 시작되어, 서버 내에서 여러 컴포넌트를 거쳐 응답으로 완료되는 일련의 단계들로 구성됩니다.

  1. 클라이언트의 요청
    • 웹 애플리케이션의 상호작용은 클라이언트(보통 웹 브라우저)가 서버에 HTTP 요청을 보내면서 시작됩니다. 이 요청은 특정 URL을 호출하고, 필요한 경우 데이터(예: 폼 데이터)를 포함할 수 있습니다.
  2. DispatcherServlet의 수신
    • 스프링 MVC에서는 DispatcherServlet이 모든 HTTP 요청의 진입점 역할을 합니다. DispatcherServlet은 프론트 컨트롤러 패턴을 구현하며, 모든 요청을 받아 적절한 처리기에 전달하는 중앙 집중식 핸들러입니다.
  3. Handler Mapping
    • DispatcherServlet은 HandlerMapping을 사용하여 요청 URL을 처리할 적절한 컨트롤러를 찾습니다. 각 요청 URL은 특정 컨트롤러의 메소드와 매핑됩니다. 이 매핑은 컨트롤러에서 @RequestMapping과 같은 어노테이션을 사용하여 정의됩니다.
  4. 컨트롤러의 처리
    • 적절한 컨트롤러가 결정되면, DispatcherServlet은 요청을 해당 컨트롤러의 메소드로 전달합니다. 컨트롤러는 요청 데이터를 처리하고, 비즈니스 로직을 수행하며, 모델 객체를 업데이트합니다. 이 과정은 데이터베이스 조작, 유효성 검사, 비즈니스 규칙의 적용 등을 포함할 수 있습니다.
  5. 모델과 뷰의 결정
    • 처리가 완료되면, 컨트롤러는 모델 데이터(처리 결과)와 함께 뷰 이름을 DispatcherServlet에 반환합니다. 이 정보는 ModelAndView 객체에 포함됩니다.
  6. View Resolver
    • DispatcherServlet은 반환된 뷰 이름을 ViewResolver에 전달합니다. ViewResolver는 이 이름을 사용하여 실제 뷰 객체를 결정합니다. 이 뷰 객체는 JSP, Thymeleaf 등 다양한 템플릿을 사용할 수 있습니다.
  7. 뷰의 렌더링
    • 뷰 객체는 모델 데이터를 사용하여 최종 사용자 응답을 생성합니다. 이 과정에서 뷰는 모델 데이터를 화면에 표시하기 위해 HTML, JSON, XML 등의 형식으로 렌더링합니다.
  8. 클라이언트에 대한 응답 전송
    • 뷰가 렌더링을 완료하면, 생성된 응답이 클라이언트로 전송됩니다. 이렇게 클라이언트는 요청한 정보나 처리 결과를 시각적 형태로 받게 됩니다.

마무리

스프링 MVC는 웹 애플리케이션을 구성하는 모델, 뷰, 컨트롤러의 세 주요 요소를 통합하는 프레임워크입니다. 모델은 데이터와 비즈니스 로직을 처리하고, 뷰는 사용자 인터페이스를 제공하며, 컨트롤러는 두 부분을 연결합니다. 사용자의 요청은 DispatcherServlet을 통해 들어와 적절한 컨트롤러에 전달되고, 컨트롤러는 모델을 업데이트하고 결과를 뷰로 보냅니다. 이러한 구조는 애플리케이션의 유지보수와 확장을 용이하게 하여 효과적인 웹 개발을 가능하게 합니다.

Leave a Comment