Spring

[Spring] MVC 패턴 & 프론트 컨트롤러(Dispatcher-Servlet)

날아 2023. 1. 29. 16:50

1. Model View Controller

컨트롤러

-> HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과데이터를 조회해서 모델에 담는다.

 

모델

-> 뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달해주는 덕분에 뷰는 비즈니스 로직이나 데이터 접근을 몰라도 되고, 화면을 렌더링 하는 일에 집중할 수 있다.

 

-> 모델에 담겨있는 데이터를 사용해서 화면을 그리는 일에 집중한다.

 

MVC 패턴 한계 

MVC 패턴은 공통 처리가 어렵다는 한계가 있다. 

기능이 복잡해질수록 컨트롤러에서 공통으로 처리해야 하는 부분이 점점 더 증가할 것이다. 이 문제를 해결하기 위해서 컨트롤러 호출 전에 먼저 공통 기능을 처리해야한다. 


2.  프론트 컨트롤러

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받는다.
  • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다.
  • 입구를 하나로!
  • 공통 처리 가능 
  • 스프링 웹 MVC의 "DispatcherServlet"이 프론트컨트롤러 패턴으로 구현되어 있다. 

동작순서
  1. 클라이언트 요청을 디스패처 서블릿이 받음
  2. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
  3. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  4. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  5. 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
  6. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  7. viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
  8. View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. 
  9. 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다. 

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

스프링 부트가 제공하는 핸들러 매핑과 핸들러 어댑터 (일부생략)
  • HandlerMapping
0 = RequestMappingHandlerMapping = 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1 = BeanNameUrlHandlerMapping =  스프링 빈의 이름으로 핸들러를 찾는다.
  • HandlerAdapter
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용 
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용) 처ㅣ

 

@RequestMapping
  • 실무에서 대부분 사용하는 방식의 컨트롤러
  • RequestMappingHandlerMapping 과 RequestMappingHandlerAdaptor가 사용된다. 
  • 요청 정보를 매핑. 해당 URL이 호출되면 이 메서드가 호출된다. 애노테이션을 기반으로 동작하기 때문에, 메서드 이름은 임의로 지으면 된다. 
  • @GetMapping, @PostMapping 으로 HTTP Method를 구분할 수 있다. 

4. 뷰 리졸버

스프링 부트가 제공하는 뷰 리졸버 (일부생략) 
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.

※ return '/join-form' 가정 (jsp)

1. 핸들러 어댑터 호출 

핸들러 어댑터를 통해 'join-form'이라는 논리 뷰 이름을 획득한다.

 

2. ViewResolver 호출

'join-form'이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.

'join-form'이라는 이름의 스프링 빈으로 등록된 뷰가 없으므로 InternalResourceViewResolver가 호출된다. 

 

3. InternalResourceViewResolver

이 뷰 리졸버는 InternalResourceViewResolver를 반환한다. 

 

4. 뷰 -InternalResourceView 

 InternalResourceViewResolver는 JSP 처럼 forward()를 호출해서 처리할 수 있는 경우에 사용한다. 

 

5. 핸들러 어댑터 호출 

view.render()가 호출되고  InternalResourceViewResolver는 forward()를 사용해서 JSP를 실행한다. 

 

※ JSP를 제외한 나머지 뷰 템플릿들은 forward()과정 없이 바로 렌더링 된다.

※ 타임리프 뷰 템플릿을 사용하면 ThymeleafViewResolver를 등록해야 한다. 최근에는 라이브러리만 추가하면 된다. 

 

 

 

출저

인프런 강의 스프링 MVC 1편 (김영한 강사님)

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard