IT_Programming/Dev Libs & Framework

Joda-Time을 활용한 date format 처리

JJun ™ 2014. 7. 16. 06:50

 


 출처: http://hungry-developer.blogspot.kr/


 

 

기존 JDK에서 제공하는 SimpleDateFormat은 문제가 많은 것으로 알려져 있다.
Thread-Safe하지 못하여 멀티 쓰레드 환경에서 에러를 발생시키고 퍼포먼스에도 좋지 않다.
그리고 Java 진영에서도 설계가 잘못 되었다고 인정하였으며 deprecated되었다.


기존 JDK에서 제공하는 Date관련 클래스의 부족함으로 인해 사람들은 라이브러리를 개발하였고

그 중 두 가지가 유명한데 바로 Joda-Time과 Apache의 FastDateTime이다.

우선 Joda-Time을 사용해보았다.

Maven을 이용하거나 공식 사이트에서 직접 다운받아서 외부 라이브러리로 등록한다.

일단 필요에 의해서 라이브러리를 알아본 거기에 관련 기능을 찾아봤다.
필요한 기능은 인자로 넘어오는 date형식에 따라 알맞게 파싱하는 기능이다.

우선 기본적인 사용방법은 간단하다.

DateTimeFormat클래스에서 static factory메서드로 다양한 인스턴스 생성을 제공하는데
여기서 리턴되는 인스턴스는 DateTimeFormatter이다.

DateTimeFormatter인스턴스를 통해 parseDateTime함수로 날짜 데이터를 던지면
DateTime인스턴스를 반환하게 된다.

 

 DateTimeFormmater formatter = DateTimeFormat.forPatter("날짜형식포맷");
 DateTime dateTime = formatter.parseDateTime(인자);

 



그런데 내가 원하는 기능은 저렇게 정적으로 형식을 지정하는 것이 아니라
어떠한 형식의 데이터가 들어올지 모르는 상황에서 다이나믹하게 처리하는 것이다.

그래서 레퍼런스를 찾아보니 DateTimeFormatterBuilder라는 클래스가 있었다.
이름만 봐도 Builder패턴이 적용된 클래스로 DateTimeFormatter의 생성을 관리하는 기능을
담당하는 것을 알 수 있다.

그래서 저 클래스를 활용해서 RFC822포맷과 ISO8601형식을 동시에 처리할 수 있는 기능을 구현해보았다.


위와 같이 코딩하고 실행시켜보니 IllegalArgumentException이 발생했다..
레퍼런스만 봤을땐 append를 통해 각각의 DateTimeFormatter를 추가하고 toFormatter함수를 통해

믹싱된 형태의 DateTimeFormatter를 제공하는 것 같은데 동작이 되지 않았다.

아 그리고 유의 해야 될 사항이 DateTimeFormatter를 생성할때 개별 옵션을 적용해줄 수 있는데
Locale등의 설정값 등 append를 통해 추가하면 저런 개별 옵션들은 다 무시된다.
그래서 최종적으로 생성된 DateTimeFormatter에 별도로 적용해야 된다.

각설하고, 레퍼런스를 좀더 살펴봤다.
appendOptional이라는 함수가 있는데 설명은 그냥 말그대로 optional이고 함수 인자 형태가 달랐다.
append는 DateTimeFormatter타입이고 appendOptional은 DateTimeParser타입이였다.
물론 append함수에도 DateTimeParser타입의 함수가 오버로딩 되어있으나 원하는 대로 동작하지 않았다.

appendOptional함수를 적용해 정상적으로 동작하는 코드다.