JSR-310, 새로운 Time & Date API! - 조지훈 JCO 서비스통합 TF팀장
< 자바원 생생현장 소식을 순서에 따라 모두 포스트하였으나 내부사정으로 JSR-310 세션을 추가로 포스트합니다 :-) >
JavaOne에서도 LAB(실습) 세션은 인기가 좋아서 사전에 등록을 해두지 않으면 듣기가 어렵습니다.
LAB 세션에는 대부분 모든 환경이 갖추어진 실습용 데스크톱이 놓여져 있습니다. 그리고 강사가 가볍게 실습 목표와 간단한 데모를 보여주고 미리 나누어 준 가이드 문서에 따라 하나씩 실습을 진행하는 방식으로 진행됩니다. 물론, 세션 당 4~10명의 보조 강사들이 있어서 언제든 손을 들어 부르면 다가와서 친절히 문제를 해결해 줍니다.
실습 과제를 가장 먼저 끝내거나, 강사의 질문에 대답하면 모자 또는 티셔츠를 주는데, Hands-On-Lab이라는 이름에 걸맞게 손바닥 두 개가 찍혀있는 티셔츠를 줍니다. 재미있는 발상이죠.^^
오늘 들었던 세션 중에서 기대되는 새 API가 있었는데요, 간단히 소개해 드리려고 합니다.
오늘 들은 유일한 일반 세션이었는데요, Its high time! JSR-310, A new date and time API 주제의 강의였습니다. 제목에서 눈치 채셨겠지만 우리가 많이 사용하고 있은 Date, Calendar 등 시간 및 날짜와 관련된 API 한계를 수정한 스펙인 JSR-310에 대한 설명을 들을 수 있었습니다.
먼저, 새로운 날짜를 생성하고 지역과 형식에 맞게 String으로 변환하는 코드를 생각나는 대로 코딩 해봅니다. 이렇게요.
Date date = new Date(2007, 12, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/HongKong");
Calendar cal = new GregorianCalendar(date, zone);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
String str = fm.format(cal);
직관적인 코드라 언뜻 보기에 특별한 문제가 없어 보입니다.
과연 그럴까요?
기존의 API들에 익숙한 개발자라면 바로 알아챘겠지만, 여기에는 다음과 같은 몇 가지 문제가 있습니다.
1. Date는 1900년 이후의 ‘년’을 사용합니다. (첫째 줄)
2. 1월은 0부터 시작합니다. 그렇기 때문에 12월은 11이 됩니다. (첫째 줄)
3. TimeZone은 홍콩을 Hong_Kong으로 씁니다. (둘째 줄)
4. Calander는 Date를 받는 생성자가 없습니다. 그리고 Date를 Time이란 이름으로 설정합니다. 따라서 Date라는 말이 실제
‘날짜’로 쓰여지지가 않는다는 점에서 의미의 혼돈이 조금 있죠. (셋째 줄)
5. Date 객체는 실제 ‘날짜’가 아닙니다. 의미의 혼돈이 조금 있죠. (셋째 줄)
6. Calendar는 날짜 포멧 변환의 대상이 될 수 없습니다. Date가 오도록 해야 합니다. (다섯째 줄)
7. 따라서, DateFormat에 TimeZone을 한번 더 설정해 줘야 합니다. (넷째 줄)
자, 그럼 이런 문제를 감안해서 현재의 API로 위에서 살펴본 코드를 수정해보죠. 그럼 아마 다음과 같이 될 겁니다.
int year = 2007 - 1900;
int month = 12 - 1;
Date date = new Date(year, month, 13, 16, 40);
TimeZone zone = TimeZone.getInstance("Asia/Hong_Kong");
Calendar cal = new GregorianCalendar(zone);
cal.setTime(date);
DateFormat fm = new SimpleDateFormat("HH:mm Z");
fm.setTimeZone(zone);
Date calDate = cal.getTime();
String str = fm.format(calDate);
어떤가요? 다섯 줄이면 될 코드가 현재의 API를 사용하면 위과 같이 번거롭고 길어지게 됩니다.
이러한 불편은 날짜 관련한 작업을 해본 개발자라면 누구나 ‘맞아맞아’, ‘구려구려’를 외칠 만큼 짜증스러운 부분 중 하나였지요. JSR-310은 이러한 불편함을 해결하기 위해 2007년 2월부터 시작되었다고 합니다. 현재 JAVA SE 7에 탑재 여부를 기다리고 있다고 하네요.
JSR-310은 이와 같이 보다 편하고 직관적인 API를 만들 뿐만 아니라, Privimite Type을 피하고 IDE 친화적으로 만들어 Type Safe하게, 그리고 기존의 클래스들과 작동하는데 문제가 없도록, 또한 XML과 DateBase를 고려해서 구현했다고 합니다. 한마디로 ‘읽기 쉽고 배우기 쉽게’ 만들었다는거죠.
사실 Time이라는 단어가 비슷하지만 서로 다른 여러 의미를 가지고 있기 때문에 혼란의 소지가 있지요. 그래서 JSR-310에서는 시간에 관한 몇 가지 새로운 정의와 그를 위한 클래스들을 추가하였습니다.
먼저, nanosecond를 사용하여 ‘현시점’을 표현하는 Instant가 있습니다.
그리고 ‘Instant와 Instant 사이의 시간’을 뜻하는 Interval, 시간 선과는 별개로 ‘기간’을 뜻하는 Duration을 추가했더군요.
사실 이 부분에서 ‘개발자는 단지 코드를 짜는 것이 아니라, 코딩을 시작하기 전에 먼저 만들고자 하는 것이 Make Sense 하도록 충분히 고민하고 또 선택의 시간을 가져야 한다’는 사실을 새삼 깨닫게 되었습니다. JSR-310과 같은 프로젝트의 경우, 스펙 구현보다 ‘시간’이라는 컨셉에 대한 정의가 보다 더 중요한 작업일 테니까요
이외에는 JSR-310에는 기계가 아닌 사람이 중심이 되는 API들이 많이 추가되었습니다. 두 시간의 차이를 구한다거나, 선후 관계를 판단해주고, 음력 등 다양한 시간대를 결정하여 주는 등 여러 면에서 많은 고민을 한 흔적이 돋보였습니다.
이번 세션의 주제 외에도 JavaOne을 통해 새롭게 소개되는 새 API들이 모두 ‘많은 이들이 불편함을 느끼면 새로운 것의 필요성을 대두되고, 따라서 발전했다’는 점에서 지속적으로 발전하는 자바의 모습을 더욱 기대케 했습니다.
댓글을 달아 주세요