해당 글에서는 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 |
MySQL :: MySQL 5.7 Reference Manual :: 11.2 Date and Time Data Types
11.2 Date and Time Data Types The date and time data types for representing temporal values are DATE, TIME, DATETIME, TIMESTAMP, and YEAR. Each temporal type has a range of valid values, as well as a “zero” value that may be used when you specify an i
dev.mysql.com
-- 현재 시간 조회(시분초까지)
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 값에 매핑되는 클래스입니다. 연, 월, 일, 시, 분, 초, 나노초 정보를 저장할 수 있습니다. |
java.sql (Java SE 17 & JDK 17)
package java.sql Provides the API for accessing and processing data stored in a data source (usually a relational database) using the Java programming language. This API includes a framework whereby different drivers can be installed dynamically to access
docs.oracle.com
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;
}
java.time (Java SE 17 & JDK 17)
package java.time The main API for dates, times, instants, and durations. The classes defined here represent the principle date-time concepts, including instants, durations, dates, times, time-zones and periods. They are based on the ISO calendar system, w
docs.oracle.com
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 파일 내에서 확인이 가능합니다.
blog-codes/spring-boot-common at main · adjh54ir/blog-codes
Contributor9 티스토리 블로그 내에서 활용한 내용들을 담은 레포지토리입니다. Contribute to adjh54ir/blog-codes development by creating an account on GitHub.
github.com
오늘도 감사합니다. 😀
'Java > 이론 및 문법' 카테고리의 다른 글
[Java] IP 주소 반환받는 방법 : 클라이언트 IP, 외부 IP, 내부 IP, 호스트 IP (0) | 2024.03.09 |
---|---|
[Java] JDBC, DBCP, JNDI 이해하기 : 주요기능, 처리과정 (3) | 2024.02.21 |
[Java] Enum(Enumerated type) : 열거형 이해하기 -1 : 정의, 주요특징, 메서드, 활용 예시 (0) | 2024.02.16 |
[Java] @Transactional 어노테이션 상세 이해하기 : Checked, Unchecked Exception Rollback (2) | 2024.01.03 |
[Java] 예외처리(Exception Handling) 이해하기 -1 : try - catch / throws (0) | 2023.12.24 |