본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Spring MVC / Front Controller

by mmm- 2023. 11. 1.

MVC

: Model-View-Controller 의 약자. 소프트웨어 디자인 패턴 중 하나.

  • 소프트웨어를 구성하는 요소들을 Model, View, Controller로 구분하여 각각의 역할을 분리 
  • 코드의 재사용성과 유지 보수성을 높여 개발자들 간의 협업을 용이하게 함.

 

Model

: 각각의 데이터와 비즈니스 로직을 담당

  • 데이터베이스와 연동, 데이터를 저장하고 불러오는 등의 작업을 수행 

View

: 사용자 인터페이스를 담당

  • 사용자가 보는 화면이나 버튼, 폼 등을 디자인하고 구현

Controller

: Model과 View 사이의 상호작용을 조정하고 제어

  • 사용자의 입력을 받아 Model에 전달하고 Model의 결과를 바탕으로 View를 업데이트함

Spring MVC

: 스프링에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리

 

Servlet 

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

  •  톰캣(WAS)안에서 서블릿이라는 기술이 동작하고 있다고 생각하면 됨.
    ( 웹서버는 동적인 처리를 할 수 없어 WAS에게 요청을 전달. )

 

 

서블릿 동작 과정

  1. 클라이언트가 서버에 요청
  2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse 객체 생성
  3. API 요청에 대해 확인 후, web.xml에서 해당 요청이 어떤 Servlet과 매칭이 되는지 탐색
  4. 찾은 매칭되는 Servlet 실행
  5. 해당하 Servlet에서 서비스 method 호출
  6. 메서드 호출한 뒤, HTTP 요청이 어떤 메서드 방식인지 확인
  7. 해당 하는 방식에 맞게끔 메서드 호출 (GET 방식이면 doGet(), POST 방식이면 doPost()...)
  8. 호출한 메서드들의 결과를 그대로 반환
    or 
    동적페이지 생성 후 HttpServletResponse 객체에 응답을 담아 클라이언트에 반환
  9. HttpServletRequest, HttpServletResponse 객체 소멸
❗같이 보면 좋을 것 같은 블로그 ❗
https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80

 

DispatcherServlet

: 전달을 하는 servlet 

 

  • 만약에 API 가 열 개정도 있다고 가정할 때, 10개의 API 에 매칭이 되는 Servlet의 객체들을 다 구현하고 어떤 메서드 방식인지 확인하는 등 여러 가지 작업들을 모두 개발자가 다 작성해야하는데, 이러한 불편함을 스프링에서 해결하기 위해 만든 것이 바로 DispatcherServlet
  • 스프링은 DispatcherServlet을 사용해 Front Controller 패턴방식으로 모든 API들을 효율적으로 처리함. 

 

Front Controller 패턴 동작과정

  1. 클라이언트가 요청을 보냄
  2. DispatcherServlet은 해당 요청 분석
  3. DispatcherServlet은 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청 전달

 

  • Handler mapping에는 API path와 Controller 메서드가 매칭되어 있음 
@RestController
public class HelloController {
    @GetMapping("/api/hello")
    public String hello() {
        return "Hello World!";
    }
}
  • /api/hello 라는 경로로 GET 방식으로 들어오면 해당 메서드를 실행시킬 것이라는 것을  @GetMapping 을 통해 정보 전달
  • 정보들을 토대로 handler mapping이 아래와 같이 매칭을 함.

  • 매칭된 정보를 DispatcherServlet이 확인 후 해당하는 Controller에 요청 전달
  • Controller가 해당 요청에 대한 작업 수행
  • 요청에 대한 처리가 완료되면 결과를 Model에 담고 View에 대한 정보를 DispatcherServlet에 전달
  •  DispatcherServlet은 정보를 가지고 ViewResolver를 통해 View에 Model을 적용
  • View를 클라이언트에게 반환

용어정리

  • HttpServletRequest, HttpServletResponse
    : 약속된 HTTP의 규격을 맞추면서 HTTP에 담긴 데이터를 쉽게 사용하기 위해 만들어낸 객체

    • HttpServletRequest
      ➡️ 개발자들 대신 서블릿이 HTTP를 분석해 그 안에 있는 사용해야 할 데이터와 정보들을 해당 객체에 넣어줌.
      ➡️ Request 객체에 HTTP 정보가 들어있음.
    • HttpServletResponse 객체를 처음에 같이 만드는 이유?
      ➡️ 요청을 받았으면 그에 대한 응답도 해야하기 때문에 응답을 하기 위한 Servlet Response 객체도 같이 생성