자바2012. 1. 26. 19:46

이 장소를 Daum지도에서 확인해보세요.
서울특별시 강남구 삼성1동 | 코엑스
도움말 Daum 지도

'자바' 카테고리의 다른 글

12회 한국 자바 개발자 컨퍼런스  (5) 2012.01.26
객체를 Json 형태로 출력하기  (6) 2010.05.23
제10회 한국자바개발자 컨퍼런스  (0) 2009.02.05
Posted by 양군이당

댓글을 달아 주세요

  1. 시작하기 위해 내 배우자를 언급하고 새로운 설문 조사가 부가 확인란되고이 후 의견을 포함시킬 수 때 같은 검토를 고집 일부 메시지를 구입하는 동안 당신 - 알림을해서 교전이 동안. 아마 그러나 당신이 도움이됩니다 통해 멀리 데려다해야 있나요? 건배!

    2012.01.29 14:32 [ ADDR : EDIT/ DEL : REPLY ]
  2. 비밀댓글입니다

    2012.04.10 04:07 [ ADDR : EDIT/ DEL : REPLY ]
  3. 시작하기 위해 내 배우자를 언급하고 새로운 설문 조사가 부가 확인란되고이 후 의견을 포함시킬 수 때 같은 검토를 고집 일부 메시지를 구입하는 동안 당신 - 알림을해서 교전이 동안.

    2012.11.23 11:59 [ ADDR : EDIT/ DEL : REPLY ]
  4. <a href='http://blogtegal.com' title='blog tutorial'>blog tutorial</a> <a href='http://blogtegal.com/2011/10/cara-membeli-hosting-hostgator.html'>membeli hosting hostgator</a> <a href='http://blogtegal.com/category/hosting'>hosting</a>

    2013.02.06 23:41 [ ADDR : EDIT/ DEL : REPLY ]
  5. to very-very impressiv, ny0ng miki nemu nd0g lenggarangan sg kaya koen admin hehe


    http://googlemin.blogspot.com

    http://googlemin.blogspot.com/2013/01/bank-mandiri-bank-terbaik-di-indonesia.html

    2013.02.06 23:46 [ ADDR : EDIT/ DEL : REPLY ]

Database2010. 7. 2. 14:26
Oracle Table에 Timestamp Column에 Index 설정 후 해당 인덱스를 사용하여 Ordering 결과를 얻기 위해 Hint 를 주었을 경우 아무 조건절이 없으면 Order가 안되는 신기한 상황 발생.. ㅡ_ㅡ (기술 문서를 안 읽어봐서 정확한 이유는 확인하지 못했으나 당연히 될줄 알았던 것이 안되니 당황)

테이블 스키마와 인덱스 스키마는 아래와 같은 상황





일단 테스트

        SELECT 
           /*+ INDEX_DESC(T_MORI I_MORI_START_TIME) */
           MORI_NO, TITLE, TITLE_IMG, 
           MORI_TYPE, START_TIME, END_TIME, 
           SUBTITLE, SUBTITLE_IMG, MIN_CONTRACTOR, 
           MAX_CONTRACTOR, LIST_PRICE, DISCOUNT_PRICE, 
           DISCOUNT_RATE, CREATE_TIME, MODIFY_TIME, 
           AUTHOR_NO, DEPARTMENT_NO, SHORT_EXPLAIN
        FROM T_MORI
<Query 1>

위와 같이 Index Hint를 줬을 경우 START_TIME 을 기준으로 최근 시간의 결과값이 처음 나오는 결과를 기대했으나 결과는...


Index가 잘못되었나 싶어 Index Rebuild 실행도 해봤으나 결과는 동일... 다른 Index도 문제인가 싶어 Title Index를 이용한 Ordering 결과 확인

SELECT 
           /*+ INDEX_DESC(T_MORI I_MORI_TITLE) */
           MORI_NO, TITLE, TITLE_IMG, 
           MORI_TYPE, START_TIME, END_TIME, 
           SUBTITLE, SUBTITLE_IMG, MIN_CONTRACTOR, 
           MAX_CONTRACTOR, LIST_PRICE, DISCOUNT_PRICE, 
           DISCOUNT_RATE, CREATE_TIME, MODIFY_TIME, 
           AUTHOR_NO, DEPARTMENT_NO, SHORT_EXPLAIN
        FROM T_MORI
<Query 2>


기대한 결과가 정확히 나왔다...


Index가 제대로 안타는 것 같은 생각이 들어 Plan 확인.

<Query1 의 Plan 결과>

<Query2 의 Plan 결과>

이럴수가.. ㅡ_ㅡ Timestamp 컬럼에 Index를 건 것은 Hint 까지 줬음에도 불구하고 Index를 타지 않고 Full Scan을 한다. 반면 varchar2 컬럼 Index를 이용한 Select의 경우 Index를 정확히 타서 descending 까지 거쳐 결과를 추출해 내었다.. ㅡ_ㅡ

