• 기본 Bean
      heaer, resultList 와 맵핑될 Bean Class가 업무별로 달라지므로 우선 HashMap에 담고, getter 에서 특정 Bean으로 컨버팅해준다.
  • 
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.commons.beanutils.BeanUtils;
    
    /**
     * DB 아니고 외부 인터페이스에서 받아온 정보
     * @auther ddakker 2013. 6. 12.
     */
    public class ExternalBean {
    
    	private String resultCode;
    	private String errMsg;
    
    	private Map header;
    	private List<Map> resultList;
    	public String getResultCode() {
    		return resultCode;
    	}
    	public void setResultCode(String resultCode) {
    		this.resultCode = resultCode;
    	}
    	public String getErrMsg() {
    		return errMsg;
    	}
    	public void setErrMsg(String errMsg) {
    		this.errMsg = errMsg;
    	}
    	public Map getHeader() {
    		return header;
    	}
    	public void setHeader(Map header) {
    		this.header = header;
    	}
    	public List<Map> getResultList() {
    		return resultList;
    	}
    	public void setResultList(List<Map> resultList) {
    		this.resultList = resultList;
    	}
    
    	/**
    	 * 헤더 정보를 특정 Bean에 담아 리턴한다.
    	 * @param clz
    	 * @return
    	 * @auther ddakker 2013. 6. 14.
    	 */
    	public <T> T getHeader(Class<T> clz) {
    		Object objBean = null;
    		try{
    			objBean = clz.newInstance();
    			BeanUtils.copyProperties(objBean, header);
    
    			return (T) objBean;
    		}catch(Exception e){
    			throw ExceptionManager.createException("JSON 데이터를 Bean으로 맵핑[Header]하는 도중 에러가 발생하였습니다." + e);
    		}
    	}
    
    	/**
    	 * 배열 정보를 특정 List<Bean>에 담아 리턴한다.
    	 * @param clz
    	 * @return
    	 * @auther ddakker 2013. 6. 14.
    	 */
    	public <T> List<T> getResultList(Class<T> clz) {
    		List<T> list = new ArrayList<T>();
    		try{
    			Object objBean;
    			for( Map map : resultList ){
    				objBean = clz.newInstance();
    				BeanUtils.copyProperties(objBean, map);
    
    				list.add((T) objBean);
    			}
    		}catch(Exception e){
    			throw ExceptionManager.createException("JSON 데이터를 Bean으로 맵핑[ResultList]하는 도중 에러가 발생하였습니다." + e);
    		}
    		return list;
    	}
    }
    

  • 헤더 Bean
      각 업무에 맞는 Bean을 생성한다.
  • public class UserHeaderBean {
    	private String userNm;
    
    	public String getUserNm() {
    		return userNm;
    	}
    
    	public void setUserNm(String userNm) {
    		this.userNm = userNm;
    	}
    }
    

  • 배열 Bean
      각 업무에 맞는 Bean을 생성한다.
  • public class ListBean {
    	private String dlvrAddr1;
    	
    	public String getDlvrAddr1() {
    		return dlvrAddr1;
    	}
    }
    

    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import net.sf.json.JSONObject;
    
    public class TestCase {
            @Test
    	public void jsonTestCase() {
    		String jsonStr = "{'resultCode':'success', 'errorMsg': '','header':{'userNm':'ddakker'},'resultList':[{'dlvrAddr1': '서울~'},{'dlvrAddr1': '충남~'}]}";
    		
    		Map classMap = new HashMap();
    		classMap.put("header", HashMap.class);
    		classMap.put("resultList", HashMap.class);
    
    		JSONObject json = JSONObject.fromObject(jsonStr);
    
    		ExternalBean exBean = (ExternalBean) JSONObject.toBean(json, ExternalBean.class, classMap);
    		
    		if( exBean.getResultCode().equals("success") ){
    			UserHeaderBean hBean = exBean.getHeader(UserHeaderBean.class);
    			System.out.println(hBean.geUserNm());
    								
    			List<ListBean> lBeanList = exBean.getResultList(ListBean.class);
    			System.out.println(lBeanList.size());
    			System.out.println(lBeanList.get(0).getDlvrAddr1());
    		}
    	}
    }
    
    • json-lib-2.4-jdk15.jar
    • ezmorph-1.0.6.jar
    • commons-lang-2.6.jar
    • commons-logging-1.1.3.jar
    • commons-collections-3.2.1.jar
    • commons-beanutils-1.8.3.jar
    import org.apache.commons.beanutils.BeanUtils;
    ..
    ..
    
    	public <T> T setParamegerBean(Class<T> clz) throws InstantiationException, IllegalAccessException, InvocationTargetException{
    		T t = clz.newInstance();
    		BeanUtils.copyProperties(t, ServletActionContext.getRequest().getParameterMap());
    		return t;
    	}
    
    import java.lang.reflect.Field;
    import org.apache.commons.beanutils.BeanUtils;
    ..
    ..
    
    public String intercept(ActionInvocation invocation) throws Exception {
        	log.info("---------- 파라미터 Bean에 셋팅 ----------");
    
        	Object action = invocation.getAction();
    
        	Field fs [] = action.getClass().getDeclaredFields();
        	for( Field f : fs ){
        		if( f.getName().indexOf("Bean") > 0 ){
        			String s [] = StringUtils.split(f.toString(), " ");
        			if( s.length == 3 ){
    	    			Class cls = Class.forName(s[1]);
    	    			Object obj = cls.newInstance();
    	    			BeanUtils.copyProperties(obj, ServletActionContext.getRequest().getParameterMap());
    	    	    	f.setAccessible(true);
    	    	    	f.set(action, obj);
        			}
        		}
        	}
        	return invocation.invoke();
        }
    

    우선 Spring AOP 에서 Proxy 를 사용하는데 두가지가 존재한다고 하네...

    1. JDK Dynamix Proxy    - Interface 가 존재해야 하고(Runtime 시점에 감싸주는거던데... 고로 야야야야야약간의 성능저하.??)
    2. CGLib Proxy             - 구현체만 있으면 됨..(Compile 시점에 감싸므로 성능저하 최소화)


    2번 방법으로 사용하려면 <aop:config proxy-target-class="true"> 셋팅이 필요함


    ex) 근데 Service Layer에서는 셋팅하지 않아도 정상적이였는데, Dao Layer에서는 문제가 생겼다.. 머징;;


    역시 지식이 너무 얕다.. ;; 

    삽질 무진장 했네


    [참고] https://groups.google.com/forum/?hl=ko&fromgroups=#!topic/ksug/pm2ET851V6U



    	
    	
    	
    
    	
    
    		
    			
    			
    			
    			
    			
    			
    		
    		
    
    	
    


    • *-servlet.xml 과 applicationContext.xml 설정 시 주의 점
      1. *-servlet.xml 에서 Controller Annotation 스캔 시 무조껀 Controller 만 함
      2. applicationContext.xml 에서는 Controller 를 제외 하고 스캔함
    • 위와 같이 하지 않을경우 둘의 상-하 상속관계에 따라서 applicationContext.xml 의 Bean이 사용되어지는것이 아니라 *-servlet.xml 의 Bean이 사용되어 진다고 함...
      그러므로 applicationContext.xml 에서 tx(Transaction)관련 설정을 해 놓아도 먹히지 않는 문제가 발생합니다.

    [*-servlet.xml]

    	
    		
    	
    
    [applicationContext.xml]


    	
    		
    	
    

    import java.io.FileOutputStream;
    import java.io.StringReader;
    
    import org.junit.Test;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.FontFactory;
    import com.itextpdf.text.html.simpleparser.HTMLWorker;
    import com.itextpdf.text.html.simpleparser.StyleSheet;
    import com.itextpdf.text.pdf.PdfWriter;
    
    
    public class TestCreatePDF {
    
    	@Test
    	public void htmlCreate() throws Exception {
    		// TODO Auto-generated method stub
    		String fontname = "d:\\GulimChe.ttf";
    		String filename = "d:\\filename.pdf";
    		
    		FontFactory.register(fontname);
    		StringBuffer sBuff = new StringBuffer("<html>");
    		sBuff.append("<head></head>");
    		sBuff.append("<body>");
    		sBuff.append("<table border=1>");
    		sBuff.append("<tr><td>Test worker <b>한글</b> 테스트</td><td>11<b>1</b>11</td></tr>");
    		sBuff.append("</table>");
    		sBuff.append("</body>");
    		sBuff.append("</html>");
    		StringReader stringReader = new StringReader(sBuff.toString());
    
    		Document document = new Document();
    		StyleSheet st = new StyleSheet();
    		st.loadTagStyle("body", "face", "굴림체"); 
    		st.loadTagStyle("body", "encoding", "Identity-H"); 
    		st.loadTagStyle("body", "leading", "12,0"); 
    		HTMLWorker worker = new HTMLWorker(document);
    		PdfWriter.getInstance(document, new FileOutputStream(filename));
    		document.open();
    		java.util.List<Element> p = HTMLWorker.parseToList(stringReader, st);
    		for (int k = 0; k < p.size(); ++k)
    		    document.add((Element)p.get(k));
    		document.close();
    	}
    
    }

    GulimChe.ttf

    itextpdf-5.4.0.jar


    [출처] http://blog.wooriaru.com/131163646


    DTD 부분 오타 있으면 발생하는군요....


    <?xml version="1.0" encoding="euc-kr" ?>

    <!DOCTYPE struts PUBLIC

        "-//Apahce Software Foundation//DTD Struts Configuration 2.0//EN"

        "http://struts.apache.org/dtds/struts-2.0.dtd">



    Apahce  ;;; --> Apache 흠.. 이 전에는 왜 잘 됐었지 ;; 어이 없네..(리얼도 잘 된다.. 왜 이려..)


    import org.junit.Test;
    
    public class ClassKindTestCase {
    	public interface ParentClass {
    		public void add();
    	}
    
    	@Test
    	public void innerClassTest(){
    		innerLocalClass("ddakker", 21);
    		innerAnonymousClass("ddakker", 22);
    	}
    	
    	// 로컬 클래스
    	public void innerLocalClass(final String name, final int age){
    		class ChildClass implements ParentClass {
    			@Override
    			public void add(){
    				System.out.println("[innerLocalClass] name=" + name + ", add age=" + age);
    			}
    		}
    		
    		ParentClass instance = new ChildClass();
    		executeMethos(instance);
    	}
    	
    	// 익명 내부클래스
    	public void innerAnonymousClass(final String name, final int age){
    		/*ParentClass instance = new ParentClass(){
    			@Override
    			public void add() {
    				System.out.println("[innerAnonymousClass] name=" + name + ", add age=" + age);
    			}
    		};
    		executeMethos(instance);*/
    		executeMethos(
    			new ParentClass(){
    				@Override
    				public void add() {
    					System.out.println("[innerAnonymousClass] name=" + name + ", add age=" + age);
    				}
    			}
    		);
    	}
    
    	// 실행(공통 분리)
    	public void executeMethos(ParentClass object){
    		object.add();
    	}
    	
    }
    

    [설정]

    struts.xml

    <struts>

    ...

    <constant name="struts.custom.i18n.resources" value="프로퍼티 파일명(확장자는 빼고, 국가 문자열 빼고(_ko 등)" />

    ...

    </struts>


    [JSP]

    ...

    <%@ taglib prefix="s" uri="/struts-tags" %>

    ...

    <s:text name="err.msg" />

    ...


    [Action]

    ...

    getText("err.msg"); // ActionSupport 를 상속받아야함

    ...

    oscache-2.3.2.jar 가 기존에 포함되어 있길래 재대로 활용해보았다.


    하지만 운영서버에서 서버가 버벅되다 죽는것이 확인되었다.


    이유를 못 찾는 와중에 WAS 시스템 엔지니어로 부터 OSCache문제라는 통보를 받았다 ㅠ


    구글링도 해보았지만 해결책을 쉽게 찾지 못 하였다.


    캐쉬 최대 갯수도 늘려보아도 소용이 없던 찰라에 oscache 버전을 최신으로 교체해보았다.


    결론은.. 원활하게 운영중이다..


    이런. ㅠㅠ


    현재 oscache-2.4.1.jar 버전으로 정상 가동중이다.


    + Recent posts