MVC 디자인 패턴이란?
- MVC란 Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나
- MVC패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분해야 각각의 역할을 분리
Model
- 데이터와 비즈니스 로직을 담당
- 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업 수행
View
- 사용자 인터페이스를 담당
- 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현
Controller
- Model과 View 사이의 상호작용을 조정하고 제어
- 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트
즉 MVC패턴은 소프트웨어를 구성하는 요소들을 분리함으로써 코드의 재사용성과 유지보수성을 높이고 개발자들 간의 협업을 용이하게 한다.
Spring MVC
- Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어있어 유연하고 다양한 워크 플로우를 지원
- 쉽게 얘기하자면 Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리
Servlet
DispatcherServlet에 대한 이해를 돕기위해 먼저 Servlet이 무엇인지 알고가자
- Servlet은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말한다.
- 사용자가 API 요청을 했을 때 서버의 서블릿이 어떻게 동작하는지 학습해보자
- 사용자가 클라이언트를 통해 서버에 HTTP Request 즉, API 요청을 한다
- 요청을 받은 Servlet컨테이너는 HttpServletRequest/Response 객체를 생성
- 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기위한 객체
- 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾는다
- 해당 Servlet에서 Service 메소드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드 호출
- 호출한 메서드들의 결과를 그대로 반환하거나 동적 페이지를 생성한 뒤 HttpServletResponse 객체에 응답을 담아 클라이언트에 반환
- 응답이 완료되면 생성한 HttpServletRequest/Response 객체를 소멸
Front Controller
- 앞서 살펴본 서블릿의 동작방식에 맞춰 모든 API요청을 코드로 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다.
- 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리한다
1. 클라이언트에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석
2. DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달
ex) GET /api/hello → HelloController 의 hello() 함수
Handler mapping에는 API path와 Controller 메서드가 매칭되어 있다
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello World!";
}
}
3. Controller -> DispatcherServlet
해당 controller는 요청에 대한 처리를 완료 후 처리에 대한 결과 즉, 데이터(Model)와 View 정보를 전달
4. DispatcherServlet -> Client
ViewResolver를 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달
'SPRING' 카테고리의 다른 글
영속성 컨텍스트 - (spring - 6) (0) | 2023.12.23 |
---|---|
spring의 3가지 핵심 특징(IoC/Di, PSA, AOP)와 3가지 계층구조 - ( spring - 5) (0) | 2023.12.23 |
HTTP란 무엇일까 - (spring - 3) (0) | 2023.12.22 |
Spring과Spring Boot의 간략한 차이점 - (spring - 2) (0) | 2023.12.22 |
서버란 무엇일까? - (Spring - 1) (0) | 2023.12.22 |