하지만 꿋꿋하게 Timestamp 값을 기준으로 결과를 얻어내기 위해 다시 테스트 돌입.

해당 컬럼에 비교값을 넣으면 어찌되었든 값을 비교해야 하므로 Index를 타지 않을까 하는 생각으로 해당 컬럼에 대한 조건값을 넣어봤음.

        SELECT 
           /*+ INDEX_DESC(T_MORI I_MORI_START_TIME) */
           MORI_NO, TITLE, TITLE_IMG, 
           MORI_TYPE, START_TIME, END_TIME, 
           SUBTITLE, SUBTITLE_IMG, MIN_CONTRACTOR, 
           MAX_CONTRACTOR, LIST_PRICE, DISCOUNT_PRICE, 
           DISCOUNT_RATE, CREATE_TIME, MODIFY_TIME, 
           AUTHOR_NO, DEPARTMENT_NO, SHORT_EXPLAIN
        FROM T_MORI
        WHERE START_TIME < '2010-10-01';






오홍~ 나이스.. 결과가 정확히 추출되었당. 어찌되었건 테이블 전체 Select 하는 상황이 아니므로 조건절을 주어 무조건 index를 한번 Access 하도록 하여 빠른 결과를 얻을 수 있었음.

결론! Timestamp Column 속성의 index 일 경우 조건절을 주어야 index를 타고 원하는 결과를 얻을 수 있다.
이 장소를 Daum지도에서 확인해보세요.
서울특별시 송파구 석촌동 | ITH
도움말 Daum 지도
Posted by 양군이당

댓글을 달아 주세요

  1. 난 그냥 제출하신 이메일 주소로 날 구독하시기 바랍니다. 나는 미래의 게시물에 대한 알림을 수신하고 싶습니다. 좋은 블로그와 좋은 게시합니다.

    2011.10.10 12:30 [ ADDR : EDIT/ DEL : REPLY ]
  2. 이것이 내가 이곳을 방문 처음이다. 나는 특히 토론, 블로그에 많은 흥미로운 물건을 발견했습니다. 기사에 대한 의견의 t에서, 제가 여기있는 모든 즐거움을 가진 유일한 사람이 아니 그런 것 같아요! 훌륭한 작품을 계속. <h1><a href="http://kadalmesir.blogspot.com/2012/08/sepeda-motor-bebek-injeksi-kencang-dan.html">Sepeda Motor Bebek Injeksi Kencang dan Irit Jupiter Z1</a></h1>

    2012.09.11 12:33 [ ADDR : EDIT/ DEL : REPLY ]
  3. 이 게시물에이 정보를 다시 보니 반갑 네요, 내가 같은 찾고 있지만 적절한 자원은 거기에 없었어요, 고맙습니다 이제 나는 내 연구를 찾고 있던 링크를 거십시오

    2012.09.11 12:33 [ ADDR : EDIT/ DEL : REPLY ]
  4. 이 논문은 내가 더 올바른 데이터를 얻기 위해 요금을 지불 할 필요가 많은 시간을 모르면하지 않으면 ME를 용이하게합니다.

    2012.10.12 03:44 [ ADDR : EDIT/ DEL : REPLY ]

자바2010. 5. 23. 04:00
출처 : http://devkkaok.tistory.com/92 까오기네집

요구사항 
결과값을 json 형태로 반환하기 
 
관련 라이브러리 
- ezmorph-1.0.6.jar
- json-lib-2.3-jdk15.jar
- commons-lang.jar
- commons-logging-1.1.jar
- commons-collections-3.2.jar
- commons-beanutils-1.8.0.jar
- commons-beanutils-bean-collections-1.8.0.jar
- commons-beanutils-core-1.8.0.jar

테스트에 앞서 dto 생성
package test.dto;

import java.math.BigDecimal;
import java.util.Date;

public class A {

    private String id;
    private int age;
    private Date credate;
    private BigDecimal iq;
    
    public A(String id, int age, Date credate, BigDecimal iq){
        this.id=id;
        this.age=age;
        this.credate=credate;
        this.iq=iq;
    }
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Date getCredate() {
        return credate;
    }
    public void setCredate(Date credate) {
        this.credate = credate;
    }
    public BigDecimal getIq() {
        return iq;
    }
    public void setIq(BigDecimal iq) {
        this.iq = iq;
    }

}

실재 처리 할 util 클래스

public class JsonUtil {
    public static String getJsonString(Object obj){
        if(obj == null) return null;
        return JSONObject.fromObject(obj).toString();
    }
}

테스트 클래스 
public class JsonTest {
    public static void main(String[] args) {
        // object test
        System.out.println(JsonUtil.getJsonString(getTestData()));
        // result : {"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}
    }

