[Java] PostgreSQL의 timestamptz를 Java MyBatis에서 Instant로 받는 방법

2025. 7. 28. 00:05·개발 (Development)/Java

PostgreSQL에서 timestamptz는 시간대(time zone) 정보를 포함한 타임스탬프를 의미합니다. 이를 Java에서 MyBatis를 통해 받아올 때, 어떤 자료형을 사용해야 할지 고민이 생길 수 있습니다.

이번 글에서는 Instant로 매핑하는 방법을 중심으로 정리하였습니다.

1. timestamptz란?

timestamp with time zone의 약자로, UTC 기준으로 저장되며 클라이언트의 타임존에 맞춰 자동으로 변환되는 타입입니다.

예를 들어 다음과 같이 저장된 값이 있다면:

2025-07-28 15:00:00+00

한국 시간대(KST)에서는 2025-07-28 24:00:00으로 변환되어 표시됩니다.

2. Java에서 매핑 가능한 자료형

PostgreSQL의 timestamptz는 Java에서 다음 자료형들로 매핑할 수 있습니다:

  • OffsetDateTime (권장)
  • ZonedDateTime
  • Instant ← 이번 글의 중심
  • LocalDateTime (타임존 정보 손실)

이 중 Instant는 UTC 기준의 절대 시각을 표현하는 객체로, 타임존을 고려하지 않고 고정된 시점을 다룰 때 유용합니다.

3. MyBatis에서 Instant로 받는 방법

3-1. Java 클래스

import java.time.Instant;

public class LogEntry {
    private Instant createdAt;

    public Instant getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt;
    }
}

3-2. MyBatis XML 매핑

<resultMap id="LogEntryMap" type="com.example.LogEntry">
    <result column="created_at" property="createdAt" javaType="java.time.Instant"/>
</resultMap>

자동 매핑이 동작할 경우 javaType은 생략해도 됩니다.

4. 적용을 위한 환경 조건

  • JDBC 드라이버 버전: PostgreSQL JDBC 42.2 이상
  • Java 버전: Java 8 이상 (java.time 패키지 사용 가능)
  • 연결 설정 (선택):
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb?serverTimezone=UTC

서버와 클라이언트 간 시간대 차이를 방지하고자 UTC를 명시해두면 변환의 일관성을 유지할 수 있습니다.

5. 주의할 점

  • Instant는 시간대를 포함하지 않으므로, 지역 시간이 필요한 경우 ZoneId를 지정해 LocalDateTime 또는 ZonedDateTime으로 변환해야 합니다.
LocalDateTime localTime = createdAt.atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime();
  • LocalDateTime으로 매핑할 경우 타임존 정보가 손실되어 의도치 않은 시각의 오차가 발생할 수 있으므로 주의가 필요합니다.

6. 마무리

Instant는 UTC 기준의 시각을 그대로 유지하면서 PostgreSQL의 timestamptz를 정확히 받아올 수 있어, 로그 기록이나 절대 시간 기준 비교 등에 적합합니다. 애플리케이션에서 로컬 시각으로의 변환만 잘 처리한다면, Instant는 매우 안정적이고 효율적인 선택이 될 수 있습니다.

반응형

'개발 (Development) > Java' 카테고리의 다른 글

[Java] Spring Boot 프로젝트에서 MyBatis와 JPA를 함께 사용하는 방법과 오류 해결 과정  (0) 2025.08.03
[Java] Spring Boot 2.x + Java 11 환경에서 JPA Native Query와 DTO 매핑 문제 해결 기록  (4) 2025.08.03
[Java] ISO 8601 형식의 시간 출력하기 (현재 시간과 과거 시간 구하기)  (2) 2025.07.20
[Java] MyBatis foreach에서 빈 배열이 들어올 경우 예외를 방지하는 방법  (2) 2025.07.20
[Java/SpringBoot] 서버 간 API 호출 오류: Connection reset 에러 분석 및 해결 방법  (0) 2025.07.13
'개발 (Development)/Java' 카테고리의 다른 글
  • [Java] Spring Boot 프로젝트에서 MyBatis와 JPA를 함께 사용하는 방법과 오류 해결 과정
  • [Java] Spring Boot 2.x + Java 11 환경에서 JPA Native Query와 DTO 매핑 문제 해결 기록
  • [Java] ISO 8601 형식의 시간 출력하기 (현재 시간과 과거 시간 구하기)
  • [Java] MyBatis foreach에서 빈 배열이 들어올 경우 예외를 방지하는 방법
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (231)
      • 개발 (Development) (165)
        • Algorithm (1)
        • Angular (1)
        • AWS (6)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (31)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (11)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker
    ADsP
    Spring boot
    데이터분석
    javascript
    자바
    백준자바
    백준알고리즘
    python
    Linux
    JPA
    deepseek
    DevOps
    리눅스 마스터 2급
    AWS
    MyBatis
    Linux master
    Vue.js
    PostgreSQL
    springboot
    pandas
    timescaledb
    백준
    Kafka
    오답노트
    리눅스 마스터 2급 2차
    Kubernetes
    JSON
    백준온라인저지
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Java] PostgreSQL의 timestamptz를 Java MyBatis에서 Instant로 받는 방법
상단으로

티스토리툴바