친절한 개발자

Apach common utils - FileUtils - 본문

개발일지

Apach common utils - FileUtils -

착한 개발자 2016. 6. 10. 10:51

parser를 만들게 되었다. 


기존 txt 형식의 파일을 읽어들여 원하는 항목을 추출하는 작업이다.


txt 파일의 규칙성을 찿아서 indexof 및 각종 정규식을 써가며 원하는 keyword를 mapping 하고


vo에담에 DB에 insert 혹은 update 하는 것이다.


그러기위해 다음과정의 순서대로 개발했다.


1.  특정 Directory에 있는 파일목록을 추출한다.

/*재귀호출을 이용한 파일목록 추출하기*/

  public static List<String> listFilesForFolder(File folder) {

List<String> filepathlist = new ArrayList<>();


File[] files = folder.listFiles();

for (File file : files) {

if (file.isDirectory()) {

listFilesForFolder(file);

} else {

filepathlist.add(file.getPath());

}

}

return filepathlist;

}



/* Apach Common Utils 이용*/

public Collection<File> listFilesForFolder(File directory)

{

return FileUtils.listFiles(directory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);

}

Apach Common Utils 라이브러리를 이용하여 코드가 간결해 졌다.


2. file 내용을 읽어들여 String으로 저장한다.

 /* java의 IO를 이용 */

   public List<String> GetLinesBufferedReader(){

BufferedReader buff=null;

Stream<String> stream=null;

List<String> list = new ArrayList<>();

try {

buff = new BufferedReader(new FileReader(file));

stream = buff.lines();

Iterator<String> lines = stream.iterator();

while (lines.hasNext()) {

list.add(lines.next());

}

} catch (FileNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}finally {

if (buff != null)

try {

buff.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (stream != null)

stream.close();

}

return list;

}


/* Apach Common Utils 이용*/

   public List<String> GetLinesAparchCommonIO() throws IOException {

return FileUtils.readLines(file, "euc-kr");

}

Apach Common Utils 라이브러리를 이용하면 파일을 쓰고 닫아야하는불편함도 없을뿐 아니라.

코드가 간결해 졌다... 즉 유지보수가 용이해졌으며 

코드 단순화로인한 버그의 발생빈도도 줄어들었다.



3. Collection 에 담겨있는 스트링을 입맞에 맞게 Token으로 분류한다. 

split도 사용해도 되지만. 둘을 적절히 혼용한다.

  token 은 StringTokenizer를 사용한다는 의미


잠시 StringTokenizer와 Split의 차이점에 대해 알아보자


   4.1 Split은 구분자를 기준으로 String을 자르는데 배열로 담긴다. 예를들어 "1   2 3   5" 이렇게 되어 있다면 

    배열에는 공백도 데이터로 넣기 때문에 구분자가 규칙성을 가지고(공백하나 또는 두개 이런식) 스트링이 나열되어 있으면 상관없지만 

    규칙성이 없거나 규식성이 있다고 해도 공백도 배열에 담기기 때문에 다시 배열에서 찿아쓰기 불편하다.


   4.2 StringTokenizer는 위와 같은상황에서 구분자를 공백으로 하면 공백은 제거되고 공백으로 구분된 1,2,3,5의 값이 각각의 token에 담긴다.

    사용하기 훨씬 수월하다.


  비지니스로직 생성을 생성한다.

    여기서 로직은 txt파일의 성격에 맞게 구현


4. Spring에 적용하기 위해 MVC 패턴을 이용한다. 

  스프링프로젝트생성

  Controller / Service / Dao / Vo 패키지 생성

  parser에서 추출한데이터를 vo에 담는다.

  Dao를 통해 Vo의 데이터를 추출해서 DB에 CRUD한다.

  

참고 : Spring4.0 / MyBatis / MySql / JSP / Jquery 를 사용해서 프로젝트 구현

  - 퍼블리싱을 하지 않기 위해 BootStrap을 이용했으며 Ties3를 사용해서 레이아웃을 적용했다.

  - SpringSecurity적용 및 파서에서 읽은 데이터를 DB에 주기적으로 작업해야 하므로 Scheduler와 Batch 작업도 병행

  - mobile 환경을 고려하여 반응형 웹 으로 설계

  - 트랜잭션은 Aop를 사용안하고 어노테이션 기반으로 한다. - Aop를 적용해야 할 정도록 설계가 복잡하거나. 공수가 크지 않기 때문에

  - Aop의 Advice관련 기능이 필요하면 Intercept로 대체하기로 함