지금은 잘 사용하지 않는 스프링이 제공하는 간단한 핸들러 매핑과 어댑터에 대해 공부한다.
public interface Controller{
}
전에는 이렇게 인터페이스 컨트롤러를 만들어서 안에서 ModelAndView를 사용해 주었지만 사실 인터페이스 컨트롤러와 @Controller는 전혀 다르다.
코드를 통해 알아본다.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
}
@Component를 사용하여 스프링 빈의 이름을 URL로 해둬서 핸들러 매핑이 가능하도록 해준다. 이렇게 만들면 스프링 빈도 등록이 된 것이고 빈의 이름으로 URL을 매핑하게 되는 것이다.
컨트롤러가 호출되기 위해 2가지가 필요하다고 한다.
- HandlerMapping
- HandlerAdapter
핸들러 매핑으로 컨트롤러를 찾을 수 있어야 하고 이렇게 핸들러 매핑으로 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 있어야 한다.
우리가 따로 핸들러 매핑과 핸들러 어댑터를 따로 만들 필요가 없다. 왜냐하면 스프링에서 이미 많은 시간을 거치면서 대부분의 기능을 만들어 두었기 때문에 구현되어 있는 핸들러 매핑과 핸들러 어댑터를 찾아 사용만 하면 된다.
OldeController는 어떻게 호출이 됐나?
핸들러 매핑으로 핸들러를 조회하게 되면 HandlerMapping을 순서대로 실행해서 핸들러를 찾고 bean 이름으로 핸들러를 찾아야 하기 때문에 BeanNameUrlHandlerMapping가 실행하고 Bean의 이름을 URL로 설정해 둔 위 OldController 핸들러를 반환하는 것이다.
핸들러 어댑터를 조회하게 되면 어댑터의 supports()를 순서대로 호출하게 되고 SimpleControllerHanderAdapter가 Contrller 인터페이스를 지원하기 때문에 대상으로 된다.
디스패처 서블릿이 조회한 SimpleCOntrollerHanderAdapter를 실행하면서 핸들러 정보 또한 같이 넘겨주고 실행하면서 OldController를 내부에서 실행하고 그 결과를 반환하는 것이다.
이번에는 컨트롤러 인터페이스 말고 핸들러를 알아본다.
HttpRequestHandler 핸들러는 서블릿과 가장 유사한 형태의 핸들러라고 한다.
@Component("/springmvc/request-handler")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
실행 후 print문이 나오면 성공한 것이다. 페이지는 빈 페이지로 나온다. 이번에도 빈 이름으로 핸들러를 찾을 수 있도록 빈 이름을 설정해 주었다. 핸들러 어댑터를 조회하고 실행하는 것 역시 같다.
참고로 어노테이션 중에 @RequestMapping이 있는데 이 어노테이션에 있는 핸들러 매핑과 핸들러 어댑터가 우선 순위가 가장 높다고 한다.
팀 프로젝트를 만드는 과정이나 학교에서 배웠던 스프링 프레임워크 또한 @RequestMapping을 사용했다. 단지 학교에서는 사용법을 알려주었고 이 강의에서는 구조를 알려줘서 이해하기가 더 편하게 되어있다. 이렇게 어노테이션을 활용하는 것이 지금 스프링에서 주로 사용하는 어노테이션 기반의 컨트롤러를 지원하는 매핑과 어댑터라고 하며 실무에서는 대부분이 이런 방식의 컨트롤러를 사용한다고 하니 열심히 배워두면 좋을 것 같다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : Spring MVC 시작 (0) | 2022.01.24 |
---|---|
[Spring Boot] : 뷰 리졸버에 대해서.. (0) | 2022.01.24 |
[Spring Boot] : Spring MVC 구조 확인하기 (0) | 2022.01.24 |
[Spring Boot] : Controller를 여러 방식으로 구현하기 위해 사용한 Adapter pattern (0) | 2022.01.23 |
[Spring Boot] : 단순하고 실용적은 ModelView 객체의 중복을 제거한 컨트롤러 코딩 (0) | 2022.01.23 |
댓글