스프링 웹 MVC(Spring Web MVC)는 Model-View-Controller(MVC) 패턴을 기반으로 웹 애플리케이션을 개발하는 프레임워크입니다. 이 패턴은 애플리케이션의 비즈니스 로직, 사용자 인터페이스, 그리고 요청 처리를 명확하게 분리하여 유지보수성과 확장성을 높입니다.
💡 Spring MVC 요청 처리 흐름:
- 클라이언트 요청(① Request):
- 사용자가 브라우저에서 서버로 HTTP 요청을 보냅니다. 이 요청은 DispatcherServlet으로 전달됩니다.
- DispatcherServlet이 요청을 수신:
- DispatcherServlet은 Spring MVC의 Front Controller 역할을 하며, 모든 요청을 중앙에서 처리합니다. 이곳에서 요청을 받아서 적절한 Handler(주로 Controller)로 전달합니다.
- HandlerMapping을 통해 Controller 선택(②):
- DispatcherServlet은 먼저 HandlerMapping을 사용하여, 요청에 맞는 Controller(Handler)를 찾습니다. HandlerMapping은 URL 패턴에 따라 어떤 Controller가 요청을 처리할지 결정합니다.
- HandlerAdapter를 통해 Controller 실행(③):
- 요청을 처리할 Controller가 결정되면, HandlerAdapter가 이를 호출합니다. HandlerAdapter는 다양한 유형의 컨트롤러를 처리할 수 있게 해주는 어댑터 역할을 합니다.
- Controller에서 비즈니스 로직 처리(④):
- Controller는 요청을 처리하고, 필요한 경우 Service 계층을 호출하여 비즈니스 로직을 실행합니다. Service는 데이터 액세스를 위해 Repository와 상호작용하며, 데이터베이스에서 필요한 정보를 조회하거나 저장합니다.
- 처리 결과는 Model 객체에 저장되고, 뷰 이름을 반환합니다.
- Model에 결과 저장(⑤):
- Controller는 처리된 데이터(결과)를 Model에 저장하고, View의 이름(논리적 뷰 이름)을 반환합니다. 이때 Model은 View가 렌더링할 때 필요한 데이터를 포함합니다.
- ViewResolver를 통해 View 결정(⑥):
- DispatcherServlet은 반환된 논리적 뷰 이름을 가지고 ViewResolver를 사용해, 해당 뷰의 실제 경로(물리적 뷰)를 찾습니다. ViewResolver는 논리적 뷰 이름을 JSP, Thymeleaf 등의 실제 파일로 매핑합니다.
- View 렌더링(⑦):
- ViewResolver가 찾아낸 View를 사용하여, Model에 있는 데이터를 활용해 최종적으로 HTML 또는 다른 형태의 응답을 생성합니다.
- 응답 반환(⑧ Response):
- DispatcherServlet은 렌더링된 뷰를 클라이언트에게 HTTP 응답으로 반환합니다. 최종적으로 사용자는 웹 페이지나 데이터(JSON, XML 등)를 응답으로 받게 됩니다.
💡 스프링 웹 MVC의 구성 요소
- 모델(Model):
- 비즈니스 로직과 데이터를 다루는 부분입니다. 모델은 애플리케이션의 데이터를 처리하고 이를 표현하기 위한 데이터를 뷰에 전달합니다. 일반적으로 Service Layer와 Data Access Layer가 이 역할을 수행합니다.
- 모델은 컨트롤러가 처리한 요청에 대해 결과 데이터를 저장하고, 그 데이터를 뷰(View)에 전달하는 역할을 합니다.
- 뷰(View):
- 사용자에게 화면을 렌더링하는 부분으로, 주로 HTML, JSP, Thymeleaf, FreeMarker 등의 템플릿 엔진이 사용됩니다. 뷰는 모델에서 제공한 데이터를 사용하여 사용자에게 결과를 보여줍니다.
- 뷰는 순수하게 프레젠테이션 로직만을 다루며, 비즈니스 로직은 포함되지 않습니다.
- 컨트롤러(Controller):
- 사용자의 요청을 받아서 모델을 통해 비즈니스 로직을 처리하고, 그 결과를 뷰에 전달하는 역할을 합니다.
- 스프링 MVC에서 컨트롤러는 보통 @Controller 또는 @RestController 어노테이션을 사용하여 정의되며, 각 HTTP 요청에 대응하는 메서드들을 가지고 있습니다.
- 컨트롤러는 모델 데이터를 뷰에 전달하기 위해 ModelAndView 객체를 사용하거나, 데이터를 직접 반환할 수 있습니다.
💡 스프링 웹 MVC에서의 디스패처서블릿(DispatcherServlet)
디스패처서블릿(DispatcherServlet)은 스프링 웹 MVC의 프론트 컨트롤러로, 모든 클라이언트의 요청이 가장 먼저 디스패처서블릿을 통해 처리됩니다. 디스패처서블릿은 중앙 허브로서 각 요청을 적절한 컨트롤러에 전달하고, 결과를 다시 사용자에게 응답하는 역할을 합니다.
디스패처서블릿의 주요 역할
- 요청 수신:
- 사용자의 모든 요청은 가장 먼저 디스패처서블릿에 도달합니다. 이 서블릿이 클라이언트의 요청을 받으면, 요청에 따라 적절한 컨트롤러를 찾습니다.
- 핸들러 매핑(Handler Mapping):
- 디스패처서블릿은 요청이 들어오면 먼저 핸들러 매핑(Handler Mapping)을 통해 어떤 컨트롤러가 이 요청을 처리할지 결정합니다. 스프링은 URL 패턴이나 기타 설정을 기반으로 요청을 처리할 적절한 컨트롤러 메서드를 찾아냅니다.
- @RequestMapping, @GetMapping, @PostMapping과 같은 어노테이션을 통해 요청 URL과 컨트롤러 메서드를 매핑합니다.
- 핸들러 어댑터:
- 핸들러 매핑이 컨트롤러를 찾은 후, 핸들러 어댑터(Handler Adapter)가 해당 컨트롤러를 호출하여 요청을 처리합니다. 핸들러 어댑터는 핸들러(컨트롤러)를 실행하는 로직을 담당합니다.
- 모델 및 뷰 처리:
- 컨트롤러가 비즈니스 로직을 처리하고 나면, 디스패처서블릿은 뷰 리졸버(View Resolver)를 통해 적절한 뷰(JSP, Thymeleaf 등)를 찾아서 클라이언트에게 렌더링할 데이터를 준비합니다. 이때 컨트롤러가 모델 데이터를 뷰에 전달합니다.
- 응답 반환:
- 마지막으로, 디스패처서블릿은 처리된 결과를 클라이언트에게 응답으로 반환합니다. 이 과정에서 뷰를 렌더링하여 사용자에게 화면을 보여주거나, REST API 응답을 JSON 또는 XML 형식으로 반환할 수 있습니다.
💡 디스패처서블릿의 동작 흐름
- 클라이언트 요청: 클라이언트가 브라우저를 통해 URL로 요청을 보냅니다.
- 디스패처서블릿이 요청 수신: 모든 요청은 DispatcherServlet이 가장 먼저 받습니다.
- 핸들러 매핑: 디스패처서블릿은 요청 URL에 따라 요청을 처리할 컨트롤러를 찾습니다.
- 핸들러 호출: 요청을 처리할 컨트롤러가 결정되면, 핸들러 어댑터가 해당 컨트롤러의 메서드를 실행합니다.
- 모델 처리: 컨트롤러는 비즈니스 로직을 처리한 후, 모델 객체에 결과 데이터를 저장합니다.
- 뷰 리졸버: 디스패처서블릿은 뷰 리졸버(View Resolver)를 사용하여 요청을 렌더링할 뷰(JSP, Thymeleaf 등)를 결정합니다.
- 응답 전송: 뷰를 클라이언트에게 렌더링하여 최종적으로 응답을 반환합니다.
💡 스프링 웹 MVC 구성 요소의 협력
- DispatcherServlet: 프론트 컨트롤러로, 모든 요청의 진입점 역할을 하며, 요청을 적절한 컨트롤러에 전달하고 응답을 클라이언트에게 반환합니다.
- Controller: 사용자의 요청을 처리하는 핵심 역할을 하며, 비즈니스 로직을 처리하고 결과를 뷰에 전달합니다.
- Model: 비즈니스 데이터를 담고 있으며, 컨트롤러에서 처리한 데이터를 뷰로 전달합니다.
- View: 클라이언트에게 보여지는 화면을 렌더링하며, 모델의 데이터를 사용하여 화면을 구성합니다.
- View Resolver: 요청에 대해 적절한 뷰를 찾아주는 역할을 하며, 스프링에서 JSP, Thymeleaf 등의 뷰를 사용할 수 있도록 지원합니다.
결론
스프링 웹 MVC는 모델(Model), 뷰(View), 컨트롤러(Controller) 패턴을 사용하여 비즈니스 로직과 프레젠테이션 로직을 명확하게 분리하는 웹 애플리케이션 아키텍처입니다. 디스패처서블릿(DispatcherServlet)은 프론트 컨트롤러로서 모든 요청을 수신하고, 적절한 컨트롤러로 전달한 후, 처리된 결과를 다시 클라이언트에게 반환하는 역할을 합니다.
'Spring Framework' 카테고리의 다른 글
@Valid와 @Validated (0) | 2024.10.14 |
---|---|
프록시와 어댑터 (0) | 2024.10.08 |
필터와 밸브 (0) | 2024.10.08 |
AJP 커넥터 (1) | 2024.10.08 |
아파치 톰캣 서버 (1) | 2024.10.07 |