저번에 이어 MVC 패턴에 대해 조금 더 자세히 공부한다.
- 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>
...
...
Dispatcher Servlet
에서 요청을 받았다.
그렇다면 처리를 위해서Controller
를 찾아야 하는데,
이 때 사용되는데Handler Mapping
이다.
Handler Mapping
이Controller
를 찾는 방법은 아래와 같다.
1.@Controller
라는 Annotation
2.com.spring.hwang
경로에 Controller.java 파일이 있어야 함. (testController.java
)
servlet.context.xml
파일에 명시되어 있음
Mapping 된
Handler
덕분에Controller
를 찾았다.
이 때Controller
와Dispatcher Servlet
이 서로 매칭해서 사용할 수 있게 하는 역할
Dispatcher Servlet에서 Controller
를 바로 실행할 수 없다.
=> 이를 해결하기 위해 Handelr Adapter가 규격을 맞춘다.
@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() {
}
/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>
회원정보를 저장할 때
Controller
는Spring
에 있는Container
에 저장하는데 이를Model
이라고 한다.
Model
에 저장할 때Model
을 직접 생성하지 않는다.
(ex)model = new Model()
=> (X)
Spring 에서는@Inject
,@Autowired
Annocation으로 명시해 줌으로서
별도의 객체 생성을 하지 않았다.
=> 이미 생성된 객체를주입
받아 사용한다.DI(Dependency Injection) 이라 한다.
이후 Dispatcher Servlet이 최종 jsp를 동적으로 만들어 내면서 Model에 있는 값을 빼오며 Response 하게 된다.
Model
이나View Resolver
에서 데이터를 전달하면View
가 클라이언트에게 응답한다.
URL Request
Dispatcher Servlet
에서 해당 요청을Controller
로 전달- 처리를 위해
Handler Mapping
을 통해Controller
가 어디 존재하는지 파악Handler Mapping
을 통해Controller
를 찾은 후Handler Adapter
로 규격을 맞춤- 규격을 맞춘 객체를
View Resolver
에 전달하거나Model
에 전달함.Model
에서는 객체를 별도로 생성하지 않고 이미 생성된 객체를주입
받아 사용
=>Dependency Injection(DI)
View
에 전달 후 사용자에게 보여짐