약관 개정 공지 기간은 시행일 상수와 렌더 시점 날짜 비교로 배포 없이 지킨다
시행 7일 전에 개정을 알려야 하는 약관을 시행일에 맞춰 다시 배포하지 않습니다. 시행일을 상수로 두고 렌더할 때 현지 날짜와 비교해 「개정 예정」이 저절로 「시행」으로 바뀌게 합니다.
약관이나 개인정보 처리방침을 바꿀 때는 보통 시행 며칠 전(예: 7일 전)에 미리 알려야 합니다. 그러면 배포가 두 번 필요해 보입니다. 공지 기간에는 「개정 예정」 안내를 내보내고, 시행일 0시에 맞춰 새 문구로 바꾸는 배포를 한 번 더 해야 합니다. 시행일이 주말이거나 새벽이면 그 배포를 위해 사람이 대기해야 합니다.
배포를 날짜에 묶을 필요는 없습니다. 새 문구와 옛 문구를 함께 배포하고, 시행일을 상수로 둔 뒤 렌더할 때 오늘 날짜와 비교하면 됩니다. 시행일 전에는 옛 문구 위에 「개정 예정 · 시행일 ○○」 안내와 새 문구 링크를 보여 주고, 시행일이 지나면 새 문구가 저절로 본문이 됩니다.
날짜 비교에서 두 가지를 조심합니다. 첫째, 기준 시간대입니다. 서버는 UTC로 도는 경우가 많아서, 「오늘」을 서버 기본 시간대로 구하면 한국 시행일 0시부터 9시간 동안 옛 문구가 나갑니다. 시간대를 명시해 현지 날짜로 비교합니다. 둘째, 캐시입니다. 페이지를 빌드 때 정적으로 굽거나 길게 캐시하면 날짜 비교가 빌드 시점에 굳어 버립니다. 이 페이지는 요청마다 렌더하거나, 캐시를 하루보다 짧게 둡니다.
export const TERMS_EFFECTIVE = "2026-12-01"; // 시행일(한국 날짜)
function todayInSeoul(now = new Date()): string {
// sv-SE 형식은 YYYY-MM-DD 이라 문자열 비교가 그대로 날짜 비교가 된다
return now.toLocaleDateString("sv-SE", { timeZone: "Asia/Seoul" });
}
export function termsState(now = new Date()) {
return todayInSeoul(now) >= TERMS_EFFECTIVE ? "effective" : "upcoming";
}
마지막으로 시행일 전날 밤, 시행일 0시, 시행일 이후 시각을 넣어 termsState를 부르는 시험을 둡니다. 특히 「UTC로는 전날 15시지만 한국으로는 시행일 0시」인 경계 시각이 들어가야 시간대 실수를 잡을 수 있습니다.