현재는 @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 |