Spring FrameWork 학습 시작
- 오늘 학원에서 spring 첫 시간이었다. 만약 Spring만 배웠다면 Spring이 왜 그렇게 돌아가는지를 잘 몰랐을 거 같은데
- servlet부터 struct1,2를 거쳐서 spring을 배우니까 100% 다 이해하지는 못해도 왜 이런 흐름으로 구성을 했는지, frontController를 왜 만드는지 이해는 갔다.
- 아마 선배 개발자들의 어마어마한 고민이 있었을 것 같다.
Srping FrameWork에서 dispatcherServlet의 역할
- 며칠 전에 인프런에서 김영한님의 스프링부트 강의를 들었다. 역시 유명한 분은 이유가 있었다. 잘 가르치시더라.
- 여튼 배우면서 이것저것 이론을 설명해주는데 가장 기억에 남았던 클라이언트의 요청이 왔을 때 실행 순서 부분이었는데
- 오늘 학원에서 Spring 첫 시간에 dispatcherServlet을 배우면서 좀 더 이해가 갔다.
- 그림으로 설명하자면 이렇다.
dispatcherServlet의 frontcontroller로서의 역할
- 클라이언트로부터 요청이 오면 was인 tomcat이 요청을 spring 컨테이너로 보낸다. 이때 spring 컨테이너로 보내진 모든 요청을 dispatcherServlet이 받는다.
- 그리고 dispatcherServlet은 해당 요청을 처리할 컨트롤러에게 매핑시킨다.
- 컨트롤러는 받은 요청을 처리(비즈니스 로직) 하고 필요한 모델(데이터)를 반환한다.
- dispatcherServlet는 처리된 모델을 보여줄 화면을 viewResolver에게 요청해서 매핑시킨다.
- view는 클라이언트에게 보여줄 화면을 처리해서 반환한다.
- 클라이언트에게 응답.
- 여기서 2번과 4번은 보통 미리 매핑이 되어있다고 생각하면 된다. 매핑하는 방법은 직접 bean으로 등록을 하거나 어노테이션을 이용하는 방법이 있다고 배웠다.
dispatcherServlet는 직관적이다.
- 김영한님 강의와 학원 강의를 다 들으면서 느낀건데 이 frontController 방식은 상당히 직관적이라서 이해하기 쉬운 것 같다.
- frontcontroller pattern 이라고 하는 걸 보면 아마 다른 여러가지 방식이 있는 듯하다.
- 학원에서 배운 것 모든 것이 이해되는 것은 아니지만 최대한 흐름을 따라가려고 노력해야겠다.
- 개인적인 생각이지만 백엔드는 결국 흐름을 파악하는 것이 중요한 것 같다.
web.xml 과 dispatcher-servlet 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//생략..
<!-- Spring 환경설정 -->
<servlet>
<servlet-name>dispatcher</servlet-name> //3
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> //4
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name> //2
<url-pattern>*.action</url-pattern> //1
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
//생략...
|
- web.xml 파일
- 다른 부분은 중요하지 않아서 생략하고 *.action으로 요청이 들어왔을 때의 요청 이름을 dispatcher라고 선언하고 그 이름을 가진 servlet-class를 찾아간다.
- 1, 2, 3, 4 순서로 동작한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
//생략...
//2
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
//1
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value ="1"/>
<property name="alwaysUseFullPath" value = "true"/>
<property name="mappings">
<props>
<prop key="/test/write.action">listFormController</prop>
<prop key="/test/write_ok.action">listController</prop>
<prop key="/test1/login.action">loginController</prop>
<prop key="/test2/mem.action">memController</prop>
<prop key="/multi/*.action">multiTestController</prop>
</props>
</property>
</bean>
<bean id="propsResolver" class = "org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/multi/list.action">list</prop>
<prop key="/multi/view.action">view</prop>
</props>
</property>
</bean>
<bean name = "multiTestController" class="com.test3.MultiTestController">
<property name="methodNameResolver" ref="propsResolver"></property>
</bean>
<bean name = "memController" class="com.test2.MemController">
<property name = "pages">
<list>
<value>test2/mem1</value>
<value>test2/mem2</value>
<value>test2/mem3</value>
</list>
</property>
</bean>
<bean name="authenticator-ref" class="com.test1.LoginAuthenticatorImpl"/>
<bean name="loginController" class = "com.test1.LoginController">
<property name="authenticator" ref="authenticator-ref"/>
<property name="commandClass" value="com.test1.LoginCommand"/>
<property name="commandName" value = "loginCommand"/>
<property name="formView" value="test1/login"></property>
</bean>
<bean name="listFormController" class="com.test.ListFormController"/>
<bean name="listController" class="com.test.ListController"/>
//생략...
|
- dispatcher-servlet.xml 파일
- 여러 코드가 있지만 결국에 중요한 것은 위에서 설명한 dispatcherServlet의 동작 과정 중 2번과 4번이 위 코드에서 주석1 주석2 이다.
- 주석 1번이 컨트롤러를 매핑시킨 handler이고 주석2번이 controller의 처리 결과로 나온 데이터를 보여줄 view에 매핑 시켜주는 handler이다.
마무리
- 조금 어렵다고 느껴졌다. 근데 정말 쉬운 것보다 훨씬 재밌는 것 같다. 수업 시간에도 뭔가 어렵다고 느껴지지만 재밌어서 조금 즐거웠다.
Leave a comment