반응형
해당 글에서는 RDBMS 환경에서 TimeStamp의 데이터 타입을 Java에서 어떤 타입으로 매핑을 해야하는지에 대해 알아봅니다.
1) 데이터베이스 데이터 타입 : MySQL 기준
💡 날짜/시간 데이터 타입
- 날짜나 시간을 지정하는 데이터 타입 중 하나로 연도, 월, 일, 시간(시, 분, 초)을 나타내는 데이터 타입입니다.
1. DB 날짜/시간 데이터 타입
💡 DB 날짜/시간 데이터 타입
- RDBMS의 MySQL을 기준으로 날짜/시간에 사용되는 데이터 타입에 대해 알아봅니다.
데이터베이스 데이터 타입 | 설명 | 사용예시 |
DATE | 연도, 월, 일을 나타내는 데이터 타입입니다. 'YYYY-MM-DD' 형식을 사용합니다. | 2024-05-30 |
TIME(n) | 시간(시, 분, 초)을 나타내는 데이터 타입입니다. '-HH:MM:SS' 형식을 사용합니다. | 13:41:24 |
DATETIME(n) | 연도, 월, 일, 시간(시, 분, 초)을 나타내는 데이터 타입입니다. 'YYYY-MM-DD HH:MM:SS' 형식을 사용합니다. | 2024-05-30 13:41:24 |
TIMESTAMP(n) | 연도, 월, 일, 시간(시, 분, 초)을 나타내는 데이터 타입입니다. '1970-01-01 00:00:01' UTC부터 '2038년 1월 19일 03:14:07' UTC까지의 범위를 가집니다. | 2024-05-30 13:41:24 |
YEAR(n) | 연도를 나타내는 데이터 타입입니다. 4자리 또는 2자리 형식을 사용할 수 있습니다. | 2024 or 24 |
-- 현재 시간 조회(시분초까지)
SELECT CURRENT_TIMESTAMP(); -- 2024-05-30 13:41:24
SELECT NOW(); -- 2024-05-30 13:41:24
-- 현재 시간 조회(밀리 세컨드까지)
SELECT CURRENT_TIMESTAMP(3); -- 2024-05-30 13:41:24.048
SELECT NOW(3); -- 2024-05-30 13:41:24.048
-- 현재 시간 조회(마이크로 세컨드까지)
SELECT CURRENT_TIMESTAMP(6); -- 2024-05-30 13:41:24.24.565960
SELECT NOW(6); -- 2024-05-30 13:41:24.565960
-- 현재 일자 조회
SELECT CURRENT_DATE(); -- 2024-05-30
SELECT DATE(NOW()); -- 2024-05-30
-- 현재 시간 조회
SELECT CURRENT_TIME(); -- 13:41:24
SELECT TIME(NOW()); -- 13:41:24
2. TimeStamp 밀리 세컨드
💡 TimeStamp 밀리세컨드
- 밀리세컨드의 경우 1/1000초를 의미합니다. 그렇기에 1000밀리세컨드는 1초와 동일합니다.
- 일반적으로 TimeStamp 타입을 취하게 되면 연도, 월, 시간(시, 분, 초)에 대한 저장까지 밖에 수행이 되지 않습니다. 그렇기에 TimeStamp의 밀리세컨드까지 반환을 받고 데이터를 넣기 위해서는 데이터 타입에 TIMESTAMP(3)을 추가하거나 조회할때는 CURRENT_TIMESTAMP(3)를 통하여서 밀리세컨드까지의 데이터를 조회합니다.
-- 현재 시간 조회(밀리세컨드까지)
SELECT CURRENT_TIMESTAMP(3); -- 2024-05-30 13:41:24.048
SELECT NOW(3); -- 2024-05-30 13:41:24.048
3. TimeStamp 마이크로 세컨드
💡 TimeStamp 마이크로 세컨드
- 밀리세컨드의 1/1000로, 1초의 백만분의 1을 나타내는 시간 단위입니다. 이는 빠른 컴퓨터 작업 속도나 고주파 시그널의 주기 등을 측정하는 데 사용됩니다.
- 따라서, TimeStamp의 마이크로세컨드까지 반환을 받고 데이터를 넣기 위해서는 데이터 타입에 TIMESTAMP(6)을 추가하거나 조회할 때는 CURRENT_TIMESTAMP(6)을 통하여 마이크로세컨드까지의 데이터를 조회합니다.
-- 현재 시간 조회(마이크로 세컨드까지)
SELECT CURRENT_TIMESTAMP(6); -- 2024-05-30 13:41:24.565960
SELECT NOW(6); -- 2024-05-30 13:41:24.565960
💡 [참고] 세컨드를 기준으로 밀리 - 마이크로 - 나노 세컨드의 단위에 대해 알아봅니다.
분류 | 1초 기준 |
세컨드(초) | 1초 |
밀리 세컨드 | 1000 |
마이크로 세컨드 | 1,000,000 |
나노 세컨드 | 1,000,000,000 |
4. 사용예시
💡 사용예시
- 날짜 타입과 관련된 TB_DATE 테이블을 생성하고 각각 컬럼을 DATE, TIME, YEAR, TIMESTAMP, TIMESTAMP(3), TIMESTAMP(6) 형태로 DDL을 구성하였습니다.
CREATE TABLE TB_DATE(
date_sq int unsigned NOT NULL AUTO_INCREMENT COMMENT '날짜 시퀀스',
date_type DATE NOT NULL COMMENT '날짜 타입',
time_type TIME NOT NULL COMMENT '시간 타입',
year_type YEAR NOT NULL COMMENT '연도 타입',
timestamp_type TIMESTAMP NOT NULL COMMENT '타임스탬프 타입',
timestamp_milsec_type TIMESTAMP(3) NOT NULL COMMENT '밀리세컨드 타임스탬프 타입',
timestamp_microsec_type TIMESTAMP(6) NOT NULL COMMENT '나노세컨드 타임스탬프 타입',
PRIMARY KEY(date_sq)
);
💡사용예시
- 날짜 타입과 관련되어 각각에 맞게 데이터를 넣는 DML을 구성하였습니다.
INSERT INTO TB_DATE(
date_type,
time_type,
year_type,
timestamp_type,
timestamp_milsec_type,
timestamp_microsec_type)
VALUES(
CURRENT_DATE(),
CURRENT_TIME(),
YEAR(NOW()),
CURRENT_TIMESTAMP(),
CURRENT_TIMESTAMP(3),
CURRENT_TIMESTAMP(6));
2) JAVA 날짜/시간 데이터 타입 : java.sql 패키지
1. JAVA 날짜/시간 데이터 타입 : java.sql 패키지
💡 날짜/시간 데이터 타입: java.sql 패키지
- Java 프로그래밍 언어에서 데이터베이스와 상호작용하는 데 필요한 클래스와 인터페이스를 제공합니다. 이 패키지는 주로 JDBC API의 일부로 사용됩니다.
- java.sql 패키지는 데이터베이스 연결, SQL 문 실행, 결과 집합 접근 등을 위한 여러 클래스와 인터페이스를 제공합니다.
Java 클래스 | 패키지 | 설명 |
Date | java.sql.Date | SQL DATE 값에 매핑되는 클래스입니다. 연, 월, 일 정보를 저장할 수 있습니다. |
Time | java.sql.Time | SQL TIME 값에 매핑되는 클래스입니다. 시, 분, 초 정보를 저장할 수 있습니다. |
Timestamp | java.sql.Timestamp | SQL TIMESTAMP 값에 매핑되는 클래스입니다. 연, 월, 일, 시, 분, 초, 나노초 정보를 저장할 수 있습니다. |
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
public class MappingExampleDto {
private Date date;
private Time time;
private Timestamp timestamp;
}
2. 사용예시 -1: 데이터베이스 구조
💡 사용예시 -1: 데이터베이스 구조
- 아래와 같이 데이터 구조로 구성이 되어있고, 데이터를 아래와 같이 넣었습니다.
3. 사용예시 -2 : DTO 구성
💡 사용예시 -2 : DTO 구성
- java.sql 패키지를 기준으로 DTO를 구성하였습니다.
-데이터베이스의 DATE 데이터 타입은 java.sql.Date를 사용하였습니다.
- 데이터베이스의 TIME 데이터 타입은 java.sql.time을 사용하였습니다.
- 데이터베이스의 TIMESTAMP, TIMESTAM(3), TIMESTAMP(6)는 모두 java.sql.Timestamp를 사용하였습니다.
💡 데이터베이스 타입과 java.sql 패키지의 객체 필드 데이터 타입 매핑
데이터베이스 타입 | 객체 필드 | 변수명 |
DATE | java.sql.Date | dateType |
TIME | java.sql.Time | timeType |
YEAR | int | yearType |
TIMESTAMP | java.sql.Timestamp | timestampType |
TIMESTAMP(3) | java.sql.Timestamp | timestampMilsecType |
TIMESTAMP(6) | java.sql.Timestamp | timestampMicrosecType |
package com.adjh.springboot3tierform.model.dto;
import lombok.*;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
/**
* Please explain the class!!
*
* @author : lee
* @fileName : DateInfoDto
* @since : 24. 6. 3.
*/
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DateInfoDto {
// 날짜 시퀀스
private int dateSq;
// 날짜 타입
private Date dateType;
// 시간 타입
private Time timeType;
// 연도 타입
private int yearType;
// 타임스템프 타입
private Timestamp timestampType;
// 타임스탬프 타입(밀리세컨드)
private Timestamp timestampMilsecType;
// 타임스탬프 타입(마이크로세컨드)
private Timestamp timestampMicrosecType;
@Builder
public DateInfoDto(int dateSq, Date dateType, Time timeType, int yearType, Timestamp timestampType, Timestamp timestampMilsecType, Timestamp timestampMicrosecType) {
this.dateSq = dateSq;
this.dateType = dateType;
this.timeType = timeType;
this.yearType = yearType;
this.timestampType = timestampType;
this.timestampMilsecType = timestampMilsecType;
this.timestampMicrosecType = timestampMicrosecType;
}
}
4. 사용예시 -3 : 수행 결과
💡 사용예시 -3 : 수행 결과
- 아래와 같이 데이터베이스 데이터 타입과 매핑이 되어 Java 객체의 필드가 출력이 되었습니다.
[
{
"dateSq": 1,
"dateType": "2024-05-31",
"timeType": "13:55:38",
"yearType": "2024",
"timestampType": "2024-05-31T04:55:38.000+00:00",
"timestampMilsecType": "2024-05-31T04:55:38.798+00:00",
"timestampMicrosecType": "2024-05-31T04:55:38.798+00:00"
},
{
"dateSq": 2,
"dateType": "2024-06-03",
"timeType": "10:06:44",
"yearType": "2024",
"timestampType": "2024-06-03T01:06:44.000+00:00",
"timestampMilsecType": "2024-06-03T01:06:44.391+00:00",
"timestampMicrosecType": "2024-06-03T01:06:44.391+00:00"
},
]
3) JAVA 날짜/시간 데이터 타입 : java.time 패키지
1. JAVA 날짜/시간 데이터 타입 : java.time 패키지
💡 날짜/시간 종류 데이터 타입 :java.time 패키지
- 자바 8에 도입된 새로운 날짜와 시간 API입니다. 기존의 java.util.Date와 java.util.Calendar가 가진 문제점을 해결하고, 더욱 직관적이고 사용하기 쉬운 API를 제공하기 위해 도입되었습니다.
- 이 패키지는 불변 객체를 사용하여 thread-safe하며, 직관적인 메소드 이름을 가지고 있어 사용하기 쉽습니다. 또한, ISO-8601 표준을 따르고 있어서 국제적으로 통용되는 날짜와 시간 형식을 사용할 수 있습니다.
- 따라서 java.time 패키지는 현대의 복잡한 날짜와 시간 요구사항을 처리하기 위한 강력한 도구입니다.
Java 클래스 | 분류 | 패키지 | 설명 | 예시 값 |
LocalTime | 시간 | java.time.LocalTime | 시, 분, 초, 나노초를 저장하는 시간을 표현하는 클래스입니다. | 13:45:20 |
LocalDate | 날짜 | java.time.LocalDate | 연, 월, 일을 저장하는 날짜를 표현하는 클래스입니다. | 2022-12-31 |
LocalDateTime | 날짜와 시간 | java.time.LocalDateTime | 연, 월, 일, 시, 분, 초, 나노초를 저장하는 날짜와 시간을 함께 표현하는 클래스입니다. | 2022-12-31T13:45:20 |
ZonedDateTime | 날짜, 시간, 시간대 | java.time.ZonedDateTime | 날짜와 시간, 그리고 시간대 정보를 함께 표현하는 클래스입니다. | 2022-12-31T13:45:20+09:00[Asia/Seoul] |
OffsetTime | 시간, 시간대 오프셋 | java.time.OffsetTime | 시간과 UTC로부터의 오프셋을 함께 표현하는 클래스입니다. | 13:45:20+09:00 |
OffsetDateTime | 날짜, 시간, 시간대 오프셋 | java.time.OffsetDateTime | 날짜와 시간, 그리고 UTC로부터의 오프셋을 함께 표현하는 클래스입니다. | 2022-12-31T13:45:20+09:00 |
Year | 연도 | java.time.Year | 연도를 표현하는 클래스입니다. | 2022 |
YearMonth | 연도와 월 | java.time.YearMonth | 연도와 월을 함께 표현하는 클래스입니다. | 2022-12 |
MonthDay | 월과 일 | java.time.MonthDay | 월과 일을 함께 표현하는 클래스입니다. | --12-31 |
Period | 기간(날짜) | java.time.Period | 두 날짜 사이의 기간을 표현하는 클래스입니다. | P1Y2M10D |
Duration | 기간(시간) | java.time.Duration | 두 시간 사이의 기간을 표현하는 클래스입니다. | PT20H |
Instant | 시점 | java.time.Instant | 특정 시점을 나노초 단위로 표현하는 클래스입니다. | 2022-12-31T04:45:20Z |
import java.time.*;
public class DateDto {
private LocalTime localTime;
private LocalDate localDate;
private LocalDateTime localDateTime;
private ZonedDateTime zonedDateTime;
private OffsetTime offsetTime;
private OffsetDateTime offsetDateTime;
private Year year;
private YearMonth yearMonth;
private MonthDay monthDay;
private Period period;
private Duration duration;
private Instant instant;
}
2. 사용예시 -1: 데이터베이스 구조
💡 사용예시 -1: 데이터베이스 구조
- 아래와 같이 데이터 구조로 구성이 되어있고, 데이터를 아래와 같이 넣었습니다.
3. 사용예시 -2 : DTO 구성
💡 사용예시 -2 : DTO 구성
- java.time 패키지를 기준으로 DTO를 구성하였습니다.
💡 데이터베이스 타입과 java.time 패키지의 객체 필드 데이터 타입 매핑
데이터베이스 타입 | 객체 필드 | 변수 명 |
DATE | java.time.LocalDate | dateType |
TIME | java.time.LocalDateTime | timeType |
YEAR | java.time.Year | yearType |
TIMESTAMP | java.time.LocalDateTime | timestampType |
TIMESTAMP(3) | java.time.LocalDateTime | timestampMilsecType |
TIMESTAMP(6) | java.time.LocalDateTime | timestampMicrosecType |
package com.adjh.springboot3tierform.model.dto;
import lombok.*;
import lombok.Builder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Year;
/**
* Please explain the class!!
*
* @author : lee
* @fileName : DateDto
* @since : 24. 5. 31.
*/
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DateDto {
// 날짜 시퀀스
private int dateSq;
// 날짜 타입
private LocalDate dateType;
// 시간 타입
private LocalTime timeType;
// 연도 타입
private Year yearType;
// 타임스템프 타입
private LocalDateTime timestampType;
// 타임스탬프 타입(밀리세컨드)
private LocalDateTime timestampMilsecType;
// 타임스탬프 타입(마이크로세컨드)
private LocalDateTime timestampMicrosecType;
@Builder(toBuilder = true)
public DateDto(int dateSq, LocalDate dateType, LocalTime timeType, Year yearType, LocalDateTime timestampType, LocalDateTime timestampMilsecType, LocalDateTime timestampMicrosecType) {
this.dateSq = dateSq;
this.dateType = dateType;
this.timeType = timeType;
this.yearType = yearType;
this.timestampType = timestampType;
this.timestampMilsecType = timestampMilsecType;
this.timestampMicrosecType = timestampMicrosecType;
}
}
4. 수행결과 -3: 수행 결과
💡 사용예시 -3 : 수행 결과
- 아래와 같이 데이터베이스 데이터 타입과 매핑이 되어 Java 객체의 필드가 출력이 되었습니다.
[
{
"dateSq": 1,
"dateType": "2024-05-31",
"timeType": "13:55:38",
"yearType": "2024",
"timestampType": "2024-05-31T13:55:38",
"timestampMilsecType": "2024-05-31T13:55:38.798",
"timestampMicrosecType": "2024-05-31T13:55:38.798252"
},
{
"dateSq": 2,
"dateType": "2024-06-03",
"timeType": "10:06:44",
"yearType": "2024",
"timestampType": "2024-06-03T10:06:44",
"timestampMilsecType": "2024-06-03T10:06:44.391",
"timestampMicrosecType": "2024-06-03T10:06:44.391759"
}
]
4) java.sql, java.time 비교
1. 요약
💡 요약
- 각각 java.sql, java.time 패키지를 이용하였을때 미팽되는 Java 객체입니다.
데이터베이스 타입 | java.sql 패키지 | java.time 패키지 | 설명 |
DATE | java.sql.Date | java.time.LocalDate | 연도, 월, 일을 나타내는 데이터 타입입니다. 'YYYY-MM-DD' 형식을 사용합니다. |
TIME(n) | java.sql.Time | java.time.LocalTime | 시간(시, 분, 초)을 나타내는 데이터 타입입니다. '-HH:MM:SS' 형식을 사용합니다. |
YEAR(n) | int | java.time.YEAR | 연도를 나타내는 데이터 타입입니다. 4자리 또는 2자리 형식을 사용할 수 있습니다. |
DATETIME(n) | java.sql.Timestamp | java.time.LocalDateTime | 연도, 월, 일, 시간(시, 분, 초)을 나타내는 데이터 타입입니다. 'YYYY-MM-DD HH:MM:SS' 형식을 사용합니다. |
TIMESTAMP(n) | java.sql.Timestamp | java.time.LocalDateTime | 연도, 월, 일, 시간(시, 분, 초)을 나타내는 데이터 타입입니다. '1970-01-01 00:00:01' UTC부터 '2038년 1월 19일 03:14:07' UTC까지의 범위를 가집니다. |
2. java.sql, java.time 패키지 별 밀리세컨드 / 마이크로세컨드
💡 java.sql, java.time 패키지 별 밀리세컨드 / 마이크로세컨드
- timestamp_type에는 TIMESTAMP 타입으로 세컨드까지의 시간이 들어가 있습니다.
- timestamp_milsec_type에는 TIMESTAMP(3) 타입으로 밀리세컨드까지의 시간이 들어가 있습니다.
- timestamp_microsec_type에는 TIMESTAM(6) 타입으로 마이크로세컨드까지의 시간이 들어가 있습니다.
3. java.sql 패키지 출력 확인
💡 java.sql 패키지 출력 확인
- 패키지 java.sql인 Timestamp 데이터 타입으로 매핑을 하는 경우 아래와 같이 ‘밀리세컨드’에 대해서만 출력이 되고 이후는 출력이 되지 않고 있습니다.
- java.sql의 경우는 기본적으로 밀리세컨드 단위를 사용합니다.
4. java.time 패키지 출력 확인
💡 java.time 패키지 출력 확인
- 패키지 java.time인 LocalDateTime 데이터 타입으로 매핑을 하는 경우 아래와 같이 ‘밀리세컨드’ 모두 출력이 되는것을 확인할 수 있습니다.
- 즉, 밀리세컨드까지의 데이터를 객체와 매핑하고자 할때는 java.time.LocalDateTime을 사용해야합니다.
- java.time의 경우는 기본적으로 나노세컨드 단위를 사용합니다.
💡 [참고] 해당 소스코드는 아래의 Repository 내에 DateTypeSqlDto.java, DateTypeTimeDto.java 파일 내에서 확인이 가능합니다.
오늘도 감사합니다. 😀
반응형