Apache Commons IO 라이브러리

아파치 소프트웨어 재단에서 제공하는 자바 기반의 오픈소스 중  Commons IO 라이브러리가 있습니다. 얼마전 고객과의 미팅을 통해 요구사항을 파악하던 중.. 예상치 못한 기능을 요청받았고 이 기능을 기존 시스템에 추가하려면 상당한 코딩을 해야 할 상황에서 요긴하게 사용한 라이브러리 중에 하나입니다.

사용자 삽입 이미지
이  Commons IO 라이브러리는 기존의 JDK에서 제공하는 클래스들에 대해서 자주 사용하는(Commons 한) 기능들을 클래스화 해 놓은 것으로 이해하면 크게 틀리지 않습니다. 물론 기존의 JDK에서 제공되는 클래스들에 대해 보다 개선된 클래스를 제공하고 있기는 하지만 말입니다.

이 글은 Commons IO 라이브러리의 공식 홈페이지에서 매우 간단한 예제를 통해 해당 라이브러리를 소개하고 있는 글을 한글로 정리한 것입니다. 사실.. 제가 이 Commons IO를 직접 사용한것이 아니고 대용량 파일을 서버로 업로드하는 기능을 제공하는 아파치 소프트웨어 재단에서 제공하는 또 다른 Commons Fileupload 라이브러리에서 이 Commons IO 라이브러리를 사용하는 것을 보고 관심을 가져 보게 되었고 실제 기본적인 내용을 살펴보게 되었습니다.

먼저 해당 URL에 대한 데이터 전체를 문자열로 가져오는 예입니다.

InputStream in = null;
try {
    in = new URL("href='http://www.google.co.kr").openStream();
    System.out.println(IOUtils.toString(in));
} catch (MalformedURLException e) {
     e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    IOUtils.closeQuietly(in);
}

JDK에서 제공하는 기본적인 클래스들을 이용해 위의 코드를 작성했다면 더 긴 코드가 필요했을테고.. 코드가 길다는 것은 그만큼 문제가 발생할 가능성이 높다는 것입니다. 아파치의 Commons IO는 수많은 프로그램에서 사용된 검증된 라이브러리입니다.

다음은 텍스트 파일을 라인별로 읽어 List 컨테이너로 파싱하는 예입니다.

File file = new File("c:/text.txt");
try {
    List lines = FileUtils.readLines(file, "utf-8");
    Iterator it = lines.iterator();
    while(it.hasNext()) {
        System.out.println(it.next());
    }
} catch (IOException e) {
    e.printStackTrace();
}

매우 직관적이고 심플합니다.. 하지만 대용량의 텍스트 파일의 경우 모든 데이터를 읽어 하나의 리스트 컨테이너에 집어 넣으니 메모리 문제가 발생할 수 있다는 점을 염두해 둬야 합니다.

다음은 텍스트 파일을 구성하는 라인을 하나 하나 필요할때마다 읽어 처리할 수 있는 예입니다.

