개인 프로젝트를 진행하면서 에러가 터질 때 어떤 부분에서 발생하는지 항상 궁금했다.
mvc구조가 어떤 원리로 작동되는지 대략적으로는 알고 있는데(Dispatcher Servlet이 request를 받아서 ~~ )
깊은 부분까지는 부족한 것 같아 포스팅 하는 겸 정리하고자 한다.

< 동작 순서 >
1. Dispatcher Servlet이 url 요청을 받는다.
2. 요청을 받은 Dispatcher Servlet이 핸들러 url 정보를 Handler Mapping에 넘긴다.
3. HandlerMapping은 HandelrAdapter목록에서 Handler(Controller)을 처리할 수 있는 Adapter을 찾는다.
4. 찾은 HandlerAdapter을 실행하고 그에 맞는 Contoller가 실행된다.
5. (Controller - Service - DAO)비즈니스 로직을 처리 후 Controller가 view이름을 Dispatcher Servlet에 반환한다.
6. Dispatcher Servlet은 반환 한 view name을 view Resolver을 통해 view객체를 찾는다.
7. view 객체는 해당하는 뷰를 호출하고, Contoller로 부터 전달 받은 데이터를 Model 객체에서 가져와 화면에 표시한다.
동작 원리는 알겠는데 한 가지 궁금한 점이 있다.
- HanderAdapter가 왜 필요한 건가? (HandlerMapping이 바로 Controller을 찾고 실행하면 되는것 아닌가?)
< HandlerAdapter가 필요한 이유 >
- Controller에는 다양한 종류가 있다.
/* 어노테이션 기반이 아닌 다른 종류의 컨트롤러 */
@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");
}
}
/* 어노테이션 기반의 컨트롤러 */
@Controller
public class MainController {
@GetMapping("/main")
public String main() {
return "home";
}
}
컨트롤러 종류가 많은 만큼 HandlerMapping에서 컨트롤러를 찾는 방법 또한 다양하고 HandlerAdapter 또한 다양하다.
대표적인 예시는 다음과 같다.
HandlerMapping의 종류
1. RequestMappingHandlerMapping : 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
2. BeanNameUrlHanderMapping : 스프링 빈의 이름으로 handler을 찾는다
HandlerAdapter의 종류
1. RequestMappingHandlerAdapter : 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
2. HttpRequestHandlerAdapter : HttpRequestHandler 처리
3. SimpleControllerHandlerAdapter : Controller 인터페이스(과거에 사용)
여기 까지가 이론적인 내용인데 궁금한 점은
HandlerMapping이 바로 Controller을 찾아주면 안되는 이유?(HandlerMapping이 Controller을 찾기까지 하는데..)
당연히 검색 결과는 안나왔고 개인적으로 추측한 부분은
단일 책임 원칙(SRP) 떄문이 아닌가 싶다.
HandlerMapping이 Controller을 찾고 실행까지 한다면 동시에 두가지 역할을 맡은 것이기 때문에
찾는 역할을 HandlerMapping이, 실행 하는 역할은 HandlerAdapter가 하는 것이
단일 책임 원칙에 위배되지 않기 때문에 HandlerAdapter가 필요한 것이 아닐까?
부족하거나 잘못된 부분에 대한 피드백 환영합니다!!
'Spring' 카테고리의 다른 글
스프링 시큐리티를 쓰는 이유는? (0) | 2022.11.09 |
---|---|
스프링 컨테이너와 스프링 빈 (0) | 2022.11.03 |
@Transactional 어노테이션 정리 (0) | 2022.05.27 |
서블릿과 JSP- 02 정리 (0) | 2022.03.09 |
스프링 입문 강의 요약 01-3 (0) | 2022.01.26 |