Spring MVC (DispatcherServlet)

Dev.Dana·2024년 11월 1일

TIL

목록 보기
4/6
post-thumbnail

Spring MVC로 개발을 항상 해왔지만 “뭐냐?” 라고 물어보면 정확하게 이렇다. 라고 답변하는 것이 어려웠다. 강의를 들으며 다시 한 번 복습하는 겸 배웠던 내용을 글로 정리해보고자 한다.

1. MVC 패턴

MVC (Model-View-Controller) 패턴은 소프트웨어 개발에서 자주 사용되는 설계 패턴으로 애플리케이션의 구조를 모델, 뷰, 컨트롤러 세 가지 영역으로 분리하여 코드의 유지보수성과 확장성을 높인다.

  • Model (모델) 애플리케이션의 데이터나 비즈니스 로직을 담당한다. 데이터베이스와 상호작용하거나 데이터를 처리하는 역할을 한다.
  • View (뷰) 사용자가 보는 화면을 담당한다. 사용자에게 정보를 보여주고 입력을 받을 수 있다. HTML, JSP, Thymeleaf 같은 템플릿 엔진이 이 역할을 한다.
  • Controller (컨트롤러) 사용자의 요청을 받아 처리하고, 적절한 모델을 호출한 후 결과를 뷰에 전달한다. 브라우저에서 들어온 요청을 분석한 후 그에 따라 적절한 응답을 반환하는 다리 역할을 한다.

MVC 패턴의 흐름

사용자가 브라우저에서 요청을 보냄

Controller가 요청을 받아 처리

→ 필요한 Model 데이터를 생성하거나 불러옴

ControllerView에 데이터를 전달

View가 사용자에게 결과를 표시

2. Spring MVC

📄 Spring Web MVC는 Servlet API를 기반으로 구축된 독창적인 웹 프레임워크로, 처음부터 Spring Framework에 포함되어 왔으며, 정식 명칭인 "Spring Web MVC"는 소스 모듈(spring-webmvc)의 이름에서 따왔으나, "Spring MVC"로 더 일반적으로 알려져 있습니다.

Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어 있으며 이 모델은 유연하고 다양한 워크 플로우를 지원합니다.

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

Spring 공식 문서에서 Spring MVC를 이렇게 소개하고 있다.

  • DispatcherServlet이 중앙에서 HTTP 요청을 처리해 주는데 이 부분은 Front Controller패턴으로 설계되었다. → Spring도 MVC패턴으로 HTTP 요청을 효율적으로 처리하고 있다!!

Spring MVC 구성 요소

  • DispatcherServlet Spring MVC의 핵심 구성 요소로 모든 HTTP 요청을 가져가 적절한 컨트롤러로 전달하는 역할을 한다.
  • Controller 요청을 처리하고 비즈니스 로직을 수행하고 모델 데이터를 뷰로 전달한다.
  • Model 비즈니스 데이터와 로직을 담고 있는 객체
  • ViewResolver 컨트롤러가 반환한 뷰 이름을 적절한 뷰(ex. JSP, Thymeleaf)로 매핑해준다.

Spring MVC 동작 흐름 (Front Controller 패턴의 동작과정)

  1. 사용자가 브라우저에서 HTTP 요청을 보낸다.
  2. DispatcherServlet이 요청을 받아 분석한다.
  3. 그리고 분석한 데이터를 토대로 Handler mapping을 통해 요청을 처리할 Controller를 찾아 전달해준다.
  4. Controller는 비즈니스 로직을 수행하고 결과 데이터를 Model에 담아 반환한다.
  5. DispatcherServletViewResolver를 통해 적절한 View를 찾는다.
  6. View는 Model 데이터를 사용하여 사용자에게 결과를 표시한다.

그러면 일반 자바 프로젝트에서 쓰는 서블릿은 뭐였더라..?

3. 서블릿 (Servlet)

서블릿은 Java 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 서버 측 프로그램이다.

서블릿의 특징

  • Java EE의 일부이며, 웹 서버에서 실행된다.
  • HTTP 요청과 응답을 처리하는 기능을 제공한다.
  • 클라이언트의 요청을 받고, 이를 처리하고, 결과를 HTML이나 다른 형식으로 반환한다.

서블릿의 동작 원리

  1. 클라이언트가 요청을 보낸다.
  2. 웹 서버는 해당 요청을 적절한 서블릿으로 전달한다.
  3. 서블릿은 요청을 처리하고 응답을 생성하여 클라이언트에 반환한다.

단점

  • 코드에 HTML과 Java 코드가 섞여 있어 복잡하고 유지보수가 어려울 수 있다.

코드로 확인하기


public class SimpleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 응답의 콘텐츠 타입 설정
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        
        // HTML 응답 작성
        out.println("<html>");
        out.println("<head><title>Simple Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>일반 서블릿이에요ㅎㅎ</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4. DispatcherServlet

DispatcherServletSpring MVC 프레임워크의 핵심으로써 모든 웹 요청의 진입점이다 !! Spring에서 MVC 패턴을 구현할 때 얘가 참 중요한 역할을 한다.

Spring이 실행될 때, 컨트롤러들은 스프링 컨텍스트에 등록되어있다. ⭐ DispatcherServlet은 요청이 들어오면 그 요청에 맞는 컨트롤러를 스프링 컨텍스트에서 찾아서 요청을 전달하는 역할을 한다.

즉, DispatcherServlet은 중앙 관리자고, 컨트롤러들은 그 지시에 따라 요청을 처리하는 일꾼이라고 볼 수 있다.

코드로 확인하기

Spring Boot에서 프로젝트를 생성하고 컨트롤러를 작성하면, DispatcherServlet이 자동으로 모든 요청을 받아 적절한 컨트롤러로 전달한다.

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "안녕 나는 Spring MVC란다";
    }
}

위의 코드만 작성해도 DispatcherServlet이 자동으로 이 요청을 받아 sayHello() 메서드로 전달하고 응답을 생성한다.

Spring 프로젝트의 DispatcherServlet VS 일반 Java 프로젝트의 서블릿

  • 일반 Java 프로젝트에서의 서블릿 일반 Java 웹 프로젝트에서는 여러 개의 서블릿이 있을 수 있다. 각 서블릿은 특정 URL 패턴에 맞게 요청을 받아서 처리하기 때문에 보통 여러개 예를 들어, /user 요청은 UserServlet이 처리하고, /order 요청은 OrderServlet이 처리하는 식으로 여러 서블릿이 각기 다른 역할을 맡아서 동작할 수 있다.
  • Spring 프로젝트에서의 DispatcherServlet Spring 프로젝트에서는 보통 DispatcherServlet이 하나만 있으면 충분하다. 이 DispatcherServlet이 모든 요청을 받아서 분석하고, 적절한 컨트롤러로 요청을 넘겨주는 역할을 한다. 따라서, 요청이 많더라도 DispatcherServlet 하나로 모든 요청을 중앙에서 관리할 수 있다. 하지만 경우에 따라 프로젝트의 요구 사항이 복잡해서 서로 다른 설정이나 기능을 가진 여러 DispatcherServlet이 필요하다면 추가가 가능하다.
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글