Chapter 5-3 ~ 5-4

ChangWoo·2023년 8월 6일
post-thumbnail

Part 5. 스프링 MVC의 기본 구조

5.3 스프링 MVC의 기본 사상

  • Servlet/JJP에서는 HttpServletRequest/HttpServletResponse라는 타입의 객체를 이용해 브라우저에서 전송한 정보를 처리하는 방식이다.
  • 스프링 MVC의 경우 이 위에 하나의 계층을 더한 형태다.
  • 스프링 MVC를 이용하게 되면 직접적으로 HttpServletRequest/HtppServletResponse 등과 같이 Servlet/JSP의 API를 사용할 필요성이 현저하게 줄어든다.
  • 스프링은 중간에 연결 역할을 하므로 이러한 코드 작성 없이 원하는 기능 구현이 가능하다.
  • 과거에는 스프링 MV의 특정한 클래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만, 스프링 2/5버전부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML 등의 설정만으로 개발이 가능하게 되었다.

5.4 모델2와 스프링 MVC

  • 모델2 방식은 '로직과 화면을 분리'하는 스타일의 개발 방식이다.
  • 모델 2방식은 MVC의 구조를 사용한다.
  • 모델 2방식에서 사용자의 Request는 특별한 상황이 아니면 먼저 Controller를 호출한다.
  • 이렇게 설계하는 이유는 나중에 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어 주기 때문이다.
  • 컨트롤러는 데이터를 처리하는 존재를 이용해 데이터(Module)를 처리하고 Response 할 때 필요한 데이터를 View 쪽으로 전달하게 된다.
  • Servlet을 이용하는 경우 이를 직접 처리해 왔지만 스프링 MVC는 내부에서 이런 처리를 하고, 개발자들은 스프링 MVC의 API를 이용해 코드를 작성한다.

스프링 MVC의 기본 구조


< 1 >

  • 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해 처리한다.
  • 생성된 프로젝트의 web.xml을 보면 아래와 같이 모든 Request를 DispatcherServlet이 받도록 처리하고 있다.
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

< 2, 3 >

  • HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해 존재한다.
  • HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping 같은 경우는 개발자가 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단하게 된다.
  • 적절한 컨트롤러가 찾아졌다면 HandlerMappingAdapter를 이용해 해당 컨트롤러를 동작시킨다.

< 4 >

  • Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성하게 된다.
  • 이 때 View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아 전달한다.
  • Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용하게 된다.

< 5 >

  • ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해 처리하는 것이 좋을지 해석하는 역할이다.
  • 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver이다.
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
</beans:bean>

<6, 7>

  • View는 실제로 응답 보내야 하는 데이터를 Jsp 등을 이용해 생성하는 역할을 하게 된다.
  • 만들어진 응답은 DispatcherServlet을 통해 전송된다.
  • 위의 그림을 보면 Request는 DispatcherServlet을 통하도록 설계되는데, 이런 방식을 Front-Controller 패턴이라 한다.
  • Front-Controller 패턴을 이용하면 전체 흐름을 강제로 제한할 수 있다.
  • Front-Controller 패턴을 이용하는 경우에는 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들 수 있다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글