[ spring ] Spring MVC 흐름 정리

2025. 1. 23. 16:19·스프링 | 스프링 부트

📘 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 요청 → TestController의 sayHello() 메서드와 매핑된다.
  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는 설정 파일에 정의된 prefix와 suffix를 붙여서 뷰의 실제 경로를 만든 후, 해당 경로를 처리할 수 있는 View 객체를 찾거나 생성해서 반환한다.
    • View 객체에는 사용할 템플릿, 뷰의 논리적 이름을 실제 위치가 있는 물리적 경로 등이 들어가져 있다/
    • 논리적 뷰 이름: users
    • 실제(물리적) 뷰 경로: /WEB-INF/views/users.jsp (설정에 따라 다를 수 있다.)
    • 결론 : 논리적 뷰 이름 ⇒ 물리적 뷰 경로로 변경
  • View Resolver는 최종 경로에 해당하는 View 객체(예: InternalResourceView)를 반환함.
    • 찾으면? → View 객체 반환.
    • 못 찾으면? → 예외 발생 또는 비어 있는 View 객체 반환.

5️⃣ View

  • View는 ViewResolver가 찾아준 물리적 경로를 사용해 실제 클라이언트에 보낼 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>
  1. HTML이나 JSP 파일 등 을 렌더링.

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

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

'스프링 | 스프링 부트' 카테고리의 다른 글

[ Spring ] @RequiredArgsConstructor란 ?  (0) 2025.02.07
[ Spring ] @Transactional과 예시  (0) 2025.02.07
MVC 패턴이란?  (1) 2025.01.21
웹 서버와 WAS란 ?  (0) 2025.01.20
[ Spring Boot ] 프레임워크와 라이브러리  (0) 2025.01.17
'스프링 | 스프링 부트' 카테고리의 다른 글
  • [ Spring ] @RequiredArgsConstructor란 ?
  • [ Spring ] @Transactional과 예시
  • MVC 패턴이란?
  • 웹 서버와 WAS란 ?
Adose
Adose
  • Adose
    도즈의 개발 블로그
    Adose
  • 전체
    오늘
    어제
    • 분류 전체보기 (231)
      • JAVA (22)
      • 스프링 | 스프링 부트 (34)
        • 스프링 시큐리티 (1)
        • 채팅 (1)
      • 스프링 프로젝트 (5)
        • JDBC - 은행앱 구현 (1)
        • Spring Boot - 독서 블로그 프로젝트 (3)
        • 개인 프로젝트 - CoreBrief (1)
      • 가상화 기술 (22)
      • Git (1)
      • 코딩테스트 (47)
        • 프로그래머스 입문 (68)
      • AWS (1)
      • 데이터베이스 (0)
      • CS 공부 (8)
      • 알고리즘, 자료구조 (6)
      • 우테코 프리코스 (7)
      • 트러블 슈팅 (6)
      • 프론트 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    GIT
    Java
    test
    LV0
    멋쟁이사자처럼
    jdbc
    LV2
    코딩테스트
    LV1
    자바
    스프링부트
    springdatajdbc
    프론트
    멋쟁이사자처럼백엔드
    Spring
    스프링
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Adose
[ spring ] Spring MVC 흐름 정리
상단으로

티스토리툴바