프레임워크를 사용하다보면 가장 큰 문제는 데이터 옮겨담기다.
예를 들어 ibatis에 리턴한 형태가 Map인데 이걸 다시 bean에 옮겨 담아야 한다면 불필요한 리소스를 사용하게 될것이다.
JSON방식으로 Ajax를 구현하면서 발생한 문제가 이거다.
실제로 ibatis에서 결과를 JSONObject형태로 받을 수 없기 때문이다.
resultClass로 JSONObject를 선언한다 하더라고 getter, settger가 없는 일반 Object이기 때문에 오류가 발생한다.
그렇다고 JSONObject가 Map을 implement하거나 HashMap을 상속받은 구조도 아니다.
결국 직접 사용하기 위해 만들어야 했다.
package com.atspeed;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.json.JSONObject;
public class JSONMap extends JSONObject implements Map{
@Override
public int size() {
// TODO Auto-generated method stub
return super.length();
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return (super.length()==0?true:false);
}
@Override
public boolean containsKey(Object key) {
// TODO Auto-generated method stub
return !super.isNull(key.toString());
}
@Override
public boolean containsValue(Object value) {
// TODO Auto-generated method stub
Iterator it = super.keys();
while(it.hasNext()){
String key = it.next().toString();
try {
if(super.get(key) == value){
return true;
}
} catch (Exception e) {
// TODO: handle exception
}
}
return false;
}
@Override
public Object get(Object key) {
// TODO Auto-generated method stub
try {
return super.get(key.toString());
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
public Object put(Object key, Object value) {
// TODO Auto-generated method stub
try {
return super.put(key.toString(), value);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
public Object remove(Object key) {
// TODO Auto-generated method stub
return super.remove(key.toString());
}
@Override
public void putAll(Map m) {
// TODO Auto-generated method stub ;
Iterator it = m.keySet().iterator();
while(it.hasNext()){
String key = it.next().toString();
try {
super.put(key, m.get(key));
} catch (Exception e) {
// TODO: handle exception
}
}
}
@Override
public void clear() {
// TODO Auto-generated method stub
Iterator it = super.keys();
while(it.hasNext()){
String key = it.next().toString();
super.remove(key);
}
}
@Override
public Set keySet() {
// TODO Auto-generated method stub
return null;
}
@Override
public Collection values() {
// TODO Auto-generated method stub
return null;
}
@Override
public Set entrySet() {
// TODO Auto-generated method stub
return null;
}
}
사실 구현해야할 몇가지 Map관련 함수는 빼먹었다.
이걸 사용하는 방법은
SqlMap.xml쪽에서
<typeAlias alias="JSONMap" type="com.atspeed.JSONMap"/>
<select id="json_list" parameterClass="Map" resultClass="JSONMap">
이것만 해주면 된다.
결론적으로 ibatis에서Map으로 인정받고 사용하는거다.
결국 Service나 Control단에서는 결과는 JSONMap으로 꺼내 사용하면되는것이고.
실제 JSONObject를 상속받았기 때문에 사용법은 JSONObject와 동일하다.
#SCMInno #에스씨엠이노 #WEBDeK
댓글 없음:
댓글 쓰기