[Spring MVC] MVC 패턴

Ho·2022년 8월 16일
0

Spring MVC

목록 보기
2/4

MVC (Model View Controller) 패턴

MVC 패턴은 비즈니스 로직을 수행하고 뷰를 렌더링 하는 작업을 서블릿과 JSP와 같은 곳에서 한번에 처리하던 방식을 컨트롤러와 뷰라는 영역으로 나눈 것을 말한다.

Controller

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

Model

뷰에 출력할 데이터를 담아둔다. 뷰가 필요한 데이터를 모두 모델에 담아서 전달하므로 뷰는 비즈니스 로직이나 데이터 접근에 대해 모르고 화면을 렌더링 하는 역할만 수행할 수 있다.

View

모델에 담긴 데이터를 사용하여 화면을 그리는 역할을 한다.


redirect vs foward

  • redirect 실제 클라이언트에 응답을 하고 클라이언트가 redirect 경로로 다시 요청하는 것을 말한다. URL 경로도 변경된다.
  • foward 는 서버 내부에서 일어나는 호출이므로 클라이언트가 인지하지 못한다.

Front Controller

MVC 패턴에서 컨트롤러는 요청이 들어올 때 request에서 파라미터를 얻거나 처리된 결과 데이터를 반환하는 등의 공통적인 작업을 수행하게 된다. 이런 공통적인 기능을 수행하는 컨트롤러를 만들고 내부에서 실제 비즈니스 로직을 수행할 컨트롤러를 호출하는 방식을 Front Controller 패턴이라 한다. 스프링 프레임워크도 Front Controller 패턴을 사용한다.


FrontController 패턴

  • frontcontroller 서블릿이 클라이언트 요청을 받는다.
  • 요청에 맞는 controller를 찾아서 호출한다.
  • 다른 컨트롤러들은 서블릿을 사용하지 않아도 된다.

Spring Web MVC의 DispathcerServlet이 FrontController 패턴으로 구현되어있다.

FrontController 패턴은 Http요청이 들어오면 다음과 같은 순서로 요청을 처리한다.

1. Handler 조회

frontcontroller는 uri와 매핑될 컨트롤러 인스턴스를 모두 가지고 있다.
요청이 들어오면 request의 uri에 해당하는 컨트롤러 인스턴스를 핸들러로 받아온다.

2. HandlerAdapter 조회

핸들러를 처리할 수 있는 HandlerAdapter를 가져온다. 실제 호출될 컨트롤러는 호출시 파라미터와 반환 타입이 제 각각일 수 있다. 이를 frontcontroller에서 공통적으로 처리하기 위해 핸들러를 처리할 수 있는 핸들러어댑터를 조회해온다.

3. HandlerAdapter handle() 호출

핸들러어댑터에 request,response,handler를 파라미터로 전달하고
핸들러어댑터는 각 핸들러(컨트롤러)의 로직을 호출하기 위한 입력을 세팅한다.
handler를 호출한다.

4. handler(Controller) 로직 수행

handler(Controller)의 비즈니스 로직을 수행하고 결과를 리턴한다.
model 또는 ModelAndView를 반환한다.

5. HandlerAdapter 리턴

컨트롤러 로직 수행후 반환되는 model, viewName 등을 ModelAndView에 담아 반환한다. ModelAndView가 직접 반환되면 그대로 반환한다. frontcontroller가 모든 컨트롤러의 반환을 공통적으로 처리할 수 있도록 한다.

6. viewResolver 호출

반환된 ModelAndView에서 viewName으로 view를 생성한다.

7. view.render() 호출

view에 request, response, model을 전달하여 모델의 데이터를 세팅하고 foward해서 결과 화면을 응답한다.

0개의 댓글