File file = new File("c:/text.txt");
LineIterator it = null;
try {
    it = FileUtils.lineIterator(file);
    while(it.hasNext()) {
        System.out.println(it.next());
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if(it != null) {
        LineIterator.closeQuietly(it);
    }
}

다음은 파일 경로를 정규화해주는 코드입니다.

 String filename = "c:/commons/io/../../lang/../project.txt";
  String normailzed = FilenameUtils.normalize(filename);
  System.out.println(normailzed);

위 코드의 결과는 c:/project.txt가 됩니다.

그리고 해당 경로에 대한 저장 장치의 가용 용량을 얻는 코드입니다.

try {
    long freeSpace = FileSystemUtils.freeSpaceKb("c:/");
    System.out.println(freeSpace + "kb");
} catch (IOException e) {
    e.printStackTrace();
}

이 외에도 파일의 복사, Endian 처리, 다양한 응용 스트림 클래스 등을 제공합니다. 이 처럼 일반적으로 많이 사용되는 IO 루틴에 대해서 더 짧은 코드를 통해서, 그리고 검증된 방법을 통해 구현할 수 있는 라이브러리를 사용한다면 원하는 기능을 더욱 빠르고 안정적으로 추가 개발할 수 있습니다. 이러한 라이브러리를 미리 알고 있는 것으로 개발자의 역량은 기술면에서 더 높아질 것입니다.

차량의 위험운전행동 정의

차량의 행동 분석에 대한 통계 항목으로 고려될 수 있는 것들.. 정확한 용어 및 내용을 파악할 수 있도록 찬찬히 타이핑하며 암기(ㅡOㅡ;)하는 중..

  • 장기과속 : 과속 상태로 1분 이상 운행한 경우
  • 과속 : 제한속도보다 20km/h를 초과하여 운행한 경우
  • 급감속 : 브레이크를 사용하지 않고 초당 속도가 7.5km/h 이상 감속한 경우
  • 급제동 : 브레이크를 사용하면서 초당 속도가 11km/h 이상 감속된 경우
  • 급정지 : 브레이크를 사용하면서 초당 속도가 7.5km/h 이상 감속하여 차량이 멈춘 경우
  • 급가속 : 속도가 초당 11km/h 이상 가속된 경우
  • 급출발 : 차량이 멈춘 상태에서 출발하여 초당 속도가 11km/h 이상 올라간 경우
  • 앞자르기 : 속도가 초당 11km/h 이상 증가하면서 방위각이 30도 이상 좌우로 변하는 경우
  • 진로변경 : 속도 변화 없이 방위각이 15도 이상 좌우로 변하는 경우
  • 회전 : 15km/h 이상의 속도를 유지하면서 일정시간에 방위각이 좌측 또는 우측 방향으로 60도 이상 변하는 경우

[GIS] 인허가담당자에게 인허가시스템 소개 순서 가이드라인

1. 지번 검색

사용자 삽입 이미지
검색하고자 하는 읍면리와 번지를 통해 검색. 검색 결과를 선택하고 이동 버튼을 통해 지도 이동을 하고 옳바른 위치로 이동하는지 확인할 것.

2. 신규 인허가 등록 선택

사용자 삽입 이미지
새롭게 추가할 인허가항목을 선택하고 다음 버튼을 눌러 속성 입력항목을 입력할 것.

3. 신규 인허가 속성 항목 입력

사용자 삽입 이미지
해당 속성값을 입력할 것. 각 입력항목들 간의 관계에 따라 컨트롤의 활성화 여부을 검토하고 필수입력 항목이 무엇인지 검토하고 필수입력 항목이 아닌 값을 입력한 경우 입력된 값을 제거하는 방안 검토할 것. 컴보박스를 통한 입력의 경우 필수입력 항목이 아닌 경우 ‘해당사항없음’이 필요한지 확인 할 것.

4. 인허가구역 지정하기

사용자 삽입 이미지
인허가의 속성값을 입력했다면 인허가대상지역을 지도 위에 그려 지정할 것. 선택하기 기능을 통해 클릭한 지적 도형 전체가 인허가 대상지역으로 지정되는 것을 보일 것. 그려진 도형에 대해 정점 삭제 및 추가가 되는 것을 보일 것.

5. 인허가구역을 클릭해 입력된 속성값 확인하기

사용자 삽입 이미지
새롭게 추가한 인허가 대상지역을 클릭을 통해 확인할 것. 이력 추가 버튼을 통해 변경 이력항목을 추가하는 기능을 보이면서 기존의 입력값을 그대로 끌고 오는지 보여줄 것. 인허가대상지역을 변경하는 것을 보여줄 것. 선택된 이력항목을 삭제하고 수정하는 것을 보여줄 것.

6. 인허가 공간검색

사용자 삽입 이미지
검색 기준이 되는 지적도형을 지번 검색을 통해 검색하고 검색반경을 지정해 버퍼 확장을 시킨 후 확장된 도형과 교차하는 인허가 도형을 검색하는 기능을 보여줄 것.

7. 속성값으로 인허가검색하기

사용자 삽입 이미지
속성값을 통해 검색되는 기능을 보여줄 것. 속성값으로 허가일자 2012년으로 지정하고 검색하면 검색된 결과를 확인 할 것.

8. 공간검색 및 속성검색 결과에 대해 자세히 보기

사용자 삽입 이미지
공간검색을 통한 검색 결과 또는 속성검색을 통한 검색 결과들에 대해서 자세히 버튼을 실행해 전체 허가 면적의 합을 보여줄 것.

9. 평균경사도 분석

사용자 삽입 이미지
평균경사도를 분석하고자 하는 대상지역을 지도위에 그려 대상 지역에 대한 평균경사도 분석된 결과 보여 줄것.

[GIS] 블랙포인트(BlackPoint)를 이용한 GPS 테스트

모바일 디바이스(사용 디바이스: 갤럭시 플레이어 70)에 기본 장착된 GPS의 위치 정확도를 테스트해 볼 목적으로 블랙포인트(BlackPoint)를 이용해 GPS Tracking 앱을 만들어 직접 실외에서 실행해 보았습니다. 대상 지역은 서초구 서초동입니다. 아래의 화면은 디바이스의 실제 실행 화면을 캡춰한 이미지입니다.

사용자 삽입 이미지
점심 식사를 하고 도보로 천천히 걸으며 대로와 골목길로 위치를 추적해 보았습니다. 상당히 일치하는 부분과 상당히 벗어나는 부분이 존재하는 것을 알 수 있습니다. 그 이유를 파악하기 위해 위의 경로를 KML로 저장하고 구글어스에서 표시해 보았습니다.

사용자 삽입 이미지
위치가 크게 벗어나는 부분은 4곳으로.. 1곳은 디바이스의 이미지를 캡쳐하기 위해 사무실인 실내로 들어옴으로써 발생하는 오차입니다. 나머지 3곳에 대해서 위의 이미지에 표시를 해보았습니다. 결과적으로 고층건물에 의한 위치 오차라고 생각됩니다. 3곳에 대한 이미지를 좀더 확대해 보면 각각 다음과 같습니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
만약 주위에 고층건물이 없다면 모바일 디바이스의 GPS 만으로도 어느 정도 정확한 위치를 파악할 수 있으리라 생각됩니다. 하지만 좁고 거미줄처럼 복잡한 골목길에 대한 위치의 파악은 GPS만으로는 어렵지 않을까… 예상해봅니다.