출처: https://typemin.tistory.com/7 [TypeLOG:티스토리]

프론트 컨트롤러 패턴은 중앙 집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을먼저 받아서 처리하게 만든다

사실 프론트 컨트롤러가 받기전에 Filter가 먼저 받긴하는거 같다.

예전 방식의 서블릿들은 클라이언트가 요청을 보내면 서블릿컨테이너가 서블릿을 찾아 매핑해줘 결과를 리턴해준다.

하지만 이 방식은 단점이 아래와 같다.

  • 서블릿이 많아지고 web.xml에 작성해야되는 매핑코드가 많아지면서 유지보수가 어려워진다.
  • 서블릿들은 웹 기술의 종속적이게 되면서 안좋아진다.
  • 서블릿들은 각각의 진입점을 갖기때문에 중복되는 코드를 막을수가 없다.

그래서 해당 일들을 해주는 프론트 컨트롤러 패턴을 고안해냈다(선배 개발자들이) 프론트 컨트롤러 패턴을 하면 좋은점은 웹환경에 종속적이지 않고 순수한 JAVA POJO코드로 컨트롤러를 만들수 있다 . (이는 곧 서블릿이 아니여도 된다는 소리와 같다.)

DispatcherServlet


스프링은 프론트 컨트롤러가 있는데 이것은 DispatcherServlet이라고 한다.

해당 프론트 컨트롤러가 하는 일은 아래와 같다.

  1. 요청을 분석한다.
  2. 핸들러 매핑에게 위임하여 요청을 처리할 핸들러를 찾는다.
  3. 해당 핸들러(컨트롤러)를 실행할수 있는 핸들러 어댑터를 찾는다.
  4. 찾아낸 핸들러 어댑터를 사용해서 컨트롤러로 요청과 응답을 처리한다.
  5. DispatcherServlet은 ViewResolver를 통해 View를 생성한다.
  6. DispatcherSerlvet은 View를 통해 요청결과를 생성 및 반환한다. 
  7. 부가적으로 컨트롤러 실행중에 예외가 발생했다면, 예외처리 핸들러에게 요청처리를 위임한다.

핸들러 매핑


핸들러 매핑은 HTTP 요청정보를 이용해서 이를 처리할 핸들러 오브젝트, 즉 컨트롤러를 찾아주는 기능을 가진 DispatcherServlet의 전략이다.

핸들러 매핑은 컨트롤러의 타입과는 상관없다. 하나의 핸들러 매핑 전략이 여러가지 타입의 컨트롤러를 선택할 수 있다는 뜻이다. (이와 관련된 내용은 핸들러 어댑터에서 다루겠다)

핸들러 인터셉터


핸들러 매핑의 역할은 기본적으로 URL과 요청정보로부터 컨트롤러 빈을 찾아주는 것이다. 한 가지 더 중요한 기능중 핸들러 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 역할인 인터셉터의 실행 체인을 돌려준다.

핸들러 어댑터


dispatcherServlet이 가지는 무한한 확장성의 비결

핸들러 매핑이 끝났다면 DispatcherServlet이 어떤 컨트롤러의 메소드를 실행할지 알고있어야 한다. 그렇다면 dispatcherServlet은 호출 가능한 컨트롤러는 특정 인터페이스를 구현해야 한다는 식의 규약을 따라서 작성해야 할까?

그건 아니다. 핸들러 어댑터를 이용하면 된다. 전형적인 오브젝트 어댑터 패턴을 사용해서, 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출하는것이다. 그러면 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을수 있다.

뷰 리졸버


컨트롤러가 어떤 식으로든 다시 DispatcherServlet에 돌려줘야할 두가지 정보가 있는데 그중 하나가 모델이고 하나가 뷰다. 컨트롤러가 직접 뷰 오브젝트를 리턴할수 있지만, 보통은 DispatcherServlet의 전략이 viewResolver를 통해 뷰 오브젝트를 리턴해준다.

이렇게 되면 View는 어떤 모델을 받아서 Table로 보여주든 Excel로 보여주든 html로 보여주든 자기 입맛대로 할수있다.

핸들러 예외 리졸버


컨트롤러의 작업 중에 발생한 예외를 어떻게 처리할지 결정하는 전략이다.

web.xml에 를 지정해서 에러 안내페이지를 보여줄 수도 있다. 그런데 핸들러 예외 리졸버가 등록되어 있다면 DispatcherServlet은 먼저 예외 리졸버에게 해당 예외를 처리 할수 있는지 확인한다. 핸들러 예외 리졸버가 있다면 예외는 DispatcherServlet 밖으로 던지지 않고 해당 핸들러 예외 리졸버가 처리한다.

 

작성하면서 정리를 하는데도 아직도 혼란스럽습니다.. 혹시 지적해줄곳이 있으시면 꼭 댓글로 알려주시면 감사하겠습니다.

반응형

+ Recent posts