스프링 프레임워크의 모듈에는 웹 계층을 담당하는 모듈이 있다.
그중 Servlet API를 기반으로 클라이언트 요청을 처리하는 모듈을 스프링 웹 MVC라고 한다.
Servlet
클라이언트의 요청을 처리하도록 규약에 맞추어 작성하는 java 클래스 파일이다. 서블릿이 웹 애플리케이션으로 실행될 수 있도록 해주는 서블릿 컨테이너 중 하나가 아파치 톰캣이다.
MVC
Model-View-Controller 구조를 의미하며 애플리케이션 개발 디자인 패턴이다. UI 영역과 비즈니스 로직 영역으로 구분되기 때문에 서로에게 영향을 주지 않으며 개발 및 유지보수를 할 수 있다. 중복코드 제거 및 애플리케이션 확장성과 유연성이 높아진다.
Model
클라이언트 요청에 대한 처리 결과 데이터를 의미한다.
클라이언트의 요청 사항을 처리하는 영역을 서비스 계층(service layer)라고 하며 요청사항 처리를 위해 java로 구현한 것을 비즈니스 로직(business logic)이라고 한다.
View
Model을 이용하여 화면에 보이는 리소스를 제공하는 역할을 담당한다.
HTML 페이지 출력, PDF 등의 문서 출력, JSON 등 특정 형식의 포맷으로 변환 등의 기술이 포함되어 있다.
Controller
클라이언트의 요청을 직접적으로 전달받는 엔드포인트로, Model과 View의 중간에서 상호작용을 한다.
Model <-> Controller <-> View
Spring MVC 동작 흐름
클라이언트가 HTTP 요청 > Dispatcher Servlet이 (HttpServlet 상속받음) URL에 매핑된 Handler(Controller) 조회 > Handler를 실행할 수 있는 HandlerAdapter 조회 > 어댑터 실행 > 어댑터가 실제 핸들러를 실행 > 핸들러가 반환하는 정보를 ModelAndView(Model과 View Wrapping)로 변환하여 반환 > viewResolver 호출(처리 결과를 반영할 jsp 파일 탐색) > view 반환 > view 렌더링
Dispatcher-Servlet
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에게 위임하는 front controller
모든 요청을 핸들링해주고 공통 작업을 처리해주면서 url 매핑을 위해 일일이 web.xml에 등록하는 번거로움을 축소시켜주었다.
정적 자원(이미지, html, css, js)에 대한 요청마저 먼저 받아가는 바람에 정적 자원을 불러오지 못하는 상황이 발생하기도 한다 -> 정적 자원 요청과 애플리케이션 요청 분리 및 애플리케이션 요청을 탐색했을 때 없으면 정적 자원 요청으로 처리하는 등의 방법 제시 => /resources 주소로 접근하면 디스패처 서블릿이 관리할 수 없도록 구분하기
HandlerMapping
스프링에 작성된 여러 controller 중에서 로직을 수행할 controller를 확인하는 컴포넌트
Controller
개발자가 직접 개발하는 컴포넌트, http request를 처리하는 영역
Service
개발자가 직접 개발하는 컴포넌트, 비즈니스 로직을 처리하는 영역
View Resolver
view 이름을 기반으로 어떤 view 파일을 사용할 것인지를 확인하는 컴포넌트
View
개발자가 직접 개발하는 컴포넌트, UI 화면 영역