티스토리 뷰
반응형
안녕하세요. 이번 글에서는 흔히들 사용하지만 애매한 정보인 Timestamp와 Datetime의 타입에 대해 비교해보려 합니다.
1. MySQL의 Time Zone
mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone | Asia/Seoul |
+------------------+---------------------+
2 rows in set (0.00 sec)
2. datetime, timestamp 두 가지 타입을 가진 테이블을 생성합니다.
create table datedemo
(
mydatetime datetime,
mytimestamp timestamp
);
Query OK, 0 rows affected (0.05 sec)
3. 현재 시간을 각각의 데이터로 넣어봅니다.
insert into datedemo values ((now()), (now()));
4. 결과는 동일하게 출력됩니다.
select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2021-11-12 09:11:09 | 2011-11-12 09:11:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)
5. 시스템의 Timezone을 변경해봅니다.
SET TIME_ZONE = "america/new_york";
Query OK, 0 rows affected (0.00 sec)
6. timestamp값이 변경되는 현상이 발견됩니다.
select * from datedemo;
+---------------------+---------------------+
| mydatetime | mytimestamp |
+---------------------+---------------------+
| 2021-11-12 09:11:09 | 2021-11-11 23:41:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)
왜 이런 현상이 나타날까?
timestamp는 time_zone의 의존한다는 사실
그렇다면 Datetime만 사용하면 되는거 아닌가?
- 글로벌 서비스를 하면 여러 지역에 DB를 Clustering 해야 합니다.
- Datetime을 사용하는 경우 time_zone이 반영되지 않기 때문에 아래와 같은 상황에서 문제가 발생합니다.
- 서울 오전 9시에 작성한 글이 미국으로 Replication하는 경우 여전히 오전 9시로 반영되는 상황이 벌어지게 됩니다.
- 이런 경우에는 UTC 지원 가능한 timestamp를 사용하는 것이 더 좋아보입니다.
ETC
Datetime
- 1000-01-01 00:00:00부터 9999-12-31 23:59:59까지 지원
Timestamp
- 1970-01-01 00:00:01부터 2038-01-19 03:14:07까지 지원
- Index가 더 빠르게 생성된다.
추가적으로 Timestamp 타입은 Java 내의 로직에서 LocalDate 또는 LocalDateTime로 변환을 할 때 값을 가져오는 getter가 지원되지 않습니다 ㅠㅡㅠ
저는 이러한 유틸 클래스를 만들어 사용하고 있습니다.
public LocalDateParseUtil(LocalDate date) {
this.date = date;
if (Objects.nonNull(date)) {
str = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
kor = date.getYear() + "년 " + date.getMonthValue() + "월 " + date.getDayOfMonth() + "일";
} else {
str = "";
kor = "년 월 일";
}
}
public LocalDateParseUtil(LocalDateTime time) {
new LocalDateParseUtil(time.toLocalDate());
}
Table 내 Timestamp 컬럼일 때 를 ts로 가정하고 Date 컬럼일 때 date로 가정하면 결과가 이렇게 출력됩니다.
Timestamp ts = Timestamp.valueOf("2021-11-12T09:11:09");
LocalDateParseUtil tsUtil = new LocalDateParseUtil(ts);
System.out.println(tsUtil.getKor()); // null
LocalDate date = LocalDate.parse("2021-11-12T09:11:09", DateTimeFormatter.ISO_DATE_TIME);
LocalDateParseUtil dateUtil = new LocalDateParseUtil(date);
System.out.println(tdatetil.getKor()); // 2021년 11월 12일
사용하실 때 도움이 되시길 바라겠습니다!!
반응형
'Server' 카테고리의 다른 글
[Java] DTO에 자동 호출 로직 적용하기 (2) | 2021.11.22 |
---|---|
[Java] QueryDSL 을 사용하여 Multi Data Source 사용하기 (0) | 2021.11.13 |
JMeter 부하 테스트 사용하기 (0) | 2021.11.12 |
[Java] QueryDSL 에 대해 알아보자 (0) | 2021.11.10 |
Nginx 설정을 웹에서 테스트하고 공유할 수 있는 곳 (0) | 2021.11.10 |
Connection Timeout VS Read Timeout (0) | 2021.11.09 |
댓글
공지사항