Mini project

[Mini project]02.Model2MVCShop(stu)(2) - 환경파일분석

양승길 2016. 7. 11. 18:19

[Mini project]01.Model2MVCShop(stu)(1) - 환경파일분석


Dynamic Web Project를 분석하기 위해서 가장 먼저 파악해야 될 것은 사용된 

Dependency Library와 환경파일(web.xml)이다.

본 프로젝트 01번은 파일 업로드를 돕는 Library와 DB를 연결하는 ojdbc만 존재하므로 

넘어가고, web.xml을 먼저 보도록 한다.


- web.xml

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    metadata-complete="true" version="3.0">
 
    <!-- 프로젝트 어디서인가 pageSize 혹은 pageNumber를 부른다면 3, 4가 호출된다.
         이들을 메타데이터라 부른다. 
         메타데이터의 사용목적은 변경에 용이하도록 하는 유지보수에 있다.
         즉, pageSize를 3에서 6으로 변경하고 싶다면 이를 사용하는 모든 곳에서
         3에서 6으로 바꿀 필요 없이 여기서 바꾸면 시간면에서 매우 효율적이다. -->
    <context-param>
        <param-name>pageSize</param-name>
        <param-value>3</param-value>
    </context-param>
 
    <context-param>
        <param-name>pageNumber</param-name>
        <param-value>4</param-value>
    </context-param>
 
    <!-- 
    filter는 CS간에 HTTP방식의 요청이나 응답에 대하여 원활하게 처리하도록 돕는 객체다.
    사용방법은 참조할 Bean을 지정하고 그것을 이용하여 mapping을 지정하는 것이다.
    아래에 지정된 필터는 com.model2.mvc.filter라는 package에 RequestFilter라는 Bean을 참조한다는 의미다.    
    참조된 Bean을 이용해서 Mapping할 것이라고 선언하는 의미인데, url-pattern을 한번 분석해 보도록 한다.
    먼저 이름을 requestFilter인 만큼, 사용자가 요청한 url을 서버가 보고 그에 대해 맞는 필터링을 취할 것이다.
    지정된 패턴을 보면 /* 로 되어있다. 이는 모든 url의 문자를 필터로 취하겠다는 의미다.
    -->
    <filter>
        <filter-name>requestFilter</filter-name>
        <filter-class>com.model2.mvc.filter.RequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
    <!-- 
    
    사용자가 요청한 url에 따라 서버는 그에 맞는 행동을 취해야 된다. 이를 Action이라 하는데,
    모든 행동들을 Bean으로 만들었을때, 일일이 이곳에 지정하면 비효율적이다.
    따라서 요청한 url을 분석하고 걸맞는 Action을 취하게 만드는 중재자가 필요하다.
    그 중재자 하나만 등록한다면 환경파일의 줄수는 상당히 줄게 될것이다.
    그 중재자 bean을 ActionServlet이라 부를것이다.
    그렇다면 그 많은 url에 대하여 지정된 행동을 호출하기 위해서 무언가가 필요하다.
    ActionServlet이 요청받은 url을 분석하고 그 결과를 이용, 그 무언가를 참조해서 요청에 맞는 행동을 취한다.
    그 무언가는 바로 메타데이터이고 걸맞는 파일은 .properties다.
    .properties에 모든 행동들을 key, value 형식으로 등록하면 ActionServlet은 이를 파악해서
    사용자의 요청에 따른 알맞는 행동을 취하도록 해준다.
    어쨌든 저쨌든 이를 위한 등록은 아래처럼 한다.
    -->
 
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>com.model2.mvc.framework.ActionServlet</servlet-class>
        <init-param>
            <param-name>resources</param-name>
            <param-value>com/model2/mvc/resources/actionmapping.properties</param-value>
        </init-param>
    </servlet>
 
 
    <!--
    사용자가 요청한 url과 해당되는 행동을 연결하기 위한 mapping element이다.
    경로를 포함하거나 그렇지 않거나, 이름까지 정확하게 지정할 것인가?
    [/경로]/이름  이라고 지정한다.
    경로까지만 정확하게 지정할 것인가?
    /[경로]/*    이라고 지정한다.
    확장자만 정확하게 지정할 것인가?
    *.확장자      이라고 지정한다.
    가령 아래처럼 *.do라고 지정하면 앞에 무슨 경로가 있던지간에 다 받겠다는 의미이다.
    다만 설정할 때, *.do앞에 /를 쓸 수 없다.
    -->
 
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
 
 
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
    </welcome-file-list>
</web-app>
cs



환경파일에 지정한 것들이 무엇을 의미하는지 파악했다면 해당되는 Bean을 분석한다.

먼저 filter를 보도록 한다.

 - RequestFilter.java

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
package com.model2.mvc.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
public class RequestFilter implements Filter {
 
    public void init(FilterConfig arg0) throws ServletException {
    }
    
    // filter란 interface를 사용한 결과이다.
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
 
        // euc-kr로 해당 url을 encoding 하려는 모양이다.
        arg0.setCharacterEncoding("euc-kr");
 
        // filter chain은 차후 분석해 보련다.
        arg2.doFilter(arg0, arg1);
    }
 
    public void destroy() {
    }
}
cs



ActionServlet.java를 분석하기에 앞서, 기재된 actionmapping.properties의 일부를 한번 보도록 한다.


- actionmapping.properties

1
/checkDuplication.do=com.model2.mvc.view.user.CheckDuplicationAction
cs

사용자가 /checkDuplication.do라는 요청이 왔다면,

서버는 com.model2.mvc.view.user라는 package에 있는 CheckDuplicationAction.java에서 알맞는

행동을 취할 것이다.


- ActionServlet.java

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
package com.model2.mvc.framework;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.model2.mvc.common.util.HttpUtil;
 
 
public class ActionServlet extends HttpServlet {
    
    // 같은 package에 RequestMapping이란 Bean이 있는데
    // 설명하기에 시간이 매우 소요되니 간단히 설명토록 한다.
    // .properties 에 지정된 key, value에 알맞는 것을 확인토록 하고
    // 그에 맞는 Action이란 Bean을 뽑아낸다.
    private RequestMapping mapper;
 
    @Override
    public void init() throws ServletException {
        super.init();
        String resources=getServletConfig().getInitParameter("resources");
        mapper=RequestMapping.getInstance(resources);
    }
 
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)     throws ServletException, IOException {
        
        // 해당 URL을 파싱한다.
        // 이는 actionmapping에 기재된 /*.do 로 변경될 것이다.
        String url = request.getRequestURI();
        String contextPath = request.getContextPath();
        String path = url.substring(contextPath.length());
        System.out.println("\nActionServlet - service Starts\npath : " + path);
        
        try{
            // 알맞는 Action을 가져왔다면 그에 맞는 행동을 취하도록 하고
            Action action = mapper.getAction(path);
            action.setServletContext(getServletContext());
            String resultPage=action.execute(request, response);
            String result=resultPage.substring(resultPage.indexOf(":")+1);
            System.out.println("resultPage : " + resultPage);
            System.out.println("result : " + result + "\nActionServlet - service Ends\n");
            
            
            // 응답 방식에 따라 클라이언트에게 전달토록 한다.
            // HttpUtil에 기재된 내용은 forward, redirect를 판단하여 행동하도록 구현되어있다.
            if(resultPage.startsWith("forward:"))
                HttpUtil.forward(request, response, result);
            else
                HttpUtil.redirect(response, result);
            
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
cs