Spring Web MVC는 Servlet API를 기반으로 구축된 독창적인 웹 프레임워크로, 처음부터 Spring Framework에 포함되어 왔으며, 정식 명칭인 "Spring Web MVC"는 소스 모듈(spring-webmvc)의 이름에서 따왔으나, "Spring MVC"로 더 일반적으로 알려져 있다.
Servlet (서블릿)은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말한다.
1. 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청
2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성
→ 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체
→ 개발을 할 때 매번 HTTP의 구조를 분석해서 데이터를 가져오는 행위는 비효율적이기 때문에 Servlet이 대신해서 HTTP안에 들어있는 우리가 사용할 데이터 정보들을 HttpServletRequest객체에 넣어준다.
→ 동시에 Client측의 요청에 대한 응답을 위해 HttpServeltResponse도 생성해준다.
중앙에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아서 적합한 컨트롤러에게 위임해주는 역할 수행
모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리하고 있다.
1. Client → DispatcherServlet
: Client(브라우저)에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석
2. DispatcherServlet → Hander mapping && DispatcherServlet → Controller
: DispatcherServlet는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달
→ Handler mapping 에는 API path 와 Controller 메서드가 매칭되어 있다.**
예시)
GET /api/hello → HelloController 의 hello() 함수
GET /user/login → UserController 의 login() 함수
GET /user/signup → UserController 의 signup() 함수
POST /user/signup → UserController 의 registerUser() 함수
// GetMapping이라는 메서드를 사용해서
// 넘어온 URL경로로 Get방식으로 요청이 넘어왔을 때
// hello메서드를 호출한다 라고 자바의 애너테이션을 사용해서 정보를 전달
// 전달받는 데이터를 Handler mapping이 정보와 메서드를 매칭시킴
// 매칭된 정보를 DispatcherServlet이 확인해서 해당하는 Controller에 요청
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello World!";
}
}
@Controller
애너테이션이 달려있는 클래스를 생성한 뒤 @GetMapping 처럼 요청한 HTTP Method 와 일치하는 애너테이션을 추가한 메서드를 구현@GetMapping("/api/hello")
이처럼 해당 애너테이션의 속성값으로 전달해주면 된다.Controller → DispathcerServlet
: 해당 Controller는 요청에 대한 처리를 완료 후 처리에 대한 결과 데이터를 Model에 담고, View에 대한 정보와 함께 전달
DispatcherServlet → Client
: ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달