[ spring ] Spring MVC 흐름 정리

도즈·2025년 3월 16일

spring

목록 보기
8/12

📘 Spring MVC 흐름


1️⃣ Request

  • 클라이언트(브라우저, 모바일 앱 등)가 특정 URL로 HTTP 요청을 보낸다.
  • 요청(request)은 DispatcherServlet에 도착한다.

2️⃣ HandlerMapping

  • DispatcherServlet은 받은 요청(URL)을 바탕으로 HandlerMapping에게 **요청(URL)**을 처리 할 controller가 있는지 찾는 것을 부탁한다.
  • Handler Mapping등록된 URL과 Controller의 매핑 정보를 바탕으로 요청을 처리할 Controller를 찾는다.
@Controller
public class TestController {
    
    @RequestMapping("/hello")
    public String sayHello() {
        return "hello";
    }
}

코드로 매핑 설명

  1. HandlerMapping@RequestMapping("/hello") 어노테이션을 기반으로 요청(=hello)Controller 메서드의 매핑 정보를 확인한다.
    • /hello 요청TestControllersayHello() 메서드와 매핑된다.
  2. HandlerMapping은 해당되는 Handler 정보를 DispatcherServlet에 **전달(=반환)**한다.
    • Handler 정보는 요청 처리에 필요한 데이터(Controller 객체( = TestController), 메서드( = sayHello) , 매개변수 등)를 포함한다.

3️⃣ Handler Adapter

@Controller
public class TestController {
    
    @RequestMapping("/hello")
    public String sayHello() {
        return "hello";
    }
}
  • DispatcherServlet이 요청을 처리할 Handler(Controller)를 찾으면, 해당 Handler를 실제로 실행하는 역할을 한다.

    • 코드 예시 : TestController의 sayHello() 메서드를 호출하고, sayHello() 메서드는 hello라는 논리적 뷰 이름을 반환한다.
    • 해당되는 controller의 메서드 실행해줌 (=ex. sayHello() 실행)
    • 논리적 뷰 이름 말고도, Handler Adapter는 mode, view name, model and view 정보 등을 반환할 수 있다

    1️⃣ view name 반환 예시

    • view name(=users ) 과 model( = test) 데이터를 반환
    public class TestController {
        @GetMapping("/users")
        public String getUsers(Model model) {
            Test test = new Test("test","testData111");
    
            model.addAttribute("test", test);
            return "users";    // View 이름 반환
        }
     }

    2️⃣ modelAndView 반환 예시

    • ModelAndView를 사용하면 데이터를 추가하고 뷰 이름을 반환하는 작업을 한 객체에서 처리할 수 있다.
    • ModelAndView(=mav) 반환
    @GetMapping("/users")
    public ModelAndView getUsers() {
        Test test = new Test("test", "testData111");
        ModelAndView mav = new ModelAndView("users"); // 뷰 이름 설정
        mav.addObject("test", test);                 // 데이터 추가
        return mav;
    }
    
  • HandlerAdapter는 메서드의 매개변수 정보를 보고, 필요한 데이터를 HTTP 요청에서 추출할 수 있다.

    • 예시 : @RequestParam, @PathVariable, @ModelAttribute 등

4️⃣ View Resolver

  • Controller에서 반환된 논리적 뷰 이름을 받아서, 실제로 사용될 View 객체( 예: JSP 파일, Thymeleaf 템플릿 , 물리적 뷰 경로 등)를 찾아 반환하는 역할을 한다. =>  템플릿, 뷰의 논리적 이름을 실제 위치가 있는 물리적 경로 반환 
public class TestController {
    @GetMapping("/users")
    public String getUsers(Model model) {
        Test test = new Test("test","testData111");

        model.addAttribute("test", test);
        return "users";    // View 이름 반환
    }
 }
  • View Resolver는 설정 파일에 정의된 prefixsuffix를 붙여서 뷰의 실제 경로를 만든 후, 해당 경로를 처리할 수 있는 View 객체를 찾거나 생성해서 반환한다.
    • View 객체에는 사용할 템플릿, 뷰의 논리적 이름을 실제 위치가 있는 물리적 경로 등이 들어가져 있다/ 
    • 논리적 뷰 이름: users
    • 실제(물리적) 뷰 경로: /WEB-INF/views/users.jsp (설정에 따라 다를 수 있다.) 
    • 결론 : 논리적 뷰 이름 ⇒ 물리적 뷰 경로로 변경
  • View Resolver는 최종 경로에 해당하는 View 객체(예: InternalResourceView)를 반환함.
    • 찾으면? → View 객체 반환.
    • 못 찾으면? → 예외 발생 또는 비어 있는 View 객체 반환.

5️⃣ View

  • ViewViewResolver가 찾아준 물리적 경로를 사용해 실제 클라이언트에 보낼 UI를 생성하는 역할을 해준다.
  • view는 Model 데이터(예: name= Test)를 HTML 템플릿에 삽입한다.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/" >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="'hello' + ${name} + '!!'"></h1>

</body>
</html>

2.  HTML이나 JSP 파일 등 을 렌더링.

3. 렌더링된 최종 결과를 클라이언트(브라우저)에 응답으로 반환.

  • 여기서 name이 test 라면 hellotest!!가 반환될 것이다.
<h1>hellotest!!</h1>

profile
도즈의 개발이야기

0개의 댓글