MVC 란?
mvc는 model, view, controller 계층으로 나누어 하나의 요청을 처리하는 아키텍처입니다. 각 계층은 프레젠테이션 계층의 구성요소 정보를 담은 모델, 그리고 화면 출력 로직을 담은 뷰, 마지막으로 요청을 제어하는 컨트롤러의 역할을 수행합니다.
스프링에서 이러한 mvc 아키텍처를 프론트 컨트롤러 패턴과 함께 사용합니다. 프론트 컨트롤러(front controller) 패턴은 중앙집중현 컨트롤러를 제일 앞에 두어 모든 요청을 이 컨트롤러를 통해 선행하여 처리한 후 적절한 세부 컨트롤러에 작업을 위임해주는 방식입니다. 요청에 공통되는 부분을 프론트 컨트롤러로 처리한 후 적절한 세부 컨트롤러를 찾아 나머지 작업을 부탁하고 이 세부 컨트롤러를 작업을 모든 처리한 후 적절한 뷰를 선택하여 응답을 보내주는 로직으로 이루어집니다.
스프링에서는 프론트 컨트롤러의 역할을 DispatcherServlet이 수행합니다.
과정
그렇다면 클라이언트가 요청을 보냈을 때 스프링이 어떤 방식으로 요청을 처리하는지 과정을 알아보겠습니다. 과정은 다음과 같이 7단계로 이루어져 있습니다.
- DispatcherServlet의 HTTP 요청 접수
- DispatcherServlet에서 컨트롤러로 HTTP 요청 위임
- 컨트롤러의 모델 생성과 정보 등록
- 컨트롤러는 요청을 위임받으면 먼저 사용자 요청을 해석한 후, 그에 따라 서비스 계층에 비지니스 로직을 수행하도록 작업을 위임하 고 반환된 결과로 모델을 생성합니다. 정보 등록은 모델을 정보를 넣어주는 것을 의미합니다. 모델은 보통 맵에 담긴 정보입니다. 이
름과 오브젝트 값의 쌍으로 만들어진다는 것을 기억합시다. - 컨트롤러의 결과 리턴 (모델, 뷰)
- DispatcherServlet의 뷰 호출
-컨트롤러에게 받은 결과를 갖고 프론트 컨트롤러는 뷰에게 모델을 전달하며 클라이언트에게 보여줄 화면을 생성해달라 요청합니다. - 모델 참조
-뷰는 모델을 참조해서 최종 결과물을 생성합니다. - HTTP 응답 돌려주기
-마지막으로 DispatcherServlet은 뷰가 만들어준 HttpServletResponse에 담긴 결과를 서블릿 컨테이너에게 돌려줍니다. 서블릿 컨테이너는 받은 오브젝트를 바탕으로 HTTP 응답을 만들어 사용자에게 전송하고 작업을 종료합니다.
이러한 일련의 과정을 이해하고 MVC 프레임워크를 익힌다면 이해하기가 좀더 수월할 거 같습니다!
@RequestMapping
위에서 설명한 것과 같이 DispatcherServlet은 알맞은 컨트롤러에 요청을 위임할때 핸들러 매핑과 핸들러 어댑터를 사용합니다. 어떤 컨트롤러에 들어온 요청인지 판별하기 위해 사용되는 매핑 정보와 그 정보를 토대로 컨트롤러에게 전달해주는 도구라고 생각하면 됩니다.
기존의 스프링은 이러한 핸들러 매핑과 핸들러 어댑터의 대상이 하나의 타입이 되었습니다. 하지만 스프링 2.5부터 어노테이션이 적극적으로 사용되며 메소드 대상으로 변환되었습니다. 그렇게 되면 많은 컨트롤러는 하나의 메소드가 아닌 여러 메소드를 통해 요청을 처리할 수 있게 됩니다. 이러한 역할을 수행할 수 있도록 하는 핸들러 매핑은 DefaultAnnotationHandlerMapping입니다.
DefaultAnnotationHandlerMapping는 매핑 정보로 @RequestMapping 어노테이션을 활용합니다. @RequestMapping은 타입에도, 메소드에도 적용될 수 있습니다. 타입에는 메소드에 공통으로 적용될 정보를 @RequestMapping를 통해 작성해줍니다. 그 후 메소드에 세부화된 정보를 엘리먼트를 통해 작성해줍니다.
@RequestMapping의 엘리먼트는 다음과 같습니다.
- String[] value() : URL 패턴
- RequestMethod[] method() : HTTP 요청 메소드
- String[] params() : 요청 파라미터
- String[] headers() : HTTP 헤더
이러한 상세정보를 설정하여 메소드 레벨에서 매핑정보에 맞게 요청을 전달해줄 수 있습니다. 사실 최근에는 @PostMapping, @GetMapping과 같은 HTTP 요청 메소드를 기본으로 설정하여 사용할 수 있는 어노테이션을 많이 사용합니다. 기회가 된다면 다음에는 이러한 어노테이션에 대해 기록하도록 하겠습니다!!