Spring MVC 패턴 2

황시준·2022년 12월 24일
0

저번에 이어 MVC 패턴에 대해 조금 더 자세히 공부한다.

1. Dispatcher Servlet

  • Spring 서버를 열고 Request 요청을 하게되면 맨 앞에서 어떤 작업을 할지 처리해 주는 역할을 하는게 Dispatcher Servlet 의 역할이다.
    Dispatcher Servlet 은 별다른 처리를 하지 않는다.
    (처리는 Controller가 함.)

web.xml

...
...
<!-- Processes application requests -->
<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>
...
...

2. Handler Mapping

Dispatcher Servlet 에서 요청을 받았다.
그렇다면 처리를 위해서 Controller를 찾아야 하는데,
이 때 사용되는데 Handler Mapping 이다.

Handler MappingController 를 찾는 방법은 아래와 같다.
1. @Controller 라는 Annotation
2. com.spring.hwang 경로에 Controller.java 파일이 있어야 함. (testController.java)

servlet.context.xml 파일에 명시되어 있음

3. Handler Adapter

Mapping 된 Handler덕분에 Controller를 찾았다.
이 때 ControllerDispatcher Servlet이 서로 매칭해서 사용할 수 있게 하는 역할

Dispatcher Servlet에서 Controller를 바로 실행할 수 없다.
=> 이를 해결하기 위해 Handelr Adapter가 규격을 맞춘다.

4. View Resolver

	@RequestMapping("/test.do")
	public String test() {
		return "test";
	}

위와 같은 코드를 통해 test.jsp 로 연결되게 된다. 이때 return test로 했음에도 test.jsp로 이동해주는 역할을 한다.
해당 내용은 servlet-context.xml에 저장되어 있다.

그리고 위 코드는 이렇게도 작성해도 View Resolver 덕분에 똑같이 동작한다.

	@RequestMapping("/test.do")
	public void test() {
	}

5. ViewResolver

/WEB-INF/spring/test.jsp와 같이 경로를 추가해 주는데 이런 역할을 해 주는게
ViewResolver 객체임.

Conrtroller에서 view name or Model을 return 한다.
view name인 test를 return 한다고 했을 때
/WEB-INF/spring/로 경로를 추기해 주는데 이런 역할을 해 주는게
ViewResolver 객체이다. (servlet-context.xml에 있음)

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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. Model

회원정보를 저장할 때 ControllerSpring에 있는 Container에 저장하는데 이를 Model이라고 한다.

Model에 저장할 때 Model을 직접 생성하지 않는다.
(ex) model = new Model() => (X)
Spring 에서는 @Inject , @Autowired Annocation으로 명시해 줌으로서
별도의 객체 생성을 하지 않았다.
=> 이미 생성된 객체를 주입받아 사용한다.

DI(Dependency Injection) 이라 한다.

이후 Dispatcher Servlet이 최종 jsp를 동적으로 만들어 내면서 Model에 있는 값을 빼오며 Response 하게 된다.

7. View

Model이나 View Resolver에서 데이터를 전달하면 View가 클라이언트에게 응답한다.

정리

  1. URL Request
  2. Dispatcher Servlet에서 해당 요청을 Controller로 전달
  3. 처리를 위해 Handler Mapping 을 통해 Controller가 어디 존재하는지 파악
  4. Handler Mapping을 통해 Controller를 찾은 후 Handler Adapter로 규격을 맞춤
  5. 규격을 맞춘 객체를 View Resolver에 전달하거나 Model 에 전달함.
  6. Model에서는 객체를 별도로 생성하지 않고 이미 생성된 객체를 주입받아 사용
    => Dependency Injection(DI)
  7. View에 전달 후 사용자에게 보여짐

profile
하고싶은게 많은 newbie

0개의 댓글