Spring/Spring MVC

Handler Mapping & Handler Adapter

민철킹 2021. 4. 30. 22:41

현재는 @Controller라는 애노테이션을 사용하여 컨트롤러를 사용하지만

과거에는 아래와 같은 딱딱한 방식의 컨트롤러를 제공했었다.(지금은 사용 X)

 

 

  • @Component를 통해 해당 컨트롤러는 /springmvc/old-controller라는 이름의 스프링 빈으로 등록
  • 빈의 이름으로 URL을 매핑

 

http://localhost:8080/springmvc/old-controller 주소로 접속하면 콘솔창에 출력이 찍힐 것이다.

 

 

HandlerMapping

  • 핸들러 매핑에서 해당 컨트롤러를 찾을 수 있어야함.
  • ex)스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑

HandlerAdapter

  • 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요
  • ex) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행

 

 

스프링 부트가 자동으로 등록하는 주요 핸들러 매핑과 어댑터

 

HandlerMapping

  • 0순위 : RequestMappingHandlerMapping
    • 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
  • 1순위 : BeanNameUrlHandlerMapping 
    • 스프링 빈의 이름으로 핸들러를 찾음
    • 위에서 사용된 방식

HandlerAdapter

  • 0순위 : RequestMappingHandlerAdapter
    • 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
  • 1순위 : HttpRequestHandlerAdapter
    • HttpRequestHandler 처리
  • 2순위 : SimpleControllerHandlerAdapter
    • Controller 인터페이스 (애노테이션 X, 과거에 사용) 처리 
    • 위에서 사용된 방식

1. 핸들러 매핑으로 핸들러 조회

  • HandlerMapping을 순서대로 실행하여 핸들러를 찾는다.
  • 우리가 구현한 핸들러는 빈 이름으로 찾아야하기 때문에 BeanNameUrlHandlerMapping이 실행에 성공하고 핸들러인 OldController를 반환

2. 핸들러 어댑터 조회

  • HandlerAdapter의 supports()를 순서대로 호출
  • SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상

 

3. 핸들러 어댑터 실행

  • 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
  • SimpleControllerHandlerAdapter는 핸들러인 OldController를 내부에서 실행하고, 결과를 반환

 

 

따라서 OldController를 실행하며 사용된 객체는 아래와 같다

HandlerMapping = BeanNameUrlHandlerMapping

HandlerAdapter = SimpleControllerHandlerAdapter

 


HttpReqeustHandler

이번에는 Controller 인터페이스가 아닌 HttpRequestHandler를 사용해보자

이는 서블릿과 가장 유사한 형태의 핸들러

 

  • void 이기 때문에 return X

  • 위와 같이 구현을 하고 /springmvc/request-handler로 접속을 하면

호출이 되어 콘솔창에 출력된 것을 확인할 수 있다

 

1. 핸들러 매핑으로 핸들러 조회

  • HandlerMapping을 순서대로 실행하여 핸들러를 찾는다.
  • 우리가 구현한 핸들러는 빈 이름으로 찾아야하기 때문에 BeanNameUrlHandlerMapping이 실행에 성공하고 핸들러인 MyHttpRequestHandler를 반환

2. 핸들러 어댑터 조회

  • HandlerAdapter의 supports()를 순서대로 호출
  • HttpRequestHandlerAdapter가 HttpRequestHandler인터페이스를 지원하므로 대상

 

3. 핸들러 어댑터 실행

  • 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
  • HttpRequestHandlerAdapter는 핸들러인 MyHttpRequestHandler를 내부에서 실행하고, 결과를 반환

 

실제 개발에서는 거의 애노테이션 기반의 컨트롤러를 지원하는 매핑과 어댑터인

RequestMappingHandlerMapping와 RequestMappingHandlerAdapter를 사용함

반응형

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

Spring MVC  (0) 2021.05.01
ViewResolver  (0) 2021.05.01
Spring MVC 전체 구조  (0) 2021.04.30
유연한 컨트롤러  (0) 2021.04.28
단순하고 실용적인 컨트롤러  (0) 2021.04.21