Spring MVC
Spring MVC: Spring에서 제공하는 웹 모듈. 웹 프레임워크의 한 종류로 MVC는 Model-View-Controller의 약자이다.
Spring MVC는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이며 서블릿 기반으로 동작한다.
MVC 패턴을 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 실행되는 비즈니스 로직을 서로 영향 없이 유지보수할 수 있도록 개발할 수 있다.
Model
Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업을 한다. 이렇게 처리한 작업의 결과 데이터를 클라이언트에게 응답으로 돌려줘야 하는데, 이때 클라이언트에게 응답을 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.
View
View는 Model 데이터를 이용해서 웹 브라우저 같은 클라이언트 애플리케이션의 화면에 보이는 리소스를 제공하는 역할을 한다.
Spring MVC에는 다양한 View 기술이 포함되어 있다. View의 형태는 다음과 같이 나눌 수 있다.
- HTML 페이지의 출력
- HTML 페이지를 직접 렌더링해서 클라이언트 측에 전송하는 방식이다.
- HTML 태그로 구성된 페이지에 Model 데이터를 채워 넣은 후, 최종적인 HTML 페이지를 만들어 클라이언트에 전송한다.
- Spring MVC에서 지원하는 HTML 페이지 출력 기술에는 타임리프, FreeMaker, JSP + JSTL, Tiles 등이 있다.
- PDF, Exel 등의 문서 형태로 출력
- Model 데이터를 가공해서 PDF 문서나 Exel 문서를 만들어 클라이언트 측에 전송하는 방식이다.
- 문서 내에서 데이터가 동적으로 변경되어라 하는 경우 사용할 수 있는 방식이다.
- XML, JSON 등 특정 형식의 포맷으로의 변환
- Model 데이터를 특정 프로토콜 형태로 변환해서 변환된 데이터를 클라이언트 측에 전송하는 방식이다.
- 이 방식의 경우, 특정 형식의 데이터만 전송하고, 프론트엔드 측에서 이 데이터를 기반으로 HTML 페이지를 만든다.
Controller
Controller는 클라이언트 측의 요청을 직접적으로 전달받는 엔트포인트로써 Model과 View 중간에서 상호 작용을 해주는 역할을 한다.
클라이언트 측의 요청을 전달받아서 비즈니스 로직을 거친 후에 Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달하는 역할을 한다.
정리
User의 요청을 받은 Controller는 비즈니스 로직및 데이터 처리를 담당하는 Model을 호출하여 데이터를 생성하고, 그 데이터를 토대로 컨트롤러는 View에 모델이 처리한 결과에 대한 화면을 생성하도록 요청한다. Controller이 Model과 View 사이의 통신을 끊어내기 위한 중재자 같은 역할을 하는 셈.
MVC1 모델
뷰와 컨트롤러의 역할이 합쳐져 있는 모델을 의미한다. 보통 개발을 할 때, JSP가 View의 역할을 하지만, 이 모델에서는 뷰와 컨트롤러의 역할을 모두 JSP가 담당한다.
JSP가 뷰와 컨트롤러의 역할을 모두 담당하게 되면, Java 코드와 HTML, CSS 등 코드가 섞여 유지보수가 힘들어지며 소스관리가 어려워질 것이다.
MVC2 모델
뷰와 컨트롤러를 분리한 모델을 의미한다. JSP는 뷰의 역할을 하며 서블릿이 도입되어 컨트롤러의 역할을 한다. Java 코드와 HTML, CSS 코드가 분리된 셈이다.
Spring MVC의 동작 방식
MVC2 모델을 발전 시킨 것이 Spring MVC이다. MVC2 모델이 기반이 되는 웹 모듈인 것이다.
Spring MVC는 Front Controller 패턴으로 이루어져 있다. 밑 그림의 DispatcherServlet이 Front Controller 역할을 맡고 있다.
Front Controller는 우선적으로 유저의 모든 요청을 받고, 그 요청을 분석해 세부 컨트롤러들에게 필요한 작업들을 나누어준다.
- 클라이언트가 요청을 전송하면 DispatcherServlet이라는 클래스에 요청이 전달된다.
- DispatcherServlet은 클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청한다.
- HandlerMapping은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴해준다.(핸들러 객체는 해당 핸들러의 Handler 메서드 정보를 포함하고 있다.Handler 메서드는 Controller 클래스 안에 구현된 요청 처리 메서드를 의미한다.)
- 요청을 처리할 Controller 클래스를 찾았으니 이제는 실제로 클라이언트 요청을 처리할 Handler 메서드를 찾아서 호출해야 한다. DispatcherServlet은 Handler 메서드를 직접 호출하지 않고, HandlerAdpater에게 Handler 메서드 호출을 위임한다.
- HandlerAdapter는 DispatcherServlet으로부터 전달받은 Controller 정보를 기반으로 해당 Controller의 Handler 메서드를 호출한다.
- Controller의 Handler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter에게 전달한다.
- HandlerAdapter는 전달받은 Model 데이터와 View 정보를 다시 DispatcherServlet에게 전달한다.(이때 핸들러 어댑터는 어떤 return 타입이든 모두 ModelAndView로 반환해준다.)
- DispatcherServlet은 전달받은 View 정보를 다시 ViewResolver에게 전달해서 View 검색을 요청한다.
- ViewResolver는 View 정보에 해당하는 View를 찾아서 View를 다시 리턴한다.
- DispatcherServlet은 ViewResolver로부터 전달받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청한다.
- View는 응답 데이터를 생성해서 다시 DispatcherServlet에게 전달한다.
- DispatcherServlet은 View로부터 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달한다
'Spring > 개념' 카테고리의 다른 글
[Spring] CGLIB (0) | 2023.06.23 |
---|---|
[Spring] Annotation (0) | 2023.06.18 |
[Web] HTTP 웹 기본 (0) | 2023.06.04 |
[Web] 서블릿(servlet)이란? (0) | 2023.05.23 |
[Spring] 스프링 PSA (0) | 2023.05.11 |