-
[규칙 세우기]날짜 및 시간 관련 타입과 사용개발공부 2022. 11. 18. 23:57반응형
컴퓨터가 시간을 처리하는 단위로 많이 사용하는 세 가지가 있고 각각이 의미는 다음과 같다.
- 초, 세컨드 (seconds, s): 1 초
- 밀리초, 밀리세컨드 (milliseconds, ms): 1/1000 초
- 나노초, 나노세컨드 (nanoseconds, ns): 1/100,000,000 초
MySQL
데이터베이스의 저장 타입은 다섯 가지가 있다.
- DATE : YYYY-MM-DD 형식으로 년-월-일 형태의 값을 저장
- DATETIME : YYYY-MM-DD HH:MM:SS 형식으로 년-월-일 시:분:초 형태의 값을 저장
- TIMESTAMP : 1970-01-01 00:00:00 UTC 부터 초수를 저장
- TIME : HH:MM:SS 형식의 시간만 저장
- YEAR : YY, YYYY 형식의 연도만 저장
DATETIME, TIMESTAMP, TIME를 보면 MySql에서는 초 단위 아래의 컬럼을 저장하는 적당한 타입은 없다.
TIMESTAMP(6) 등으로 설정을 해주면, 밀리초까지 저장할 수 있지만, 게시물이 언제 수정되었는지 확인하는 컬럼을 만드는 상황등에서는 특별한 경우가 아니면 사용하지 않는다.
Protobuf
protocol buffers well known types들 중에 날짜 타입은 하나 있다.
Timestamp 형식으로 1970-01-01 00:00:00 UTC 부터 계산된 초와 그 초와 다음 초 사이의 값을 저장하는 나노초를 가진다.
Timestamp { int64 seconds = 1; int32 nanos = 2; }
(사실상 int형이기 때문에 miliseconds를 잘못 넣어줄 경우도 있을 수 있음)
Kotlin(Java)
Java와 Kotlin에서 날짜와 시간 관련 타입은 굉장히 많지만, 다음 두 가지를 자주 사용한다.
LocalTime: 주로 사용하며, LocalTime.of(2022, 10, 10)과 같이 간단하게 생성이 가능하여 서버내에서 시간값이 필요하지 않을 경우 많이 사용
Instant: 다음 두 가지 타입을 다른 서버 혹은 DB로 전달 받거나 전달할 경우 사용
- 1970-01-01 00:00:00 UTC 부터 계산 된 초 : Instant.now().epochSecond (long타입 )으로 생성 가능
- 1970-01-01 00:00:00 UTC 부터 계산 된 밀리초 : Instant.now().toEpochMilli() (long타입)으로 생성 가능
- now()를 찍은 순간 현재초와 다음초 사이를 0~999,999,999 (1억)으로 나누어 얼마나 지났는지 체크하는 나노초 : Instant.now().nano
- 전달 받은 seconds값과 millisecondes값을 Instant로 변경
const seconds: Long = 1668688924L const milliseconds: Long = 1668780069320L Instant.ofEpochSecond(seconds) // 2022-11-17T12:42:04Z Instant.ofEpochMilli(milliseconds) // 2022-11-18T14:01:09.320Z
- ofEpochSecond() 메서드는 오버라이드 된 함수가 하나 더 있어, 나노초까지 주입할 수 있다.
Instant.now().nano
Javascript
javascript는 Date 타입이 있다. 보통 Datepicker 컴포넌트를 사용해서 String 형태의 날짜(YYYY-MM-DD)값을 전달받는다. 전달 받은 날짜를 서버로 전달하기 위해 Date 타입으로 변경한다.
const date = new Date('2022-05-25'); date.getTime(); // getTime 메소드를 사용하여, milliseconds 반환
javascript 라이브러리에서는 1970-01-01 00:00:00 UTC 부터 계산 된 밀리초 반환만 가능하다.
직접 1000을 나누어 1970-01-01 00:00:00 UTC 부터 계산 된 초를 반환 할 수 있게 만들어주자
const date = new Date('2022-05-25'); date.getTime(); // getTime 메소드를 사용하여, milliseconds 반환 const secondsSinceEpoch = date.round(now.getTime() / 1000)
결론
사용자의 화면으로 부터 전달받아 여러 서버를 거쳐 DB에 저장되기까지 날짜와 시간 타입 사용에 대한 약속이 필요하다.
- nano 혹은 milliseconds까지 사용할 필요가 있는가?
- 여러 서버를 거치는 타입은 number, long 등의 숫자 타입이다. 초인지, 밀리초인지, 타입을 확인할 수 있는 변수명이 있는가?
반응형'개발공부' 카테고리의 다른 글
[디자인패턴] 퍼사드 패턴(Facade Pattern)과 최소 지식 원칙(Principle of Least Knowledge) (0) 2022.11.08 [디자인패턴] 어댑터 패턴(Adapter Pattern) (0) 2022.11.06 [디자인패턴] 데코레이터 패턴(Decorator Pattern), 랩퍼 패턴(wrapper pattern) (0) 2022.11.06 [리펙토링 데이터베이스] 데이터베이스 냄새와 관리 (0) 2022.11.05 [git][오픈소스 기여하기] git 브랜치 히스토리 비교하기 (0) 2022.08.19