요구) 어떤 개발자는 member.do를 호출하면 MemberController가 아니고 UserController라고 네이밍함. 메소드는 이름이 다르지만 url규칙은 바뀔수 없음.
이때 if else로 하려고 생각했으나 클래스가 많을때 그것을 다 if else로 바꿀수 없음.
해결 방법 : 문서를 만들어서 저기에 알맞는 설정을 한 후 파서를 사용한다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HashMap<String,String> CheckName(String controllerName,String method,String check){
HashMap<Integer,String> map = new HashMap<Integer,String>();
HashMap<String,String> result = new HashMap<String,String>();
String name;
name = check.substring(check.lastIndexOf("/")+1,check.length());
try {
File file = new File("src/setting.xml");
DocumentBuilderFactory docBuildFact = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuild = docBuildFact.newDocumentBuilder();
Document doc = docBuild.parse(file);
doc.getDocumentElement().normalize();
NodeList changelist = doc.getElementsByTagName("changeInfo");
//Dom파서를 사용하는 부분.
for (int i = 0; i < changelist.getLength(); i++) {
Node changelistNode = changelist.item(i);
if (changelistNode.getNodeType() == Node.ELEMENT_NODE) {
Element changeElmnt = (Element) changelistNode;
NodeList exNameList= changeElmnt.getElementsByTagName("exName");
Element nameElmnt = (Element) exNameList.item(0);
Node exName = nameElmnt.getFirstChild();
map.put(1+(i*4), exName.getNodeValue());
NodeList classNameList = changeElmnt.getElementsByTagName("className");
Element classElmnt = (Element) classNameList.item(0);
Node className = classElmnt.getFirstChild();
map.put(2+(i*4), className.getNodeValue());
NodeList exMethodList= changeElmnt.getElementsByTagName("exMethod");
Element exMethodElmnt = (Element) exMethodList.item(0);
Node exMethod = exMethodElmnt.getFirstChild();
map.put(3+(i*4), exMethod.getNodeValue());
NodeList methodList= changeElmnt.getElementsByTagName("changeMethod");
Element methodElmnt = (Element) methodList.item(0);
Node changeMethod = methodElmnt.getFirstChild();
map.put(4+(i*4), changeMethod.getNodeValue());
if(map.get(1+(i*4)).equals(name)&& map.get(3+(i*4)).equals(method)){
result.put(className.getNodeValue(), changeMethod.getNodeValue());
return result;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Setting.xml-
<mapping>
<changeInfo>
<exName>member.do</exName>
<className>UserController</className>
<exMethod>update</exMethod>
<changeMethod>updateMember</changeMethod>
</changeInfo>
<changeInfo>
<exName>book.do</exName>
<className>LibiraryController</className>
<exMethod>create</exMethod>
<changeMethod>bookCreate</changeMethod>
</changeInfo>
</mapping>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<문제 1> 처음에 어떤 파서를 써야하는지 몰라서 DOM이라는 파서를 사용했다.
<문제 2> dom 파서는 자식과 부모가 있어서 xml에 엘리먼트값을 노드를 사용해서 받아와야하고 쓰는 방법도 어렵다.
<문제 3> 받아온값은 저장시킬 공간이 없어서 맵에 integer에 번호 string에 값을 넣어 값을 저장 시킴.
ex>String값을 두 개를 받아야 해서 <string,string>형 map사용.
<해결 3> 자료구조는 이렇게 쓰는 것이 아님. 처음에 파서를 쓰는 것이 잘못써서 쉽게 할 수 있는 것을 돌아갔고 올바른 파서를 쓰는것이 중요하다.
개선해야할것들
- 만약 다른 엘리먼트를 추가하려면 중복코드가 발생함.
- CheckName에 필요없는 파라미터를 넘기고exception이 나오면 null을 리턴하면 안됨.
- 메소드 이름 첫글자 네이밍.
- 호출될 때 마다 매번 파싱을해서 비효율적임.
- 직관적이지 못한 CheckName에 너무나 많은 일이 담겨있음.
- 코드의 중복도 막아야 하지만 런타임시 로직의 중복을 막는 것(파일입출력)이
더 중요.
- 리펙토링 해서 메소드를 각각 역할이 정확히 구분되게 나눔.
- String name; name = check.substring(check.lastIndexOf("/")+1,check.length());
String name = check.substring(check.lastIndexOf("/")+1,check.length());
콜스텍이 늘어나는 것은 좋지 않음.
- 자바는 ctrl+shift+o를 통해 자동 import됨.
- simpleframework를 파서로 써서 하면 될 듯.
<s></s>
'개발' 카테고리의 다른 글
jsp,servlet 한글 인코딩 문제,request.getCharacterEncoding, uri 한글 깨질때 해결법 (0) | 2016.07.05 |
---|---|
서블릿으로 Dispatchservlet 역할 구현하기-6 (0) | 2016.07.04 |
서블릿으로 Dispatchservlet 역할 구현하기-4(reflection) (0) | 2016.07.04 |
서블릿으로 Dispatchservlet 역할 구현하기-3 (reflection, method, invoke) (0) | 2016.07.04 |
서블릿으로 Dispatchservlet 역할 구현하기-2 (request.getRequestURI ,getParameter ) (0) | 2016.07.01 |