티스토리 뷰

개요

서버-클라이언트의 개발 언어가 다를 경우(대부분의 개발 환경에 해당한다.) 날짜/시간 데이터를 어떻게 전달하고 처리해야 할까? 서버와 클라이언트는 개발 언어도 다르고 날짜와 시간을 다루는 타입과 방법도 다르다. 이러한 고민을 하는 과정에서 내가 했던 방법을 정리하여 소개하고자 한다. 서버의 개발 언어는 Java, 클라이언트는 JavaScript를 기준으로 설명한다.

서버의 날짜와 시간은 대부분 데이터베이스에서 가져온다.

서버 환경에서는 날짜/시간에 대한 기준이 필요하다. 그 기준은 서버 애플리케이션이 실행되는 운영체제의 시간이 될 수도 있고 RDBMS의 시간이 될 수도 있으며 별도의 타임 서버가 기준이 될 수도 있다. 일반적으로 애플리케이션의 성격에 맞게 결정되지만 대부분의 애플리케이션의 기능이 데이터베이스에 대한 CRUD가 차지하므로 내 경우 DB를 기준으로 시간을 정한다. Java에서는 JDBC가 제공하는 API를 사용하여 데이터베이스에 접근하는데 10억분의 1초까지 저장할 수 있는 java.sql.Timestamp 클래스를 사용하여 날짜/시간 데이터를 다룬다.

// Sql2o와 같은 JDBC 랩퍼 라이브러리를 사용하여 Oracle 데이터베이스에 접근할 경우 클래스 타입을 별도로 명시하지 않으면 날짜/시간 데이터가 java.sql.Timestamp가 아닌 oracle.sql.TIMESTAMP 클래스의 오브젝트에 저장된다. 이 경우 timestampValue() 메써드를 사용하여 java.sql.Timestamp 오브젝트로 변환한다. 내 경우 Timestamp 오브젝트를 그대로 JSON으로 변환하여 클라이언트에 전달한다.
Timestamp someTimestamp = oracleTimeStamp.timestampValue();

// TimeStamp 오브젝트를 그대로 사용해도 상관없지만 서버 차원에서 날짜/시간을 가공할 필요가 있을 경우 JodaTime 라이브러리를 사용한다. org.joda.time.DateTime 클래스의 생성자로 Timestamp 오브젝트를 전달하면 DateTime 오브젝트를 생성할 수 있다. DateTime 오브젝트는 JSON으로 변환시 Timestamp 값으로 변환된다.
DateTime dateTime = new DateTime(someTimestamp);

클라이언트에서 서버로부터 전달받은 날짜/시간 다루기

Java(서버)와 JavaScript(클라이언트)는 기본 데이터 타입이 완벽하게 일치하지 않기 때문에 내 경우 서버에서 클라이언트로 전달할 데이터를 생성할 경우 모든 데이터를 문자열로 처리하여 JSON 객체에 담아 전달한다. 시간/문자열 데이터는 앞서와 같이 Timestamp 또는 DateTime 오브젝트를 변환했을 경우 Timestamp 형식의 값이 문자열로 전달된다. 클라이언트에서 JSON 데이터를 파씽하여 someTimestampString이란 이름의 변수에 파씽한 날짜/시간 데이터를 저장했다고 가정하고 아래 예제를 진행해보자.

// 파씽된 데이터는 문자열 변수로 인식된 상태로 아래와 같이 숫자로 변경해야 한다.
var someTimestamp = Number(someTimestampString);

// JavaScript는 날짜/시간을 다루기 위한 Date 객체를 제공하며 Timestamp 값을 받아 새로운 객체를 생성할 수 있다.
var dateTime = new Date(someTimestamp);

// 내 경우 날짜/시간 관련 다양한 기능을 제공하는 Sugar.js 라이브러리를 사용한다. 아래와 같이 사용한다.
var dateTime = Date.create(someTimestamp);

앞의 과정을 통해 서버로 전달받은 날짜/시간 데이터를 JavaScriptDate 객체로 인식하는 것까지 완료했다. 다음은 사용자에게 이 값을 어떤 형식으로 출력할 것인가의 결정이 남았다. 국가, 언어, 문화에 따라 날짜/시간은 다양한 형식으로 출력될 수 있다. Sugar.js의 힘을 빌어 아래와 같이 간단하게 출력 형식을 결정할 수 있다.

// 국제표준 출력 형식인 ISO8601_DATE 형식으로 출력할 수 있다. 날짜만 출력할 경우 가장 많이 사용되는 형식이다.
var dateFormatted = dateTime.format('{yyyy}-{MM}-{dd}'); // 2014-01-01

// 국제표준 출력 형식인 ISO8601_DATETIME 형식으로 출력할 수 있다. 날짜와 시간 사이에 T 문자가 삽입된다. 시간이 UTC일 경우 Z 문자가 끝에 삽입되며 UTC가 아닐 경우 UTC 기준 추가 시간을 + 기호로 추가 출력한다. 따라서 한국의 경우 +09:00가 출력된다.
var dateTimeFormatted = dateTime.format(Date.ISO8601_DATETIME); // 2014-01-01T00:00:01+09:00

// 시간까지 출력할 경우 국제표준을 따르는 것이 깔끔한 방법이기는 하나 국내 사용자들 입장에서는 가독성 문제가 제기될 수 있다. 내 경우 아래와 같이 24시간제를 적용하여 시분초까지 출력한다.
var dateTimeFormatted = dateTime.format('{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}'); // 2014-01-01 00:00:01

참고 글


댓글
댓글쓰기 폼