숑숑이의 개발일기
article thumbnail

Spring MVC란?

어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리한 것으로, 컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치치 않아 유지보수에 용이하다. 또한, 컴포넌트간의 결합성이 낮아 프로그램 수정이 용이하다.

 

  • Model : 로직(Business & DB)을 처리하기 위한 모든 것으로 Cotroller로 부터 넘어온 data를 이용하여 이를 수행후 그에 대한 결과를 다시 controller에 리턴한다. (Dao, Service)
  • View : 모든 화면 처리를 담당한다. Client의 요청에 대한 결과뿐 아니라 controller에 요청을 보내는 화면단도 jsp에서 처리한다. 결과 출력을 위한 코드만 존재한다. (JSP)
  • Controller : Client의 요청을 분석하여 로직처리를 위한 Model을 호출한다. 리턴 받은 결과 data를 필요에 따라 request, session에 저장하고 redirect 또는 forward 방식으로 jsp page(view)를 이용하여 출력한다. (Servlet)

 

Spring MVC의 구성요소

구성요소 설명
DispatcherServlet
(Front Controller)
모든 클라이언트의 요청을 전달받는다. Controller에게 클라이언트의 요청을 전달하고 Controller가 리턴한 결과값을 View에게 전달하여 응답을 생성
HandlerMapping 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정
DispatcherServlet은 하나 이상의 핸들러 매칭을 가질 수 있음
Controller 클라이언트의 요청을 처리 후 Model을 호출, 결과를 DispatcherServlet에 리턴
ModelAndView Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
ViewResolver Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정
View Controller의 처리 결과를 보여줄 응답화면을 생성

 

Spring MVC에서 HTTP 요청의 흐름

Spring MVC에서는 Front Controller(=DispatcherServlet) 패턴을 적용한다. DispatcherServlet이 어떻게 요청을 매핑하고 MVC 패턴을 적용할까?

  1. 요청이 들어온다.
  2. Handler Mapping을 통해 매핑할 핸들러를 찾는다. (실행할 컨트롤러)
  3. 찾아낸 핸들러를 실행시킬 수 있는 Handler Adapter를 찾는다.
  4. Handler Adapter를 실행시킨다. (여기서 컨트롤러가 실행되어 서비스 로직이 돌아간다)
  5. 결과값으로 나온 Model이 생성되고, 선택한 View의 이름을 반환한다.
  6. 반환값의 View 이름을 가지고 View Resolver에서 해당 View 오브젝트를 찾아 Model과 데이터 바인딩 시킨다.
  7. 최종적으로 완성된 View를 DispatcherServlet이 반환한다.

ViewResolver에 따라 JSP나 Thymeleaf와 같은 템플릿 엔진을 선택할 수 있다. 

default 뷰 리졸버는 InternalResourceViewResolverJSP를 뷰로 사용한다. Thymeleaf를 사용하고 싶다면 뷰 리졸버에 ThymeleaftViewResolver를 추가해주면 된다.

 

Rest API에서 반환되는 json은 어떻게 만들어지는 것일까?

CSR이 등장하며 요즘 스프링은 Rest API 형태로 많이 사용된다. Rest API에서 반환되는 json은 HandlerAdapter에서 뷰 리졸버가 아닌 MessageConverter가 동작한다.

 

 

https://velog.io/@jihun333/SpringSpring-MVC-요청-흐름
https://java-is-happy-things.tistory.com/40
https://hanjo8813.github.io/spring/4/
profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다