2011년 1월 6일 목요일

블로그 이사했어요

블로그를 티스토리로 이사했습니다.

이 블로그는 여러모로 불편한 점이 많네요.

이사한 주소는 이쪽입니다.^^

2010년 12월 28일 화요일

스크린샷

몇달 동안 혼자서 Gxt를 이용해 시스템을 구축해 보았다.
소감이라고 하면 결과물은 정말 최고~ 그러나 개발과정은
도움받 을 곳이 구글 밖에 없어서 참 힘들었던 것 같다.
암튼 담에 하라고 하면 더 잘할 수 있을 듯. . 그러나 개발시
수정하고 확인하고 하는 반복적인 작업에 소스가 많아지면
많아 질수록 시간이 걸리는 문제는 뭔가 해결책이 필요한듯
하다.

 


2010년 11월 4일 목요일

iWatch 아이폰과 손목시계가 하나로 ^^

이탈리아 ADR스튜디오에서 컨셉디자인으로 내놓은 iWatch란다.
아이폰도 없는 내가 아이폰보다 더 갖고 싶은 요놈은 아직 만들어지지도 않은
걍 컨셉이란다. Sony Ericson의 live view를 눈여겨 보다 live view가 안드로이드만
지원되다하여 아이폰쪽은 비슷한 물건이 없을까 해서 찾은 것이다.

빨랑 나왔음 좋으련만.. ^^

라이브뷰에 대한 기사는 여기

2010년 11월 3일 수요일

날자 형식의 표현

날자 형식을 표현할 경우 어떻게 되는지 알아보자.
1. 데이터베이스 테이블 필드의 type이 date이다. 이때는 시분초까지 저장되겠다.
2. rs.getDate("필드명")로 꺼내온다.
3. 꺼내온 값을 객체에 담아줄때 setter, getter메소드를 사용하는데 두개의 메소드도 아래와
 같이 date를 인자로 사용한다.
    public Date getBuy_dt() {     return (Date) get("buy_dt"); }
    public void setBuy_dt(Date buy_dt) { set("buy_dt", buy_dt); }
4. 화면에 보여줄 경우에 아래와 같은 코드가 들어간다.
ColumnConfig confirmDt    = new ColumnConfig("buy_dt", "구입일",120);
confirmDt.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd"));

이렇게 할 경우 grid나 다른 컴포넌트에서 년월일을 출력하게 된다.
그런데 년월일 뿐만 아니라 시분초까지 표현하고 싶어 setDataTimeFormat을 아래와 같이
수정하고 확인하니 시분초가 모두 00:00:00으로 찍힌다.
confirmDt.setDateTimeFormat(DateTimeFormat.getFormat("yyyy.MM.dd HH:mm:ss"));

삽질 좀 하다 나온 결론은 시분초까지 표현할 경우 서버쪽 코드인 rs.getDate("buy_dt:")
이부분을 아래와 같이 수정해주자.
// DateFormat
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// ResultSet를 객체에 저장
p.setBuy_dt(sf.parse(rs.getString("buy_dt")));

이제 아래와 같이 시분초가 표현되는 것을 확인할 수 있다.

2010년 10월 13일 수요일

파일 동기화 프로그램

