Spring MVC - Front Controller의 핸들러매핑과 핸들러어댑터

2021. 4. 1. 17:50SPRING/SPRING MVC

Front Controller의 역할

  • 프론트 컨트롤러의 가장 대표적인 역할을 뽑자면, 요청 URI에 따라 알맞는 컨트롤러를 선택하여 호출하는 것이다.
  • 이 역할의 핵심이 핸들러 매핑과 핸들러 어댑터다.

 

핸들러란?

  • 여기서 핸들러란 무엇일까? 다양하게 해석될 수 있는데, 여기서는 그냥 이벤트가 발생했을 때, 해당 이벤트에 맞는 동작을 수행하는자 라고 생각하면 된다. 즉, 해당 URI에 맞는 동작을 수행하는 자 = 컨트롤러 라고 생각하면된다. 컨트롤러는 구체적고 핸들러가 그 상위 개념으로 더 큰 개념이라고 생각하면 된다.

 

Spring MVC 구조

 

핸들러 매핑이란?

  • Dispatcher Servlet이 요청 URI가 어떤 핸들러와 매핑되는지 찾는 과정이다.
  • 핸들러 매핑은 결국 요청과 알맞는 핸들러 객체를 Dispatcher Servlet에 리턴한다.

 

핸들러 어댑터란?

  • 핸들러 매핑에서 리턴받은 핸들러 객체를 가지고 이에 맞는 어댑터를 찾는 과정이다.
  • 여기서 어댑터란, 2개 이상의 인터페이스에 스펙이 맞지 않을 때, 중간에 이 스펙을 맞도록 변환해주는 역할을 하는 객체이다.

 

핸들러 매핑과 핸들러 어댑터가 필요한 이유

  • 어떤 개발자는 컨트롤러의 리턴 타입을 String으로 하고 싶고 또 어떤 개발자는 리턴 타입을 ModelAndView로 개발하고 싶을 수 있다. 컨트롤러의 매개변수도 마찬가지로, 어떤 개발자는 서블릿의 HttpServletRequest와 HttpServletResponse로 받고 싶고, 또 어떤 개발자는 매개변수를 받지 않거나 Model만 받고 싶어할 수도 있다. 이 모든 요구 사항을 맞추기 위해서 어댑터 패턴이 필요한 것이다.
  • 핸들러 어댑터는 컨트롤러에서 String으로 응답받든, Model로 응답받든, 무조건 Dispatcher Servlet에서 ModelAndView객체로 응답을 해줘야하는 역할이 있는 것이다.
  • 이에 스프링에서는 다양한 형태의 핸들러가 생김에 따라(대표적으로 Controller Interface와 @Controller가 있다) 이에 맞는 핸들러 어댑터를 구현해 놓았다.
  • 이로 인해, 개발자는 비즈니스 개발 로직에만 집중하여 편하게 원하는 형태로 컨트롤러를 정의하여 개발할 수 있다.