2011년 1월 4일 화요일

ibatis JSON 연동

프레임워크를 사용하다보면 가장 큰 문제는 데이터 옮겨담기다.

예를 들어 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

댓글 없음: