ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 MVC란?
    spring/스프링 입문 주차 2024. 1. 17. 18:05

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

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

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


    Spring MVC란?
    Spring Web MVC는 Servlet API를 기반으로 구축된 독창적인 웹 프레임워크로, 처음부터 SpringFramework에
    포함되어 왔으며, 정식 명칭인 "Spring Web MVC"는 소스 모듈(spring-webmvc)의 이름에서 따왔으나,
    "Spring MVC"로 더 일반적으로 알려져 있다.
    ...
    Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는
    Front Controller 패턴을 중심으로 설계되어 있으며 이 모델은 유연하고 다양한 워크 플로우를 지원한다.
    - Spring 공식 문서에서 Spring MVC에 대한 설명으로 'DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데
     이는 Front Controller 패턴으로 설계되어 있다'라고 설명하고 있다.
    - 쉽게 표현해보자면 'Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다'
     라고 이해하면 좋다.

    DispatcherServlet에 대한 이해를 돕기위해 먼저 Servlet이 무엇인지 학습하고 가자.
    - Servlet(서블릿)은 자바를 사용하여 웹 페이즈를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말한다.
    사용자가 (HTTP) 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 객체를 소멸한다.

     

     

    Front Controller
    - 모든 API 요청을 앞서 살펴본 서블릿 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를
     구현해야 한다.
    - 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로
     처리하고 있다.
    - 이번에는 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. Contoller -> DispatcherServlet
    - 해당 Contoller는 요청에 대한 처리를 완료 후 처리에 대한 결과 즉, 데이터("Model')와 'View' 정보를 전달한다.
    4. DispatcherServlet -> Client
    - ViewResolver를 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달한다.

Designed by Tistory.