Java/이론 및 문법

[Java] DB 날짜/시간 데이터 타입과 매핑 Java 자료형 이해하기 : java.sql, java.time 패키지 및 비교

adjh54 2024. 6. 3. 20:10
728x170
해당 글에서는 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

 


 
 
오늘도 감사합니다. 😀
 
 
 

그리드형