Almon Dev

스프링 부트 [Spring MVC & 파라미터 처리] 본문

웹 해킹/웹 개발

스프링 부트 [Spring MVC & 파라미터 처리]

Almon 2025. 5. 28. 00:19

 스프링 부트 [Spring MVC & 파라미터 처리]

 

이유

PHP로 웹 개발을 처음 시작할 때 가장 먼저 만든 기능은 로그인 페이지였습니다.
당시 GET, POST 요청에서 파라미터를 직접 받아 처리했는데,
현재는 스프링에서 이를 어떻게 다루는지 배우며, 컨트롤러와 타임리프를 통해 파라미터를 HTML로 연동하는 구조를 익히고 있습니다.

 

Spring MVC

Spring MVC는 Model, View, Controller 세 가지 구성 요소로 이루어져 있으며, 웹 애플리케이션에서 요청을 받고, 처리하고, 결과를 화면에 출력하는 과정을 역할별로 분리하여 효율적으로 관리할 수 있도록 돕는 아키텍처입니다.

 

저는 보통 MVC라고 하면 보통 삼각형의 이미지를 떠올리는데 스프링 MVC는 조금 더 복잡합니다.

기본적인 MVC 패턴은 역할 분리를 설명하기 위한 개념적 모델인 반면,
Spring MVC는 여기에 Dispatcher Servlet, Handler Mapping, View Resolver 같은 요소가 추가되어 실제 요청 처리 흐름을 모두 포함하는 실무 중심 구조이기 때문입니다.

즉, 요청을 받고 → 어떤 컨트롤러를 실행할지 결정하고 → 어떤 뷰를 보여줄지까지의 전 과정을 자동으로 관리하는 구조이기 때문에, 단순한 MVC보다는 더 체계적인 방식이라 볼 수 있습니다.

MVC 패턴

 

 모델(Model)

모델(Model)은 컨트롤러에서 처리한 데이터를 뷰(View)로 전달하는 역할을 합니다.
예를 들어, 로그인한 사용자의 닉네임이나 이름과 같은 정보를 컨트롤러에서 받아, 프로필 페이지(HTML, JSP 등)로 전달하여 화면에 출력할 수 있도록 합니다.

 

 뷰(View)

뷰(View)는 사용자가 실제로 보는 화면을 구성하는 역할을 합니다.
예를 들어 index.html, login.html과 같은 페이지는 컨트롤러가 전달한 데이터를 기반으로 동적으로 렌더링 되며, 최종적으로 디스패처 서블릿(DispatcherServlet)을 통해 브라우저로 전달되어 사용자에게 출력됩니다.

 

 컨트롤러(Controller)

컨트롤러(Controller)는 브라우저의 요청을 받아 처리하고, 어떤 화면(View)을 렌더링 할지 결정하는 역할을 합니다.

예를 들어 사용자가 test.com/login에 접근하면, @GetMapping("/login") 어노테이션이 붙은 컨트롤러의 메서드가 실행되어 요청을 처리하고, 처리 결과에 따라 어떤 뷰를 반환할지 결정하게 됩니다.

 

 디스패처 서블릿(DispatcherServlet)

디스패처 서블릿(DispatcherServlet)은 브라우저 등에서 들어온 HTTP 요청을 가장 먼저 받아 처리 흐름을 제어하는 역할을 합니다.
요청을 분석한 후 HandlerMapping을 통해 어떤 컨트롤러가 요청을 처리할지 결정하고, 이후 컨트롤러의 처리 결과로 반환된 뷰를 렌더링하여 최종적으로 사용자에게 응답합니다.

 

 핸들러 매핑(HandlerMapping)

핸들러 매핑(Handler Mapping)에서 말하는 핸들러(Handler)는 컨트롤러를 의미합니다. 즉, DispatcherServlet이 요청을 분석한 뒤, 어떤 컨트롤러가 이 요청을 처리할지 결정하도록 도와주는 역할을 합니다.

예를 들어 사용자가 test.com/logout 요청을 보낼 경우, Dispatcher Servlet은 요청 URL을 기반으로 HandlerMapping에게 어떤 컨트롤러가 이 요청을 처리할지 질의하고, 그 결과로 @GetMapping("/logout") 어노테이션이 붙은 메서드를 가진 컨트롤러 객체(핸들러)가 반환됩니다.

 

DispatcherServlet 클래스의 doDispatch() 메서드를 보면, getHandler() 메서드의 반환 타입이 **HandlerExecutionChain**이라는 것을 확인할 수 있습니다. 이 HandlerExecutionChain은 HandlerMapping이 찾은 컨트롤러 인스턴스 객체와, 요청 흐름을 제어할 수 있는 HandlerInterceptor(인터셉터) 배열을 함께 담고 있습니다.

