86 lines
7.5 KiB
Markdown
86 lines
7.5 KiB
Markdown
---
|
|
title: "Thorben Janssen — How to Persist Creation and Update Timestamps with Hibernate"
|
|
source_type: company-tech-blog
|
|
url: https://thorben-janssen.com/persist-creation-update-timestamps-hibernate/
|
|
archive_url:
|
|
related_branches: [feature-persistence-auditing-contract]
|
|
related_projects: []
|
|
tags: [company-tech-blog, ca-tmpl, persistence, hibernate, auditing, clock-injection]
|
|
created: 2026-06-10
|
|
---
|
|
|
|
# Thorben Janssen — How to Persist Creation and Update Timestamps with Hibernate
|
|
|
|
> Layer: `raw/` — 외부 자료(전문가 기술 블로그)의 **원문 발췌·출처 기록**.
|
|
> 검증된 요약은 `/ingest` 후 `wiki/concepts/`에 별도 작성. 원본은 raw에 영구 보관.
|
|
|
|
## Parent / 활용 branch (필수, 최소 1개+)
|
|
|
|
| Branch | 이 자료가 정당화하는 결정 |
|
|
|---|---|
|
|
| [[raw/branch-notes/feature-persistence-auditing-contract]] | Hibernate-native `@CreationTimestamp`/`@UpdateTimestamp` 대안을 거부하는 근거: (a) Clock 주입 불가 → 결정론적 테스트 제약 위반, (b) `created_by`/`updated_by` 추적 불가 → 완전한 감사 로그 미지원 |
|
|
|
|
## 출처 / Source
|
|
|
|
- 원본 URL: https://thorben-janssen.com/persist-creation-update-timestamps-hibernate/
|
|
- 아카이브 URL: (미등록 — 추가 권장)
|
|
- 저자 / 조직: Thorben Janssen (thorben-janssen.com — Hibernate/JPA 전문가 기술 블로그)
|
|
- 발행일: (상세 날짜 미확인, 페이지 본문에서 연도 미표기)
|
|
- 마지막 확인일: 2026-06-10
|
|
|
|
## 왜 저장했는지 / Why archived
|
|
|
|
`feature-persistence-auditing-contract` 브랜치에서 `@CreationTimestamp`/`@UpdateTimestamp` 대안을 평가할 때, "Hibernate가 JVM 시스템 시간을 직접 읽으므로 Clock 빈 주입이 불가하다"는 제한과 "타임스탬프만 저장하는 단순 기능이라 실제 감사 솔루션이 아니다"는 저자의 직접적 진술이 두 거부 이유 모두를 뒷받침한다.
|
|
|
|
## 핵심 인용 / Key quotes (verbatim, Self-Grep 통과)
|
|
|
|
> [§ Clock parameterization caveat] "Unfortunately, you can't parameterize it. Hibernate uses the JVM to get the current time."
|
|
|
|
> [§ Audit scope disclaimer] "it only persists the timestamps so it's not a real audit solution. But if you don't need to persist any additional information (who changed what), this is the easiest solution I know."
|
|
|
|
> [§ @CreationTimestamp mechanics] "When a new entity gets persisted, Hibernate gets the current timestamp from the VM and sets it as the value of the attribute annotated with @CreationTimestamp."
|
|
|
|
> [§ @UpdateTimestamp mechanics] "The value of the attribute annotated with @UpdateTimestamp gets changed in a similar way with every SQL Update statement."
|
|
|
|
## Claims Extracted / 추출된 주장
|
|
|
|
> 이 자료가 **직접 말하는 것만** claim 으로 분리한다. 내 프로젝트에 적용한 결론은 여기 쓰지 않는다.
|
|
|
|
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|
|
|---|---|---|---|---|---|
|
|
| C1 | `@CreationTimestamp`/`@UpdateTimestamp`는 Clock 파라미터화가 불가하며, Hibernate가 JVM에서 직접 현재 시간을 읽는다 | "Unfortunately, you can't parameterize it. Hibernate uses the JVM to get the current time." | `engineering-blog` | Hibernate ORM 사용 환경 전반 | 특정 Hibernate 버전에 국한되는지 여부 미확인; 공식 Hibernate 문서로 보강 필요 |
|
|
| C2 | `@CreationTimestamp`/`@UpdateTimestamp`는 타임스탬프만 저장하므로 실제 감사 솔루션이 아니며, "누가 무엇을 변경했는지" 추가 정보가 없는 경우에만 적합하다 | "it only persists the timestamps so it's not a real audit solution. But if you don't need to persist any additional information (who changed what), this is the easiest solution I know." | `engineering-blog` | 감사(audit) 요건이 있는 모든 프로젝트 | `created_by`/`updated_by` 컬럼 유무가 아니라 저장소 모델 결정에 대한 근거는 아님 |
|
|
| C3 | `@CreationTimestamp`는 엔티티가 최초 영속화될 때 VM의 현재 타임스탬프를 해당 필드에 설정한다 | "When a new entity gets persisted, Hibernate gets the current timestamp from the VM and sets it as the value of the attribute annotated with @CreationTimestamp." | `engineering-blog` | Hibernate ORM `@CreationTimestamp` 사용 시 | VM 시간 소스(NTP 정합 등) 정확도 보장 여부는 이 자료 범위 밖 |
|
|
| C4 | `@UpdateTimestamp`는 모든 SQL UPDATE 실행 시마다 값이 변경된다 | "The value of the attribute annotated with @UpdateTimestamp gets changed in a similar way with every SQL Update statement." | `engineering-blog` | Hibernate ORM `@UpdateTimestamp` 사용 시 | UPDATE 없이 dirty-check가 발생하는 케이스 처리 방식 미언급 |
|
|
|
|
### Strength 허용값 (적용됨)
|
|
|
|
- `engineering-blog` — 개인/팀 블로그의 엔지니어링 해설. 이 자료는 Thorben Janssen의 전문가 기술 블로그로 `engineering-blog` 로 분류. 공식 Hibernate 문서(official-vendor-doc)가 아니므로 공식 best practice로 단독 인용 금지.
|
|
|
|
## Usage Boundaries / 적용 경계
|
|
|
|
- 이 자료가 직접 증명하는 것:
|
|
- `C1`: Hibernate `@CreationTimestamp`/`@UpdateTimestamp`가 Clock 주입을 지원하지 않으며 JVM 시스템 시간을 직접 사용한다는 사실 (저자 직접 진술)
|
|
- `C2`: 이 애노테이션들이 "누가" 변경했는지를 기록하지 않으므로 완전한 감사 솔루션이 아니라는 저자의 명시적 평가
|
|
- `C3`: `@CreationTimestamp` 가 최초 INSERT 시점에 VM 타임스탬프를 설정한다는 메커니즘
|
|
- `C4`: `@UpdateTimestamp` 가 매 UPDATE마다 갱신된다는 메커니즘
|
|
- 이 자료가 증명하지 않는 것:
|
|
- Hibernate 공식 문서(official-vendor-doc)로서의 권위: 전문가 블로그이므로 공식 사양이 아님. Clock 주입 불가 사실을 공식 확인하려면 Hibernate 공식 문서 보강 필요.
|
|
- 어떤 감사 대안(Spring Data Auditing, Hibernate Envers 등)이 더 낫다는 비교 우위 — 이 글은 대안 평가가 아닌 사용법 설명
|
|
- `created_by`/`updated_by` 컬럼을 어떻게 구현해야 하는지 구체적 방법
|
|
- 내 프로젝트에 적용하려면 추가 확인이 필요한 것:
|
|
- Hibernate 공식 문서 또는 소스코드에서 C1 (JVM 시간 직접 읽기, Clock 주입 불가) 확인 — engineering-blog 단독으로는 결정 근거로 약함
|
|
- ca-tmpl 의 실제 Hibernate 버전에서 동일하게 적용되는지 검증
|
|
|
|
## 메모 / Notes
|
|
|
|
- C1 은 결정론적 테스트를 위해 `Clock` 빈을 주입하는 이 프로젝트의 테스트 전략과 직접 충돌한다. `@CreationTimestamp`/`@UpdateTimestamp` 를 사용하면 테스트에서 시간을 제어할 수 없어 시간 의존 로직의 단위 테스트가 불가능해진다.
|
|
- C2 는 이 프로젝트가 `created_by`/`updated_by` 컬럼을 요구하는 경우 이 대안을 아예 배제하는 독립적인 거부 이유가 된다.
|
|
- 이 자료는 전문가 기술 블로그이므로 `engineering-blog` Strength 로 처리. 공식 사양을 보강하려면 Hibernate 공식 문서(`@CreationTimestamp`/`@UpdateTimestamp` Javadoc 또는 User Guide)를 별도 official-doc 으로 등록 권장.
|
|
- 추가로 봐야 할 동일 출처 페이지: Thorben Janssen의 Hibernate Envers 관련 글 (완전한 감사 대안으로 비교 가능)
|
|
|
|
## Related / 관련
|
|
|
|
- 같은 주제 다른 official-doc / company-tech-blog: Hibernate 공식 User Guide의 `@CreationTimestamp`/`@UpdateTimestamp` 항목 (아직 미등록)
|
|
- 이 자료를 인용한 wiki 요약: `[[wiki/concepts/hibernate-timestamp-auditing]]` (생성 시)
|