본문 바로가기

👩‍💻 BackEnd/🌿 스프링 [Spring]

[Spring MVC] DispatcherServlet / 핸들러 매핑과 핸들러 어댑터

DispatcherServlet

  • Spring MVC도 프론트 컨트롤러 패턴으로 구현되어있다. 
  • Spring MVC 의 프론트 컨트롤러가 바로 디스패쳐 서블릭이다. 
  • 그리고 DispacherServlet이 바로 Spring MVC 의 핵심이다. 

 

DispatcherServlet의 서블릿 등록 

  • DispacherServlet 도 부모 클래스에서 HttpServlet을 상속 받아 사용하고 서블릿으로 동작한다. 
  • 스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등록하면서 모든 경로 (urlPattern="/")에 대해서 매핑한다. 
    • 그럼 모든 /로 시작하는 다른 경로는? 이라는 생각이 들텐데 참고로 더 자세한 경로가 우선순위가 높다. 

 

 인터페이스 살펴보기 

  • 스프링 MVC 의 큰 강점은 DispatcherServlet 코드의 변경 없이, 원하는 기능을 변경하거나 확장할 수 있다는 점이 있다.
  • 지금까지 설명한 대부분을 확장 가능할 수 있게 인터페이스로 제공한다. 
  • 이 인터페이스들만 구현해서 DispatcherServlet 에 등록하면 원하는 대로 컨트롤러를 만들 수 있다. 

 


핸들러 매핑과 핸들러 어댑터 

  • handlerMapping(핸들러 매핑) 
    • 핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 한다. 
    • 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다. 
  • handlerAdapter(핸들러 어댑터) 
    • 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.
    • Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다. 

Controller 인터페이스를 구현한 OldController

 

과거에는 Controller 인터페이스를 구현한 컨트롤러를 사용했다고 한다. 

이때 @Component 어노테이션을 통해 spring bean 이름을 붙여주어 

Spring bean 이름으로 핸들러를 찾을 수 있도록 했다. 

따라서 주소 줄에 

http://localhost:8080/springmvc/old-controller 를 입력하면 sout 찍은 것이 콘솔 창에 찍한다. 

 

 

실행 순서를 보면 

 

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

  • 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 'BeanNameUrlHandlerMapping' 가 생핼에 성공하고 핸들러인 MyHttpRequestHandler 를 반환한다.
  • 여기에는 우선 순위가 있다. 

2. 핸들러 어댑터 조회 

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

 

3. 핸들러 어댑터 실행 

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

 

@RequestMapping 

가장 우선순위가 높은 핸들러 어댑터다. 

실무에서는 주로 이 방식의 컨트롤러를 사용함. 

 

 

뷰리졸버 

 

뷰의 정보를 리턴했지만 

화면이 출력되지 않는다. 

 

왜냐하면 new-form은 논리적 이름인데 물리적 이름으로 변환을 안해줬기 때무니다. 

 

따라서 application.properties 에 

prefix, suffix를 저장해주면 

제대로 화면을 찾아준다. 

 

왜냐하면 스프링 부트에서 자동 설정으로 

 

 

해당 코드를 실행 시켜주기 때문이다. 

 

(따라서 저 코드를 우리가 입력할 필요는 없다)