    private static Object getTestData(){
        A a = new A("kkaok", 20, new Date(), new BigDecimal(2010));
        return a;
    }
}

1. 기본 객체 테스트 
result :
{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}

2. java.util.Date type인 경우 conversion하기 
기본적인 테스트는 성공했는데 결과 값 중에 날짜가 영 맘에 안든다. 
날짜를 바꿔보기 ("yyyy-MM-dd HH:mm:ss.SSS")

JsonValueProcessor로 java.util.Date 타입인 경우 "yyyy-MM-dd HH:mm:ss.SSS" 형태로 결과를 보여 주도록 한다. 

package test.support;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;


public class JavaUtilDateJsonValueProcessor implements JsonValueProcessor {
    
    private final DateFormat defaultDateFormat;
    
    public JavaUtilDateJsonValueProcessor(){
        defaultDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.KOREA);
    }
    
    @Override
    public Object processArrayValue(Object paramObject,
            JsonConfig paramJsonConfig) {
        if(paramObject == null) return null;
        return defaultDateFormat.format(paramObject);
    }

    @Override
    public Object processObjectValue(String paramString, Object paramObject,
            JsonConfig paramJsonConfig) {
        return processArrayValue(paramObject, paramJsonConfig);
    }
}


util에 JsonConfig에 추가해 준다. 

public class JsonUtil {
    public static String getJsonString(Object obj){
        if(obj == null) return null;
        JsonValueProcessor beanProcessor = new JavaUtilDateJsonValueProcessor();
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.registerJsonValueProcessor(java.util.Date.class, beanProcessor);        
        return JSONObject.fromObject(obj, jsonConfig).toString();
    }
}

테스트 결과 
{"age":20,"credate":"2010-07-26 14:46:20.406","id":"kkaok","iq":2010}

괜찮게 나온다. 

3. 값이 null일때는 어떻게 나올까?

    public static void main(String[] args) {
        // object test
        System.out.println(JsonUtil.getJsonString(getTestData()));
        // result : {"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":46,"month":6,"seconds":19,"time":1280123179718,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010}
        // 날짜 꼬라지 하고는 바꾸자 
        System.out.println(JsonUtil.getJsonString2(getTestData()));
        // result : {"age":20,"credate":"2010-01-25 17:30:19.165","id":"kkaok","iq":2010}

        // null로 대충 채우고 확인 
        System.out.println(JsonUtil.getJsonString2(getTestData2()));
        // result : {"age":20,"credate":null,"id":"","iq":0}
    }
    
    private static Object getTestData2(){
        A a = new A(null, 20, null, null);
        return a;
    }

결과 : 
{"age":20,"credate":null,"id":"","iq":0}
없으면 없는대로 나온다. 

4. 객체 안에 객체를 필드로 가지고 있는 경우는 어떨까?
dto 추가
package test.dto;

public class B {

    public B(A a, String bid) {
        super();
        this.a = a;
        this.bid = bid;
    }
    private A a;
    private String bid;

    public A getA() {
        return a;
    }
    public void setA(A a) {
        this.a = a;
    }
    public String getBid() {
        return bid;
    }
    public void setBid(String bid) {
        this.bid = bid;
    }
    
}


테스트 
    public static void main(String[] args) {
        // 객체를 필드로 가지고 있는 객체 테스트1 
        System.out.println(JsonUtil.getJsonString2(getTestData3()));
        // result : {"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"}
    }
    private static Object getTestData3(){
        A a = new A("kkaok", 20, new Date(), new BigDecimal(2010));
        B b = new B(a, "aaaa");
        return b;
    }


5. Map인 경우는?
    public static void main(String[] args) {
        // map test 
        System.out.println(JsonUtil.getJsonString2(getTestData5()));
        // result : {"credate":"2010-07-26 14:57:04.468","test":{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"}
    }
    private static Object getTestData5(){
        Map map = new HashMap();
        map.put("test", getTestData3());
        map.put("name", "kkaok");
        map.put("credate", new Date());
        return map;
    }

6. list 테스트.

util에 JSONArray 추가 
public class JsonUtil {

    public static String getJsonString(Object obj){
        if(obj == null) return null;
        return JSONObject.fromObject(obj).toString();
    }

    public static String getJsonString2(Object obj){
        if(obj == null) return null;
        JsonValueProcessor beanProcessor = new JavaUtilDateJsonValueProcessor();
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.registerJsonValueProcessor(java.util.Date.class, beanProcessor);        
        return JSONObject.fromObject(obj, jsonConfig).toString();
    }

    public static String getJSONArrayString(Object objList){
        if(objList == null) return null;
        JSONArray jsonArray = JSONArray.fromObject(objList);
        return jsonArray.toString();
    }
}

