-
Spring에서 날짜 관련 library를 사용하지 않고 unix_timestamp(), current_timestamp()를 이용해서 날짜처리하기Backend/SPRING 2022. 6. 27. 07:27
최근에 날짜/시간과 관련된 개발을 할 일이 생겨 해당 기능들을 다루던 도중 이런 생각을 하게 되었습니다. LocalDate 혹은 JodaTime을 사용하지 않고 날짜를 불러와서 시간을 비교할 수 있으면 얼마나 좋을까라는 생각을요.
그렇게 생각하는 이유는, db에서 날짜를 저장하는 방식에 따라서 날짜를 조회해서 mybatis에서 JavaCode로 끌어오는 과정에서 많은 에러가 발생할 수 있고, 제대로 끌어왔다고 해도 비교를 하려면 제가 원하는 방식대로 바꾸어야 하는데, 그러는 과정에서 팀끼리 동일한 규격을 사용하지 않으면 엄청난 삽질을 할 수 있기 때문입니다.
라이브러리도 다양합니다. Date, Calendar. java.time 등등 .. 전 이거 처리하면서 삽질 엄청 한 것 같습니다.
문제는 삽질을 한참하고도 나중에 헷갈리는 부분이라는 것입니다.
라이브러리 별로 차이점도 제대로 정리해서 올리고 싶은데 해당 포스팅과는 관련이 적은 부분이므로 추후에 다루도록 하겠습니다. 제가 공부하는 과정에서 도움받은 블로그가 있어서 주소 첨부해두겠습니다.
(문제시 댓글 남겨주시면 삭제하겠습니다.)
[Java] LocalDateTime : 날짜 시간 처리 관련 (umbum.dev)
[Java] LocalDateTime : 날짜 시간 처리 관련
Date ? Calendar? java.time? 뭘 써야 하나? : LocalDateTime http://tcpschool.com/java/java_time_javaTime https://d2.naver.com/helloworld/645609 LocalDateTime -> String ```java LocalDateTime.now().form..
umbum.dev
개발 환경
DB - Mysql, MariaDB
Server side framework - Spring boot
1. DB에서 날짜를 지정하는 방식
data base의 table을 만들 때 애초에 column의 속성을 datetime으로 지정해서 개발합니다.
DATETIME으로 지정을 하고 데이터를 입력해 줄 때 날짜를 직접 시스템에서 입력해 주는 방식이 아니라.
해당 ROW가 만들어질 때 datetime을 입력하지 않고 다른 필수 값들을 insert 함으로써 row가 생성되는 조건은 만족시키고 default 값을 current_timestamp()로 지정해 줍니다.
(DB에서 날짜를 입력하는 방식도 여러 방식이 있지만 이곳에서는 current_timestamp()만을 사용하겠습니다. 이 차이점에 대해서는 정말 잘 정리해 주신 블로거분이 계셔서, 도움받은 블로그 링크 주소 첨부해놓겠습니다.)
(문제시 댓글 남겨주시면 삭제하겠습니다.)
MariaDB, MySQL -- timestamp vs. datetime , now() , current_timestamp
MariaDB , MySQL -- timestamp vs. datetime, now() , current_timestamp 환경 : MariaDB 5.5, windows 10 64bit, HeidiSQL 참고 : http://stackoverflow.com/questions/409286/should-i-use-field-datetime-or..
freeprog.tistory.com
Timestamp / datetime / now() / current_timestamp() 간의 차이에 대해서 일목요연하게 정리해 주신 블로그입니다.
각설하고 다시 돌아와서
(1)컬럼의 이름은 regDt 혹은 원하시는 이름으로 지정
(2)컬럼의 타입은 datetime으로 지정
(3)컬럼의 default 값은 current_timestamp()로 지정
(now()는 안 되나요?라고 궁금하신 분들도 계실 텐데요 위에 블로거분이 아주 잘 다루어주셔서, 위에 포스팅 한번 참고해보시고 와주시면 정말 감사할 것 같습니다. 물론 저도 따로 포스팅으로 다룰 계획입니다.)
CREATE TABLE PRODUCT ( productUid int NOT NULL, ProductName varchar(50) NOT NULL, regDt timestamp NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (productUid) );
위와 같이 쿼리를 입력하면 regDt는......
아래와 같이 기록이 되게 됩니다.
2021-05-11 23:13:21
2. 기록된 날짜를 조회하는 방식
조회는 쿼리문으로 그냥 때리시면 조회가 됩니다.
하지만 그냥 조회만 한다면 위에 처럼 날짜 형식으로 조회가 될 텐데요.
하지만 우리가 하고 싶은 것은 조회만 하는 것이 아니라 그 날짜를 불러와서 무언가 하고 싶은 것이죠?
(혹은 아니라고 하셔도 그럴 것이라고 상황을 가정해보겠습니다.)
위의 테이블을 예로 들으면 상품을 등록한 날짜가 3일을 지난 상품은, 리스트에 보여주고 싶지 않다고 한다면.
서버에서 아예 제외하고 클라이언트에게 내려주면 되니까, 3일이 지난 상품에 대해서 걸러낼 필요성이 생기겠지요
그렇다면 우리가 하고 싶은 건 ....
differenceDateTime = 2021-05-11 23:13:21 - nowDatetime; Boolean visibleOrNot = true; if (differenceDateTime > 3일) { visibleOrNot = false; } else { visibleOrNot = true; }
위와 같은 처리일 텐데요, 제가 differenceDateTime 앞에 자료형을 적지 않았잖아요?
적지 않은 것이 아니라 못 적은 것입니다
해당 diffrenceDateTime 밑의 로직이 말이 안되거든요.
(물론! mariadb의 datediff라는 날짜 관련 내장함수를 써도 되잖아요~?라고 반문하실 수도 있겠지만 해당 메소드 역시 'YYYY-MM-DD'로 날짜 형식을 맞추어야 하니까, 아예 계산에 유리한 숫자 형식으로 날짜를 변환하는 방식으로 진행하려 합니다.)
3. 날짜/시간을 변환하여 비교하는 방식
(1) 1번에서 등록한 registDateTime을 unix_timestamp()를 사용하여 조회합니다.
(1)-1. 잠깐! unix_timestamp()가 무엇인가요?
unix_timestamp()는 mysql, mariadb에서 제공하는 날짜 타입으로 뽑히는 value 값을 long type의 value로 바꾸어주는 메소드입니다. 이것과 비슷한 db에서 제공하는 날짜 관련 함수가 많습니다.
(1)-2. 날짜 관련 메소드관련되서 잘 정리되어 있는 공식 홈페이지
https://mariadb.com/kb/en/date-and-time-data-types/
(1)-3. unix_timestamp()를 사용하여 registerDate를 뽑아옵니다.
SELECT unix_timestamp(registerDate) FROM PRODUCT;
그렇다면, 아래와 같이 long 값이 나올 것입니다.
(2) 마지막으로, 현재 시간과 비교하여 차이 값을 구합니다.
(2)-1. 현재 시간과 비교하고 싶지 않고 때에는, 현재 방식과 동일하게 다른 상품군의 등록 날짜를 뽑아와서 Long 값끼리 비교해 주면 될 것입니다)
(2)-2. Mybatis 단은 이번 포스팅과 크게 연관이 없어서 생략하겠습니다.
(3) unix timestamp에 대해서 더 자세히 알아보다가 재미있는 글을 발견해서 공유드립니다. 아래 내용은 2038년에 data overflow 때문에 unix timestamp를 사용한 전 세계 전산 시스템에서 오류가 날 것이라고 예측하는 글인데요. 이러한 내용도 있구나 하고 참고해두시면 좋을 것 같습니다.
https://perfectacle.github.io/2018/09/25/unix-timestamp/
Unix Timestamp
들어가기 앞서 Unix Timestamp의 동의어를 살펴보자. Epoch Posix Time Epoch Posix Timestamp Epoch Unix Time Epoch Unix Timestamp Posix Epoch Posix Epoch Time Posix Epoch Timestamp Posix Time Posix Timestamp Unix
perfectacle.github.io
(4) 마지막으로, 급하게 현재 혹은 특정 시간을 time stamp로 바꾸고 싶은 분들을 위해서 간단하게 사이트 하나 공유해드릴게요.
https://www.epochconverter.com/
Epoch Converter
Convert Unix Timestamps (and many other date formats) to regular dates.
www.epochconverter.com
'Backend > SPRING' 카테고리의 다른 글