본문 바로가기

Back-End/Spring-MVC

Spring MVC 구조 흐름

  • DispatcherServlet : Spring의 프론트 컨트롤러
    • 프론트 컨트롤러 패턴 : Servlet(Controller)이 호출되기 전에 공통 기능을 하나의 Servelt에서 처리해주는 패턴이다.
      프론트 컨트롤러 하나에 모든 클라이언트측 요청이 들어온다!
  • Spring MVC 구조 실행 순서
    • 1. 요청
      Client(사용자)가 브라우저에서 URL을 입력하거나 버튼을 누르면 HTTP 요청(Request)이 만들어지고, 이 요청이 Dispatcher Servlet에 전달된다.
    • 2. 핸들러 찾기
      • DispatcherServlet은 요청을 보고 어떤 컨트롤러(Handler)가 처리해야 하는지 HandlerMapping을 통해 찾는다.
        (여기서 컨트롤러는 요청을 처리하는 실제 로직을 담고 있는 클래스)
        Q : 어떤 컨트롤러가 처리할 때 GET, POST등을 말하는가?
        A : 예시
        1. 사용자가 /products URL로 GET 요청을 보낸다.
        2. Spring은 HandlerMapping을 통해 /products를 처리하는 컨트롤러를 찾는다
          • GET 요청이면 해당 컨트롤러의 @GetMapping("/products") 메서드를 실행한다.
          • 즉, URL과 HTTP메서드(GET, POST 등)를 기반으로 요청을 처리할 컨트롤러와 메서드를 결정
    • 3~4. Handler Adapter 찾기
      • 컨트롤마다 동작 방식이 다를 수 있으므로, 이를 적절히 연결해 주는 도우미가 필요한데, 이 도우미가 HandlerAdapter이다.
        이를 현대 Spring에서 이해하자면 애노테이션 기반 메서드 호출이라고 생각하면 된다!
        ex) HandlerAdapter는  @Controller로 정의된 클래스 안에 정의된 @RequestMapping, @GetMapping등을 호출하는 것!
        더 쉽게 표현하자면 @Controller라는 큰 건물 안에 @GetMapping, @PostMapping, @RequestMapping 등 방들이 있는데 HandlerAdapter가 방을 찾아 들어간다.
    • 5~7. 컨트롤러 호출 및 처리
      • 찾아낸 Handler(Controller)를 실행하여 요청을 처리하고, 처리 결과(데이터)를 반환한다.
      • 예를 들어, 사용자가 상품 목록을 요청했다면, 컨트롤러가 데이터베이스에서 상품 정보를 가져온다.
    • 8~9. View 이름 찾기(ModelAndView & View Resolver)
      • 컨트롤러는 ModelAndView라는 객체를 반환한다.
      •  View: 사용자에게 보여줄 화면의 이름(예: productList.jsp).
      • Model: 컨트롤러가 가져온 데이터(상품 목록 등).
      • View Resolver는 이 이름을 보고 어떤 파일을 사용자에게 보여줄지 결정한다.
        여기서 이 이 이름이란? 컨트롤러가 데이터를 처리한 후, 어떤 화면(View)을 보여줄지를 문자열로 반환하는데, 이것이 View의 이름이다!

    • 10~11. View 렌더링
      • View 파일이 데이터를 받아 실제로 HTML을 생성
@Controller
public class ProductController {
    @GetMapping("/products")
    public String listProducts(Model model) {
        // 로직 실행 (예: 상품 목록 가져오기)
        model.addAttribute("products", productService.getProducts());
        return "productList"; // View 이름 반환
    }
}

MVC 구조 흐름을 쉽게 비유하자면

1. 손님(사용자)이 요청(request)을 보낸다.
2. 건물 안내원(HandlerMapping)이 적절한 건물(@Controller)을 찾아준다.
➡️ 그럼 궁금증이 생길 수 있다. @Controller가 여러 개일 수 있나? 
➡️ 당연하다. 애플리케이션의 각 기능(회원 관리, 상품 관리 등)을 따로 관리하면 코드 복잡도가 줄고 협업의 효율성을 증가 시킬 수 있다.
3. 문 열고 들어갈 사람(HandlerAdapter)이 방(@GetMapping, @PostMapping)을 찾아 적절히 들어가 실행한다.
4. 방 안에서 일을 마치고 결과(response)를 손님에게 돌려준다.


 

'Back-End > Spring-MVC' 카테고리의 다른 글

HTTP 응답 데이터  (1) 2024.12.02
HTTP 요청 데이터  (1) 2024.12.02
@RequestMapping  (0) 2024.12.01
@Controller 와 @RestController 요약 정리  (0) 2024.12.01
Spring MVC가 나오게 된 이유  (0) 2024.11.30