Web

스프링 프레임워크 DispatcherServlet_HandlerMapping,HandlerAdapter

KayEsQuo 2025. 8. 10. 16:42

개요

예전 스프링을 모르고 자바 지식으로만 웹개발에 뛰어들었고, 스프링을 알아야한다는 예상과 달리 주어진 업무인 비즈니스로직만 신경써서 일을 하면 되었음. 스프링이 어떤 원리로 돌아가는지 몰랐었고, 공부를 하려고 하면 디스패처, 빈, 스코프, IOC 등과 같이 어려운 내용이 많았고 누구하나 제대로 아는 개발자가 잘 없어서 물어보기도 힘들었음. 이번 글에서는 스프링 중 가장 앞선 컨트롤러인 디스패처 서블릿에 대한 글을 다룰것임. 사용자가 요청부터 비즈니스 로직 호출 중간부분 까지에 대해 다루며, 다시 말해 디스패처가 어떻게 컨트롤러를 호출하는가에 대한 원리를 짧게나마 정리함.

 

 

디스패처 서블릿

 

 

Spring MVC에서 DispatcherServlet, HandlerMapping, HandlerAdapter 동작 원리

Spring MVC의 핵심은 요청을 받아 컨트롤러 메서드를 실행하고, 그 결과를 클라이언트에 반환하는 구조임. DispatcherServlet가 요청을 받은 정보를 기준으로 컨트롤러를 찾는데, 이때 필요한 컴포턴트들은 HandlerMapping, HandlerAdapter가 있음. 아래는 DispatcherServlet,HandlerMapping,HandlerAdapter와 위 그림의 1번부터 4번까지에 대한 내용을 담음.

 

 

1번. 핸들러 조회 (HandlerMapping)

  • What
    DispatcherServlet이 요청 처리 시작할 때 가장 먼저 하는 일은 요청을 처리할 핸들러 찾기임. 이는 한마디로 “컨트롤러 실행 정보를 담은 객체”임.
  • How
    요청 URL, HTTP 메서드, 파라미터 조건, 헤더 조건 등을 기준으로 등록된 매핑 정보와 비교함.
    매칭되면 HandlerExecutionChain을 반환함.
    여기에는 실제 실행할 핸들러 객체와 적용할 인터셉터 목록이 들어있음.
  • Why
    • 하나의 애플리케이션 안에 여러 컨트롤러가 존재할 수 있음. 즉 어떤 요청이 어떤 컨트롤러로 가야 하는지 결정하는 과정이 필요함. 예를들면 GET방식 호출인지 POST방식인지에 대한 내용이 대표적임. 이외에도 URL 패턴, 헤더의 조건등에 따라 필요한 컨트롤러를 찾기 위한 과정임.
    • 이 과정을 안 거치면 DispatcherServlet이 직접 모든 요청에 대해 어떤 컨트롤러를 호출해야 할지 알 수 없음. 핸들러를 못 찾는다는 건 = “이 URL·HTTP 메서드를 누가 처리하는지 모른다”는 뜻임.

 

2번. 핸들러를 처리할 수 있는 핸들러 어댑터 조회

  • What
    • HandlerAdapter는 핸들러 실행 방법을 알고 있는 객체임.
    • 컨트롤러 구현 방식이 다를 수 있기 때문에, DispatcherServlet은 직접 실행하지 않고 어댑터를 통해 실행함. 구현방식으로는 애노테이션기반 또는 그렇지 않은 경우가 있음. 그래서 마땅한 어댑터를 찾아야 함.
  • How
    DispatcherServlet이 등록된 모든 HandlerAdapter 목록을 순회하면서 supports(handler) 호출함. 해당 메서드는 지원여부를 true, false값을 반환하여 가능성을 알림. 즉 true를 반환하는 어댑터가 해당 핸들러 실행 담당함.

 

3번. handle(handler) 호출

  • What
    • HandlerAdapter가 선택되면, DispatcherServlet이 그 어댑터의 handle() 메서드를 호출하는 단계임.
    • 핸들러 어댑터는 단순히 컨트롤러를 실행만 하는 게 아니라 실행 전후에 필요한 준비/후처리를 담당함.
      예를 들어:
      • 애노테이션 기반 컨트롤러 → 파라미터 바인딩, @RequestBody JSON 변환, @Valid 검증
      • HttpRequestHandler → 바로 handleRequest() 실행
      • SimpleController → handleRequest(request, response) 호출
      이 준비 과정이 컨트롤러 종류마다 달라서, 어댑터가 대신 처리함.
  • How
    HandlerAdapter는 요청 데이터를 분석하고, 컨트롤러 메서드의 파라미터에 맞게 바인딩함.
    메시지 컨버터가 필요한 경우 JSON → 객체 변환, Multipart 처리 등을 수행함.
    그런 뒤 실제 핸들러 호출 준비 완료됨.
  • Why
    컨트롤러 호출 전에 반드시 데이터 준비, 형 변환, 검증 등이 필요함.
    이 과정을 어댑터가 처리하면 컨트롤러는 비즈니스 로직에만 집중 가능함.

 

4번. handler 호출 (컨트롤러 실행)

  • What
    실제로 여기서 비즈니스 로직이 실행되는 단계임.
  • How
    HandlerAdapter가 준비한 인자를 컨트롤러 메서드에 전달하고 호출함.
    회원 조회 요청이면 DB 조회 수행, 파일 업로드 요청이면 파일 저장 처리 등 업무 로직 실행함.
    실행 결과를 ModelAndView 또는 null로 반환함.
  • Why
    최종적으로 클라이언트 요청에 대한 응답을 만들려면 비즈니스 로직 실행이 필수임.
    여기서 나온 결과가 이후 뷰 렌더링이나 JSON 응답의 기반이 됨.

'Web' 카테고리의 다른 글

HTTP 상태코드 302  (1) 2025.07.27