본문 바로가기

개발

서블릿으로 Dispatchservlet 역할 구현하기-5

요구어떤 개발자는 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>