Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Spring MVC

by Greedy 2023. 11. 2.

Spring MVC

Model-View-Controller

M : Model

V : View

C : Controller

소프트웨어 디자인 패턴 중 하나

디자인 패턴: 소프트웨어 개발 방법들을 패턴화 해 놓은것

MVC 패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분하여 각각의 역할을 분리

Model

  • 데이터와 비즈니스 로직을 담당
  • 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행

View

  • 사용자 인터페이스를 담당
  • 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현

Controller

  • Model과 View 사이의 상호작용을 조정하고 제어
  • 사용자의 입력을 받아 Model에 전달하고, Model의 결과를 바탕으로 View를 업데이트함

MVC 패턴은 소프트웨어를 구성하는 요소들을 분리함으로써 코드의 재사용성과 유지보수성을 높이고, 개발자들 간의 협업을 용이하게 함

소프트웨어를 개발할 때, MVC 패턴을 적용하여 구조를 잘 설계하는 것이 중요

Spring MVC

Servlet API를 기반으로 구축된 독창적인 웹 프레임워크

처음부터 Spring Framework에 포함되어 옴

유연하고 다양한 워크 플로우를 지원

https://docs.spring.io/spring-framework/reference/web/webmvc.html

Spring 공식 문서 :‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다’

Servlet

자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양

사용자가 API를 요청했을 때 서블릿의 동작

사용자가 API를 요청했을 때 서블릿의 동작

  1. 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청
  2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체*를 생성
    • : 약속된 HTTP의 규격을 맞추면서 쉽게 HTTP에 담긴 데이터를 사용하기 위한 객체
  3. 설정된 정보를 통해 어떠한 Servlet에 대한 요청인지 찾음
  4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet 혹은 doPost 등의 메서드를 호출함
  5. 호출한 메서드들의 결과를 그대로 반환/ 동적 페이지를 생성→ HttpServletResponse 객체에 응답을 담아 Client(브라우저)에 반환
  6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse 객체를 소멸시킴

모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야 함

따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리함

Front Controller

Front Controller 패턴의 동작과정

Front Controller 패턴의 동작과정

1. Client(브라우저)에서 HTTP 요청이 들어오면 DispatcherServlet 객체가 요청을 분석

2. DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달

[Sample]
**GET /api/hello** → HelloController 의 **hello() 함수
GET /user/login** → UserController 의 **login() 함수
GET /user/signup** → UserController 의 **signup() 함수
POST /user/signup** → UserController 의 **registerUser() 함수**

Handler mapping 에는 API path 와 Controller 메서드가 매칭되어 있다

@RestController
public class HelloController {
    @GetMapping("/api/hello")//->이걸로 연결하나봄
    public String hello() {
        return "Hello World!";
    }
}

API path 즉, URL을 Controller에 작성하는 방법

@Controller 애너테이션이 달려있는 클래스를 생성한 뒤

@GetMapping 애너테이션(요청한 HTTP Method 와 일치)이 달린 메서드를 구현

URL은 @GetMapping("/api/hello") 이처럼 해당 애너테이션의 속성값으로 전달

메서드명은 URL을 매핑하는데 영향을 미치지 않음, 마음대로 정해도 됨

→직접 Servlet을 구현하지 않아도 DispatcherServlet에 의해 간편하게 HTTP 요청을 처리할 수 있게 됨

 

3.ControllerDispathcerServlet

해당 Controller는 데이터('Model')와 'View' 정보*를 전달

*요청에 대한 처리를 완료한 결과

 

4.DispatcherServletClient

ViewResolver를 통해 View에 Model을 적용, View를 Client에게 응답으로 전달

'Developing > TIL(Develop)' 카테고리의 다른 글

정적페이지와 동적페이지  (1) 2023.11.03
Controller이해하기  (0) 2023.11.02
Lombok과 application.properties  (0) 2023.11.02
테스트코드  (0) 2023.11.02
웹/Spring 기초 개념 공부  (1) 2023.11.01