createdAt: 레코드(엔티티)가 처음 생성된 시각updatedAt: 레코드(엔티티)가 마지막으로 수정된 시각@Column(
columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP",
insertable = false,
updatable = false
)
private LocalDateTime createdAt;
@Column(
columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP",
insertable = false,
updatable = false
)
private LocalDateTime updatedAt;
동작 방식
장점
단점 / 주의사항
MySQL 계열에 친화적PostgreSQL은 보통 트리거로 처리H2 등은 모드에 따라 동작이 달라질 수 있음@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
LocalDateTime now = LocalDateTime.now();
this.createdAt = now;
this.updatedAt = now;
}
@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
동작 방식
@PrePersist 실행 → createdAt, updatedAt 세팅@PreUpdate 실행 → updatedAt 갱신@PreUpdate가 호출됨장점
nullable=false 등 제약을 코드로 명확히 표현 가능단점 / 주의사항
save()를 호출했다고 항상 @PreUpdate가 실행되는 것은 아님NTP란?
- NTP는 Network Time Protocol의 약자이며,
서버/컴퓨터들이 현재 시간을 정확하게 동기화하도록 해주는 표준 프로토콜이다.
->여러 서버의 “시계”를 같은 시간으로 맞춰주는 동기화 시스템왜 필요할까?
- 서버가 여러 대인 환경에서는 각 서버의 시스템 시간이 조금씩 어긋날 수 있다.
- 이런 상태에서
LocalDateTime.now()로createdAt/updatedAt을 찍으면:
- 서버 A와 서버 B의 시간이 달라 시간 순서가 뒤바뀌거나
- 로그/정렬/감사 기록이 일관되지 않게 될 수 있다.
NTP가 해주는 일
- NTP 서버(시간 기준 서버)와 주기적으로 통신해
각 서버의 시간을 동일한 기준(보통 UTC)으로 맞춘다.실무에서는 보통 어떻게 쓰나?
- OS 수준에서 자동으로 동기화가 설정되어 있는 경우가 많다.
- Linux:
chrony또는ntpd- 클라우드(AWS/GCP/Azure)도 기본적인 시간 동기화 체계를 제공하는 편