예를 들어, 사용자의 요청을 처리하기 전에 인터셉터를 통해 로그인 여부를 검사하거나, 특정 권한이 있는 사용자만 접근 가능하도록 요청 흐름을 제어하는 등의 작업이 가능합니다.

 

 핸들러 어댑터(HandlerAdapter)

핸들러 어댑터(HandlerAdapter)는 DispatcherServlet이 찾은 핸들러(컨트롤러 객체)를 대신 실행해 주는 역할을 합니다.

DispatcherServlet은 다양한 형태의 컨트롤러(어노테이션 기반, 인터페이스 구현 기반 등)를 구분하고 직접 실행할 수 없기 때문에, HandlerAdapter를 통해 해당 핸들러를 실제로 실행합니다.

 

실제로 DispatcherServlet 클래스 내부에서는, 먼저 HandlerMapping을 통해 요청을 처리할 핸들러(컨트롤러)를 가져온 뒤, 해당 핸들러를 기반으로 적절한 HandlerAdapter를 찾아 실행하는 방식으로 동작하는 것을 확인할 수 있습니다.

HandlerAdpater 가져오기
HandlerAdpater로 실행

 

 뷰 리졸버(ViewResolver)

뷰 리졸버(ViewResolver)는 DispatcherServlet이 컨트롤러로부터 받은 뷰 이름을 바탕으로, 실제 렌더링할 뷰를 찾을 수 있도록 도와주는 역할을 합니다.

예를 들어, 컨트롤러가 "login"이라는 문자열을 반환하면, 뷰 리졸버는 이 이름을 기반으로 login.html, login.jsp 같은 실제 뷰 파일을 찾아주는 역할을합니다.

 

Spring MVC 흐름

1. 사용자 요청이 DispatcherServlet으로 들어옵니다.

2. DispatcherServlet은 요청 URL을 토대로 HandlerMapping에게 어떤 컨트롤러가 이 요청을 처리할지 질의합니다.

3. HandlerMapping이 해당 URL을 처리하는 컨트롤러의 인스턴스와 인터셉트 배열을 HandlerExecutionChain 객체로 묶어 반환합니다.

4. DispatcherServlet이 컨트롤러 실행을 위해 적절한 HandlerAdapter를 조회합니다.

5. HandlerAdapter는 해당 컨트롤러를 실행하여 뷰 이름(문자열) 을 반환받습니다.

6. DispatcherServlet은 반환된 뷰 이름을 기반으로 ViewResolver에게 실제 View 객체(ex ThymeleafView)를 요청합니다.

7. 반환된 View 객체가 render() 메서드를 통해 응답 내용을 직접 HttpServletResponse에 작성합니다.

8. 모든 처리가 끝난 후, DispatcherServlet이 작성된 response를 클라이언트(브라우저)에게 전달하며 응답이 완료됩니다.

 

파라미터 처리

웹 애플리케이션에서는 사용자의 입력을 주로 GET 또는 POST 방식의 파라미터로 전달받습니다. 이러한 파라미터를 처리함으로써, 사용자의 입력에 따라 동적으로 반응하는 웹 애플리케이션을 구현할 수 있습니다.

저의 목표는 Spring으로 게시판을 만드는 것이기 때문에, 사용자의 입력을 받아 처리하는 과정은 반드시 익혀야 할 기능입니다.

 

 GET & POST 요청 파라미터 처리

앞에서 설명한 것처럼, @GetMapping, @PostMapping이 붙은 메서드는 클라이언트의 GET, POST 요청을 처리합니다.

이 메서드에서 @RequestParam 어노테이션을 사용해 매개변수를 선언하면, HTTP 요청의 파라미터 이름과 일치하는 값을 자동으로 매핑하여 사용할 수 있습니다.

@GetMapping("/hello")
public String helloController(@RequestParam("name") String name, Model model) {
	String message = "어서오세요 " + name + "님";
    model.addAttribute("helloMessage", message);
    return "hello";
}

/hello?name=PO 라는 요청을 받으면 hello.html로 "어서오세요 PO님"이라는 문자열이 Model을 통해 전달됩니다.

이처럼 GET, POST 방식의 요청에서 @RequestParam을 이용해 파라미터를 받아 처리할 수 있습니다.

 

 실습 예시

 

1. GetMapping이 있는 컨트롤러 클래스를 생성합니다.

=> 이 파일은 / 요청이 들어오면 index라는 이름의 뷰 파일을 화면에 렌더링 하도록 하는 클래스입니다. 그 과정에 message 파라미터를 입력받으며 그 내용을 Model을 통해 index 뷰 파일에 전송합니다.

 

2. index.html을 생성합니다.

=> Thymeleaf를 이용해서 Model에서 message라는 이름의 값을 가져와 h2 태그에 삽입합니다.

 

3. /?message=test 요청을 보내면 파라미터에 삽입한 값이 정상적으로 화면에 출력됩니다.