Spring MVC

hyemin·2022년 2월 5일
0

Spring MVC

목록 보기
1/2
post-thumbnail

MVC 패턴

MVC 패턴은 하나의 서블릿이나, JSP로 처리하던 것을 컨트롤러(Controller)와 뷰(View)라는 영역으로 서로 역할을 나눈 것을 말한다.

컨트롤러

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

  • 컨트롤러에 비즈니스 로직을 둘 수도 있지만, 이렇게 되면 컨트롤러가 너무 많은 역할을 한다. 그래서 일반적으로 비즈니스 로직은 서비스(Service) 계층을 별도로 만들어서 처리한다.
  • 그리고 컨트롤러는 비즈니스 로직이 있는 서비스를 호출하는 것을 담당한다.

모델

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

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

FrontController

FrontContrller 패턴 특징

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받는다.
  • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출한다.
  • 입구를 하나로 만든다!!
  • 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.

스프링 웹 MVC의 DispatcherServlet이 FrontController패턴으로 구현되어 있다.

스프링 MVC 전체 구조

스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있으며, 스프링 MVC의 프론트 컨트롤러가 바로 디스패처 서블릿(DispatcherServlet)이다.

  • 핸들러 어댑터 : 중간에 어댑터 역할을 하는 것이다. 이 핸들러 어댑터 덕분에 다양한 종류의 컨트롤러를 호출할 수 있다.
  • 핸들러 : 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경한 것이다.
    • 어댑터가 있으므로, 꼭 컨트롤러의 개념 뿐만 아니라 어떠한 것이든 해당하는 종류의 어댑터만 있으면 다 처리할 수 있다.

동작 순서

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

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

HttpRequestHandler

핸들러 매핑과 어댑터를 더 잘 이해하기 위해서 HttpRequestHandler 핸들러(컨트롤러)는 서블릿과 가장 유사한 형태의 핸들러인데 이 핸들러를 알아보며 이해해 보자.

@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");
 }
}

/springmvc/request-handler 경로로 접근

1. 핸들러 매핑으로 핸들러 조회

  • HandlerMapping을 순서대로 실행해서, 핸들러를 찾는다.
  • 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는
    BeanNameUrlHandlerMapping이 실행에 성공하고 핸들러인 MyHttpRequestHandler를 반환한다.

2. 핸들러 어댑터 조회

  • HandlerAdaptersupports()를 순서대로 호출한다.
  • HttpRequestHandlerAdapterHttpRequestHandler인터페이스를 지원하므로 대상이 된다.

3. 핸들러 어댑터 실행

  • 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨준다.
  • HttpRequestHandlerAdapter는 핸들러인 MyHttpRequestHandler를 내부에서 실행하고, 그 결과를 반환한다.

매핑정보

  • @Controller : @Controller는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 렌더링된다.
  • @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
    따라서 실행 결과로 ok 메세지를 받을 수 있다. @ResponseBody 와 관련이 있는데, 뒤에서 더 자세히
    설명한다.



Reference

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1
김영한님의 스프링 MVC 강의를 수강하면서 작성한 글입니다.
틀린 부분 등 다양한 피드백 환영합니다.

profile
열심히 성장 중 :)

0개의 댓글