MVC
Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나
- MVC 패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분하여 각각의 역할을 분리
Model
- 데이터와 비즈니스 로직 담당
- 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업 수행
View
- 사용자 인터페이스 담당
- 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현
Controller
- Model과 View 사이의 상호작용을 조정하고 제어
- 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트
🕹️ MVC 패턴은 소프트웨어를 구성하는 요소들을 분리함으로써 코드의 재사용성과 유지보수성을 높이고, 개발자들 간의 협업을 용이하게 한다. 따라서 소프트웨어를 개발할 때, MVC 패턴을 적용하여 구조를 잘 설계하는 것이 중요하다.
Spring MVC
Servlet API를 기반으로 구축된 독창적인 웹 프레임워크
- Spring 공식 문서 曰, ‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다’
- Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다라고 이해하자...
Servlet
자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양
Servlet 동작 과정
- 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청
- 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체 생성
- 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체들
- 개발자들은 매번 HTTP 구조를 분석해서 데이터를 가져와야했음
- servlet은 이 과정을 대신해서 위 객체들에 데이터들을 넣어줌!
- 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 파악
- 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드 호출
- 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환
- 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체 소멸
Front Controller
- 모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다.
- 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리하고 있다.
Front Controller 패턴 동작과정
- Client(브라우저)에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청 분석
- DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청 전달
- Handler mapping: API path 와 Controller 메서드를 매칭
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello World!";
}
}
- Handler mapping 방법
- @Controller 애너테이션이 달려있는 클래스 생성
- @GetMapping 처럼 요청한 HTTP Method 와 일치하는 애너테이션을 추가한 메서드 구현
- URL은
@GetMapping("/api/hello")
처럼 해당 애너테이션의 속성값으로 전달
- 해당 메서드명은 URL을 매핑하는데 영향을 미치지 않음으로 자유
- 이제는 직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP 요청을 처리할 수 있다!
- Controller → DispathcerServlet
- 해당 Controller는 요청에 대한 처리를 완료 후 처리에 대한 결과 즉, 데이터('Model')와 'View' 정보를 전달
- DispatcherServlet → Client
- ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달