테스트
    public static void main(String[] args) {
        // list test 
        System.out.println("6. "+JsonUtil.getJSONArrayString(getTestData6()));
        // result : [{"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"test":{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}]
    }
    private static Object getTestData6(){
        List list = new ArrayList();
        list.add(getTestData5());
        list.add(getTestData3());
        return list;
    }

List안에 객체랑 Map이랑 마구 섞어 놓아도 잘 된다. 


7. Map안에 List는 잘 처리 될까?

    public static void main(String[] args) {
        // map 안에 list test 
        System.out.println("7. "+JsonUtil.getJsonString2(getTestData7()));
        // result : {"credate":"2010-07-26 14:57:04.468","test":[{"credate":"2010-07-26 14:57:04.468","test":{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":"2010-07-26 14:57:04.468","id":"kkaok","iq":2010},"bid":"aaaa"}],"name":"kkaok"}
    }
    private static Object getTestData7(){
        Map map = new HashMap();
        map.put("test", getTestData6());
        map.put("name", "kkaok");
        map.put("credate", new Date());
        return map;
    }
잘 된다. ^^ 

8. List안에 List 담기 

    public static void main(String[] args) {
        // list 안에 list test 
        System.out.println("8. "+JsonUtil.getJSONArrayString(getTestData8()));
        // result : [[{"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"test":{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"},"name":"kkaok"},{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}],{"a":{"age":20,"credate":{"date":26,"day":1,"hours":14,"minutes":57,"month":6,"seconds":4,"time":1280123824468,"timezoneOffset":-540,"year":110},"id":"kkaok","iq":2010},"bid":"aaaa"}]
    }
    private static Object getTestData8(){
        List list = new ArrayList();
        list.add(getTestData6());
        list.add(getTestData3());
        return list;
    }

파싱할때 객체가 isArray 면 JSONArray를 이용하고 그외 나머지는 JSONObject를 이용하면 쉽게 변환이 된다. 
그외 conversion이 필요한 경우 JsonConfig에 등록해서 처리하면 된다. 
값을 처리하는 인터페이스는 JsonValueProcessor 이용하고 Bean을 처리하는 인터페이스는 JsonBeanProcessor 이용하면 된다. 
그외 인터페이스 참고 

'자바' 카테고리의 다른 글

12회 한국 자바 개발자 컨퍼런스  (5) 2012.01.26
객체를 Json 형태로 출력하기  (6) 2010.05.23
제10회 한국자바개발자 컨퍼런스  (0) 2009.02.05
Posted by 양군이당

댓글을 달아 주세요

  1. 아하하.. 삽질하다가 검색해서 좋은정보 얻어 갈께요 =_=ㅋ
    설마설마했는데 양군형 블로그로 오네요ㅋㅋㅋㅋㅋ

    2010.07.29 13:37 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 난 그냥 내가 정말 블로그처럼 정말 정말 버전 genious 기사 또는 블로그의 더 많은를 검토 수있는 나중에 돌려 보내 모든 사파리 주위 항목을 책 표시된 사용자 이름 glasscannonz 내부 Jumptag에서 추구를 위해이 사이트를 관찰 게시물!

    2011.10.23 04:26 [ ADDR : EDIT/ DEL : REPLY ]
  3. 지식을 공유하는 것은 재미이다. 당신은 어떻게 생각하십니까? 당신은 무엇을 쓰는 거죠?지식을 공유하는 것은 재미이다. 당신은 어떻게 생각하십니까? 당신은 무엇을 쓰는 거죠?
    http://kaos.web44.net

    2012.01.10 00:01 [ ADDR : EDIT/ DEL : REPLY ]
  4. 송승현

    라이브러리 build 하실 때, json-lib-2.2.2-jdk15.jar 랑 다른것도 해주셧나요??

    저는 안드로이드에서 build 해서 쓸려고 하는데요.

    Json 객체 만들려는데... java.lang.VerifyError: net.sf.json.JSONObject 가 계속 나서요..

    2012.01.11 17:14 [ ADDR : EDIT/ DEL : REPLY ]
  5. 감사합니다. 삽질하다가 좋은정보 얻어가네요^^

    2012.01.18 14:13 [ ADDR : EDIT/ DEL : REPLY ]
  6. 정보가 현명한을위한이 웹사이트는 매우 행복합니다. 이 웹사이트는 한 가지 목표로하고있다지만,이 웹 사이트는 모든 주제와 디자인의 사진을있습니다. 이 블로그를 정말 좋아하고 서비스를 사용하고 있습니다. 본 웹사이트는 당신이 원하는 특정 주제에 대한 정보의 많은 증명입니다. 그 정보는 사실과 특정 주제에 대한 좋은 언어를 사용하고 있습니다. 이 웹사이트에 대단히 감사입니다.

    2012.11.20 05:17 [ ADDR : EDIT/ DEL : REPLY ]