Spring MVC Framework는 웹 개발에서 널리 사용되는 아키텍처 중 하나로, MVC(Model-View-Controller) 패턴을 기반으로 한다.
💡MVC 패턴의 구조
Model
- 정의: 애플리케이션의 데이터를 책임지며, 비즈니스 로직을 처리한다.
- 역할: 사용자에게 표시되는 데이터를 가공하고 저장하며, 데이터의 변경이 일어날 경우 적절한 처리 방법을 구현한다.
- 구현: Java 객체로 표현되며, 특정 도메인의 데이터를 담는 역할을 한다.
View
- 정의: 시각적인 UI를 담당하며, 사용자에게 정보를 표현한다.
- 역할: Model에서 받은 데이터를 화면에 표시하고, 사용자의 입력을 Controller에 전달한다.
- 구현: 주로 HTML, JSP, Thymeleaf 등의 템플릿 엔진을 사용하여 구현한다.
Controller
- 정의: Model과 View를 연결하는 역할을 한다.
- 역할: 사용자의 요청을 받아 해당 요청에 대한 비즈니스 로직을 실행하고, 그 결과를 Model에 저장한 후, 적절한 View로 전달한다.
- 구현: 주로 Java 클래스로 구현되며, @Controller 어노테이션을 통해 Spring에 등록한다.
DAO, DTO
MVC Model의 DAO와 DTO에 대해서는 위 글을 참고한다.
💡MVC1 / MVC2 / Spring MVC
MVC1 vs MVC2
MVC1은 JSP가 모든 역할을 담당하는 구조로 빠른 개발이 가능하나 유지보수가 어렵다는 단점이 있다.
MVC2는 Controller를 추가하여 역할을 분리하고 확장성을 향상시킨 버전의 패턴이다.
Spring MVC vs. 기존 MVC 패턴
Spring MVC는 MVC2 패턴을 발전시킨 구조로 유연성과 확장성을 제공한다.
Spring의 DI(Dependency Injection)와 AOP(Aspect-Oriented Programming)를 지원하여 생산성을 높이고, 유지보수성을 향상시켰다는 특징이 있다.
💡Spring MVC Framework의 구조
📌동작 과정
1. Client 요청을 DispatcherServlet이 받는다.
2. DispatcherServlet은 HandlerMapping를 호출하여 요청 정보를 전달한다. 요청 정보(URL)를 분석하여 적합한 Controller를 선택한다.
3. DispatcherServlet이 다음으로 HandlerAdapter를 호출한다. HandlerAdapter는 요청한 URL에 적합한 Method를 찾는다.
4. HandlerAdapter가 Controller로 요청을 위임한다. Controller는 Business Logic을 처리하고, View에 전달할 결과를 Model 객체에 저장한다.
5. Controller는 view name을 DispatcherServlet에 리턴한다.
6. DispatcherServlet이 ViewResolver를 호출하여 Controller가 리턴한 view name을 기반으로 적합한 View를 찾는다.
7. DispatcherServlet이 View 객체에 처리 결과를 전달하여 보여준다.
8. View 객체는 해당하는 View를 호출한다. View는 Model 객체에 화면을 표시하는 데 필요한 객체를 가져와 화면에 처리하고, Client에 넘겨준다.
DispatcherServlet
DispatcherServlet은 Spring MVC에서 사용자의 모든 요청을 받아 처리하는 프론트 컨트롤러로, 웹 애플리케이션의 진입점 역할을 수행한다.
이 서블릿의 설정은 주로 web.xml 파일이나 WebApplicationInitializer를 통해 이루어진다. DispatcherServlet은 클라이언트로부터 받은 요청을 적절한 컨트롤러에게 전달하여 처리한다.
HandlerMapping
HandlerMapping은 DispatcherServlet이 요청을 처리할 컨트롤러를 찾는 역할을 한다. 이것은 사용자의 요청 URL을 분석하여 어떤 컨트롤러가 이를 처리할지를 결정한다.
XML 파일이나 Java config 어노테이션을 사용하여 설정할 수 있다.
HandlerAdapter
HandlerAdapter는 매핑된 컨트롤러의 실행을 요청하고, 그 결과를 ModelAndView 객체로 변환한다. 이는 다양한 종류의 컨트롤러를 유연하게 지원하기 위한 역할을 수행한다. 즉, 각각의 컨트롤러가 어떻게 실행되고 그 결과를 어떻게 처리해야 하는지를 다양한 방식으로 다룰 수 있게 해준다.
Controller
Controller는 사용자의 요청을 받아 해당 요청에 대한 비즈니스 로직을 실행하고, 그 결과를 Model에 저장한 후, 적절한 View로 전달하는 역할을 한다.
주로 Java 클래스로 구현되며, @Controller 어노테이션을 통해 Spring에 등록한다.
ViewResolver
ViewResolver는 Controller에서 리턴된 뷰 이름을 기반으로 실제 View 객체를 찾는 역할을 한다. 이를 통해 View 객체는 실제 화면을 생성하고 클라이언트에게 응답한다.
Spring은 다양한 View 템플릿을 지원하며, ViewResolver는 해당 템플릿을 찾아준다.
View
View는 화면을 생성하고 클라이언트에게 응답하는 역할을 한다. Controller에서 전달받은 데이터를 이용하여 사용자에게 시각적으로 표현되는 부분을 담당한다.
주로 HTML, JSP, Thymeleaf 등의 템플릿 엔진을 사용하여 구현한다.
참고문헌 및 자료
- MVC Architecture in Java. javatpoint. 2024.01.15. https://www.javatpoint.com/mvc-architecture-in-java
- [Spring] MVC 패턴 & Spring Framework MVC. Aridom's Development. 2024.01.15. https://aridom.tistory.com/61