심화/Spring

[Spring] Spring MVC란?

annovation 2025. 9. 23. 09:02

Spring MVC

 

💡Spring MVC란?

  • Spring 공식 문서에서 Spring MVC에 대한 설명으로 ‘DispatcherServlet이 중앙에서 HTTP 요청을 처리해주는데 이는 Front Controller 패턴으로 설계되어있다’라고 설명하고 있다. [각주:1]
  • Spring에서 MVC 디자인 패턴을 적용하여 HTTP 요청을 효율적으로 처리하고 있다고 이해할 수 있다.
  • 반환할 데이터는 Model에 담고, Model 적용이될 View name을 DispatcherServlet에 전달하면, Viewresolver를 통해 Model의 데이터가 View에 적용되고, 완성된 페이지를 Client에 반환한다.

DispatcherServlet

 

💡Servlet

Servlet

  • Servlet은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 표준 규칙을 말한다.
  • HTTP 요청을 받아서 처리하고, 그 결과(응답)를 클라이언트(브라우저)에 보내는 역할을 한다.

🔎 Servlet 동작 흐름

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

💡DispatcherServlet

DispatcherServlet

  • Dispatcher는 한글로 '전달하다'라는 의미가 있다. 즉, DispatcherServlet은 전달하는 서블릿이라고 이해할 수 있다.
  • 모든 API 요청을 앞서 살펴본 서블릿의 동작 방식에 맞춰 코드를 구현한다면 무수히 많은 Servlet 클래스를 구현해야한다.
  • 따라서 Spring은 DispatcherServlet을 사용하여 Front Controller 패턴 방식으로 API 요청을 효율적으로 처리하고 있다.

🔎 Front Controller 동작 흐름

 

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

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

 

Handler mapping 예시

 

➡️ 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에게 응답으로 전달

Controller

 

 Controller에 대해 이해하기 위해, Spring MVC에 Front Controller 패턴이 적용되지 않았다면 어땠을지 살펴보자.

 

💡Servlet Code

@WebServlet(urlPatterns = "/user/login")
public class UserLoginServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}
@WebServlet(urlPatterns = "/user/logout")
public class UserLogoutServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}
}
@WebServlet(urlPatterns = "/user/signup")
public class UserSingUpServlet extends HttpServlet {
	@Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

	@Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		// ... 
	}

}
  • 이처럼 단 4개의 API를 처리하기 위해 무려 3개의 클래스를 만들어야한다.

💡Controller Code

@Controller
@RequestMapping("/user")
public class UserController {
	@GetMapping("/login")
	public String login() {
	    // ...
	}

  @GetMapping("/logout")
  public String logout() {
      // ...
  }

	@GetMapping("/signup")
	public String signup() { 
		// ... 
	}
	
	@PostMapping("/signup")
  public String registerUser(SignupRequestDto requestDto) {
		// ... 
	}
}
  • 이렇게 Spring MVC에서 효율적인 API처리를 위해 Front Controller 패턴을 만들어냈다.
  • 유사한 성격의 API를 하나의 Controller로 관리한다.
  • 메서드명도 자유롭게 설정 가능하다 (단, 클래스 내의 중복메서드명 불가)
  • @Controller는 해당 클래스가 Controller의 역할을 수행할 수 있도록 등록해준다.

출처

https://teamsparta.notion.site/1-9-Spring-MVC-2252dc3ef51481c7ab82c942f0767b99

 

챕터1-9 : Spring MVC란 무엇일까? | Notion

MVC 디자인 패턴이란?

teamsparta.notion.site


주석 출처