회사에서 채용사이트를 오픈하려는데 문제가 발생했다고 한다.
문제인 즉은 2대의 서버를 운영하여 부하와 장애에 어는정도 대비 했는데
이미지가 문제란다. 이 이미지란 채용등록시 자기 사진을 업로드 하게 되는데
업로드시 서버 한대만 업로드가 되고 한대는 업로드가 안되어 이미지를 못보는 경우가 발생한다고 한다. 해서 문제해결을 위해서는 업로드시 나머지 한대에도 이미지를 같이 업로드해서 동기화 시키면 되는거 아니냐구 반문했다. 그런데 개발업체에서 못한다고 했단다.
우리 파트 일이 아니라 업체에 뭐라 하구 싶어두 참았다. 암튼 이미지 서버와 이미지 사이트용 도메인을 구매해야 하는지 검토해야한다고 해서 꼭 그렇게 해야하는지 의문스러워 해결방법을 생각해봤다.
일단 각 서버마다 이미지에 대한 싱크만 맞추면 되는 문제 아닌가!!
필요한 기능을 나열해 보면
1. app 프로그램을 못 고친다고 버티고 있으니 서버에 데몬을 띄워서 해결할 수 밖에 없다.
2. 이미지 폴더를 실시간으로 감시하고 있다가 이미지가 업로드 되면 나머지 하나의 서버에 이 이미지파일을 보내줘야 한다.
3. 어느쪽에 이미지가 업로드 될지 모르니 데몬은 양쪽 서버에 모두 설치해야한다.
4. 시간이 없으니 최대한 심플하게 갈수 있는 프로그램이여야 한다.
5. 데몬은 서버에 부하를 주지 말아야한다. (몰릴 때는 작은 부하도 문제가 될터..)


SQL 자리수 채우기

가끔 사번에 경우 숫자지만 앞쪽에 0으로 채워야 하는 경우가 있다.
이 때 lpad를 쓰는데 가끔 까먹어서 생각이 안나 찾곤했다. 간단한 거지만
급할때 생각안나면 곤란하니깐 정리해 놓자.


select lpad(sabun, 6, 0), sabun from OAD_RETIREMENT

이럼 좌측에 0을 붙어 총 6자리로 만들어 준다.

2010년 10월 8일 금요일

RpcRpoxy의 load메소드 내부에서 서비스 메소드콜에 대한 사용자 에러표시

1. 아래 소스는 일반적인 RpcProxy내의 load메소드 호출에 대한 예이다.
// RpcProxy 선언
private RpcProxy<BaseListLoadResult<LoginUserInfo>> proxy;

// RpcProxy 생성
proxy = new RpcProxy<BaseListLoadResult<LoginUserInfo>>() {
  public void load(Object loadConfig, 
                   AsyncCallback<BaseListLoadResult<LoginUserInfo>> callback) {
    service.getSystemGroupList((BaseListLoadConfig) loadConfig, param, callback);
  }
};
2. 그러나 위와 같은 경우 서버쪽에 어떤 문제가 발생하여도 Client쪽에 문제에 대해 알려줄 길이 없다. 이는 기본적으로 Rpc를 통해 서버 메소드를 호출할 경우 아래와 같이 코딩하는데 Proxy의 load메소드내에서는 아래와 같이 코딩하려면 어떻게 해야할 지 알아보자.
service.getSystemGroupList((BaseListLoadConfig) loadConfig, param,
                           new AsyncCallback<BaseListLoadResult<LoginUserInfo>>(){
  @Override
  public void onFailure(Throwable caught) {
      MessageBox.alert("Alert", caught.getMessage(), null);
  }
  @Override
  public void onSuccess(BaseListLoadResult result) {
    System.out.prinltn("성공");
  } 
});
3. 변경된 소스를 보자 new 연산자를 통해 AsyncCallback를 생성하였고 load메소드에서 인자로 받은 callback에게 내부의 onFailure(), onSuccess()메소드의 결과를 알려주도록 변경하였다. 단 load메소드의 AsyncCallback는 final로 변경해야한다.
proxy = new RpcProxy<BaseListLoadResult<LoginUserInfo>>() {
  public void load(Object loadConfig, final AsyncCallback<BaseListLoadResult<LoginUserInfo>> callback) {
    service.getSystemGroupList((BaseListLoadConfig) loadConfig, param, 
      new AsyncCallback<BaseListLoadResult<LoginUserInfo>>(){
      @Override
      public void onFailure(Throwable caught) {
        // load의 callback인자에게 throw된 에러를 전달해주자.
        callback.onFailure(caught);
        MessageBox.alert("Alert", caught.getMessage(), null);
      }
      @Override
      public void onSuccess(BaseListLoadResult<LoginUserInfo> result) {
        // load의 callback인자에게 결과를 전달해주자.
        callback.onSuccess(result);
      } 
    });
  }
};

4. 최종 수정된 코드를 실행해보자