2026๋…„ 1์›” 21์ผยท5๋ถ„ ์ฝ๊ธฐ

TIMESTAMPTZ vs TIMESTAMP: PostgreSQL ๋Œ€์‹œ๋ณด๋“œ์™€ API

PostgreSQL์—์„œ TIMESTAMPTZ์™€ TIMESTAMP์˜ ์ฐจ์ด๊ฐ€ ๋Œ€์‹œ๋ณด๋“œ, API ์‘๋‹ต, ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜ ๋ฐ ์„œ๋จธํƒ€์ž„ ๋ฒ„๊ทธ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

TIMESTAMPTZ vs TIMESTAMP: PostgreSQL ๋Œ€์‹œ๋ณด๋“œ์™€ API

๋ฌธ์ œ์˜ ๋ณธ์งˆ: ํ•œ ๋ฒˆ ์ผ์–ด๋‚œ ์‚ฌ๊ฑด, ์—ฌ๋Ÿฌ ํ•ด์„\n\n์‚ฌ๊ฑด์€ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , API๊ฐ€ ์ง๋ ฌํ™”ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ง‘๊ณ„ํ•˜๋ฉฐ, ๊ฐ ์‚ฌ์šฉ์ž๋Š” ์ž์‹  ์‹œ๊ฐ„๋Œ€์— ๋งž์ถฐ ๋ด…๋‹ˆ๋‹ค. ์–ด๋А ํ•œ ๊ณ„์ธต์ด๋ผ๋„ ๋‹ค๋ฅธ ๊ฐ€์ •์„ ํ•˜๋ฉด ๊ฐ™์€ ํ–‰์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ๊ฐ„์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n๊ทธ๋ž˜์„œ TIMESTAMPTZ์™€ TIMESTAMP์˜ ์„ ํƒ์€ ๋‹จ์ˆœํ•œ ํƒ€์ž… ์„ ํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๊ฐ’์ด ํŠน์ •ํ•œ ์ˆœ๊ฐ„(instant)์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€, ์•„๋‹ˆ๋ฉด ํŠน์ • ์ง€์—ญ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋ฒฝ์‹œ๊ณ„(wall-clock) ์‹œ๊ฐ„์ธ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.\n\n๋ณดํ†ต ๋จผ์ € ๊นจ์ง€๋Š” ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ์„ธ์ผ์ฆˆ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๋‰ด์š•๊ณผ ๋ฒ ๋ฅผ๋ฆฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ผ๋ณ„ ํ•ฉ๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜, ์‹œ๊ฐ„๋ณ„ ์ฐจํŠธ๊ฐ€ DST ๋ณ€๊ฒฝ ์‹œ ํ•œ ์‹œ๊ฐ„์ด ๋น ์ง€๊ฑฐ๋‚˜ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ, ๊ฐ์‚ฌ ๋กœ๊ทธ๊ฐ€ ๋‘ ์‹œ์Šคํ…œ์ด ๋‚ ์งœ์—๋Š” โ€œ๋™์˜โ€ํ•˜์ง€๋งŒ ์‹ค์ œ ์ˆœ๊ฐ„์— ๋Œ€ํ•ด์„œ๋Š” ์ˆœ์„œ๊ฐ€ ๋’ค์„ž์—ฌ ๋ณด์ด๋Š” ๊ฒฝ์šฐ ๋“ฑ์ž…๋‹ˆ๋‹ค.\n\n๊ฐ„๋‹จํ•œ ๋ชจ๋ธ๋งŒ ์ง€์ผœ๋„ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:\n\n- ์ €์žฅ(Storage): PostgreSQL์— ๋ฌด์—‡์„ ์ €์žฅํ•˜๊ณ  ๊ทธ ๊ฐ’์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€.\n- ํ‘œ์‹œ(Display): UI, ๋‚ด๋ณด๋‚ด๊ธฐ, ๋ฆฌํฌํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํฌ๋งทํ•˜๋Š”๊ฐ€.\n- ์‚ฌ์šฉ์ž ๋กœ์ผ€์ผ(User locale): ๋ทฐ์–ด์˜ ์‹œ๊ฐ„๋Œ€์™€ ๋‹ฌ๋ ฅ ๊ทœ์น™(์„œ๋จธํƒ€์ž„ ํฌํ•จ).\n\n์ด๋“ค์„ ์„ž์–ด ์“ฐ๋ฉด ์กฐ์šฉํžˆ ๋ณด๊ณ  ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์ง€์›ํŒ€์ด ๋Œ€์‹œ๋ณด๋“œ์—์„œ โ€œ์–ด์ œ ์ƒ์„ฑ๋œ ํ‹ฐ์ผ“โ€์„ ๋‚ด๋ณด๋‚ด API ๋ณด๊ณ ์„œ์™€ ๋น„๊ตํ•˜๋ฉด, ๋‘˜ ๋‹ค ๊ทธ๋Ÿด๋“ฏํ•˜์ง€๋งŒ ํ•œ ์ชฝ์€ ๋ทฐ์–ด์˜ ๋กœ์ปฌ ์ž์ • ๊ฒฝ๊ณ„๋ฅผ ์ผ๊ณ  ๋‹ค๋ฅธ ์ชฝ์€ UTC๋ฅผ ์ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n๋ชฉํ‘œ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค: ๊ฐ ์‹œ๊ฐ„ ๊ฐ’์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ถ„๋ช…ํžˆ ๊ฒฐ์ •ํ•˜์„ธ์š”. ๋ฌด์—‡์„ ์ €์žฅํ• ์ง€, ๋ฌด์—‡์„ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”. ์ด ๋ช…ํ™•์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ, API ์‘๋‹ต, ๋Œ€์‹œ๋ณด๋“œ ์ „๋ฐ˜์— ๊ฑธ์ณ ์œ ์ง€๋˜์–ด์•ผ ๋ชจ๋‘๊ฐ€ ๊ฐ™์€ ํƒ€์ž„๋ผ์ธ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.\n\n## TIMESTAMP์™€ TIMESTAMPTZ๊ฐ€ ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ\n\nPostgreSQL์—์„œ ์ด๋ฆ„์€ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ฌด์—‡์ด ์ €์žฅ๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค์€ PostgreSQL์ด ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํฌ๋งทํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.\n\nTIMESTAMP(์ฆ‰ timestamp without time zone)๋Š” ๋‹จ์ง€ ๋‹ฌ๋ ฅ ๋‚ ์งœ์™€ ์‹œ๊ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ: 2026-01-29 09:00:00. ์‹œ๊ฐ„๋Œ€๊ฐ€ ๋ถ™์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PostgreSQL์€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์— ์žˆ๋Š” ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ™์€ TIMESTAMP๋ฅผ ์ฝ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์‹ค์ œ ์ˆœ๊ฐ„์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\nTIMESTAMPTZ(์ฆ‰ timestamp with time zone)๋Š” ์‹ค์ œ ์‹œ์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ธ์Šคํ„ดํŠธ๋กœ ์ƒ๊ฐํ•˜์„ธ์š”. PostgreSQL์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๊ทœํ™”(์‚ฌ์‹ค์ƒ UTC๋กœ)ํ•œ ๋’ค ์„ธ์…˜์˜ ์‹œ๊ฐ„๋Œ€์— ๋งž์ถฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.\n\n๋Œ€๋ถ€๋ถ„์˜ ๊นœ์ง ๋†€๋žŒ ๋’ค์—๋Š” ์ด๋Ÿฐ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค:\n\n- ์ž…๋ ฅ ์‹œ: PostgreSQL์€ TIMESTAMPTZ ๊ฐ’์„ ๋‹จ์ผ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์ˆœ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n- ์ถœ๋ ฅ ์‹œ: PostgreSQL์€ ํ˜„์žฌ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ ์ˆœ๊ฐ„์„ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค.\n- TIMESTAMP์˜ ๊ฒฝ์šฐ: ์ž…๋ ฅ์ด๋‚˜ ์ถœ๋ ฅ์—์„œ ์ž๋™ ๋ณ€ํ™˜์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.\n\n์ž‘์€ ์˜ˆ์ œ๊ฐ€ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•ฑ์ด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ 2026-03-08 02:30์„ ๋ฐ›์•˜๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ์ด๋ฅผ TIMESTAMP ์—ด์— ์‚ฝ์ž…ํ•˜๋ฉด PostgreSQL์€ ์ •ํ™•ํžˆ ๊ทธ ๋ฒฝ์‹œ๊ณ„ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ ์ง€์—ญ์—์„œ DST๋กœ ์ธํ•ด ๊ทธ ๋กœ์ปฌ ์‹œ๊ฐ„์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ณด๊ณ  ๋‹จ๊ณ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\nTIMESTAMPTZ๋กœ ์‚ฝ์ž…ํ•˜๋ฉด PostgreSQL์€ ๊ฐ’์„ ํ•ด์„ํ•  ์‹œ๊ฐ„๋Œ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2026-03-08 02:30 America/New_York์ด๋ผ๋ฉด PostgreSQL์€ ์ด๋ฅผ ์ˆœ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๊ทœ์น™๊ณผ ๊ฐ’์— ๋”ฐ๋ผ ์˜ค๋ฅ˜๋ฅผ ๋‚ผ ์ˆ˜๋„ ์žˆ์Œ). ๋‚˜์ค‘์— ๋Ÿฐ๋˜์˜ ๋Œ€์‹œ๋ณด๋“œ๋Š” ๋‹ค๋ฅธ ๋กœ์ปฌ ์‹œ๊ฐ„์„ ๋ณด์—ฌ๋„ ๋™์ผํ•œ ์‹ค์‹œ๊ฐ„ ์ˆœ๊ฐ„์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.\n\nํ”ํ•œ ์˜คํ•ด ํ•˜๋‚˜: ์‚ฌ๋žŒ๋“ค์€ โ€œwith time zoneโ€์„ ๋ณด๊ณ  PostgreSQL์ด ์›๋ž˜ ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„๋Œ€ ๋ผ๋ฒจ์„ ์ €์žฅํ•œ๋‹ค๊ณ  ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PostgreSQL์€ ๋ผ๋ฒจ์ด ์•„๋‹ˆ๋ผ ๊ทธ ์ˆœ๊ฐ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž์˜ ์›๋ž˜ ์‹œ๊ฐ„๋Œ€ ๋ผ๋ฒจ์„ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋ฉด(์˜ˆ: โ€œ๊ณ ๊ฐ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐโ€), ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ํ…์ŠคํŠธ ํ•„๋“œ๋กœ ์ €์žฅํ•˜์„ธ์š”.\n\n## ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€: ๋งŽ์€ ๋†€๋ผ์›€์˜ ์ˆจ์€ ์„ค์ •\n\nPostgreSQL์—๋Š” ๋‹น์‹ ์ด ๋ณด๋Š” ๊ฒƒ์„ ์กฐ์šฉํžˆ ๋ฐ”๊พธ๋Š” ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค: ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋กœ ์กฐํšŒํ•ด๋„ ์„ธ์…˜์˜ ์‹œ๊ฐ„๋Œ€๊ฐ€ ๋‹ค๋ฅด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ณ„ ์‹œ๊ฐ„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n์ด๊ฑด ์ฃผ๋กœ TIMESTAMPTZ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. PostgreSQL์€ ์ ˆ๋Œ€์  ์ˆœ๊ฐ„์„ ์ €์žฅํ•œ ๋’ค ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€์— ๋งž์ถฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. TIMESTAMP๋Š”(์‹œ๊ฐ„๋Œ€ ์—†์Œ) ๊ฐ’์„ ๋‹จ์ˆœํ•œ ๋‹ฌ๋ ฅ ์‹œ๊ฐ„์œผ๋กœ ์ทจ๊ธ‰ํ•ด ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด ์ด๋™์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TIMESTAMP๋ฅผ TIMESTAMPTZ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์‹œ๊ฐ„๋Œ€ ์ธ์ง€ ๊ฐ’๊ณผ ๋น„๊ตํ•  ๋•Œ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๋Š” ๋ฌด์‹ฌ์ฝ” ์„ค์ •๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์„ค์ •, ๋“œ๋ผ์ด๋ฒ„ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ปค๋„ฅ์…˜ ํ’€์ด ์ด์ „ ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉ, BI ๋„๊ตฌ์˜ ๊ธฐ๋ณธ๊ฐ’, ETL ์ž‘์—…์ด ์„œ๋ฒ„ ๋กœ์ผ€์ผ์„ ์ƒ์†, ๋˜๋Š” ๊ฐœ์ธ SQL ์ฝ˜์†”์ด ๋…ธํŠธ๋ถ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์ž…๋‹ˆ๋‹ค.\n\nํŒ€๋“ค์ด ๋…ผ์Ÿํ•˜๋Š” ์ƒํ™ฉ์€ ์ด๋Ÿฐ ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ฑด์ด TIMESTAMPTZ ์—ด์— 2026-03-08 01:30:00+00์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. America/Los_Angeles ์„ธ์…˜์˜ ๋Œ€์‹œ๋ณด๋“œ๋Š” ์ด๋ฅผ ์ „๋‚  ์ €๋…์˜ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œํ•  ๊ฒƒ์ด๊ณ , API ์„ธ์…˜์ด UTC์ด๋ฉด ๋‹ค๋ฅธ ์‹œ๊ณ„ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐจํŠธ๊ฐ€ ์„ธ์…˜ ๋กœ์ปฌ ์ผ ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ์ผ๋ณ„ ํ•ฉ๊ณ„๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\nsql\n-- Make your output consistent for a reporting job\nSET TIME ZONE 'UTC';\n\nSELECT created_at, date_trunc('day', created_at) AS day_bucket\nFROM events;\n\n\n๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ API ์‘๋‹ต์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ๋Š” ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ช…์‹œํ•˜์„ธ์š”. ์—ฐ๊ฒฐ ์‹œ ์„ค์ •ํ•˜๊ฑฐ๋‚˜(SET TIME ZONE์„ ๋จผ์ € ์‹คํ–‰), ๊ธฐ๊ณ„ ์ถœ๋ ฅ์šฉ ํ‘œ์ค€(์ข…์ข… UTC)์„ ์„ ํƒํ•˜๊ณ , โ€œ๋กœ์ปฌ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๊ฐ„โ€ ๋ฆฌํฌํŠธ๋Š” ๋ˆ„๊ตฐ๊ฐ€์˜ ๋…ธํŠธ๋ถ ์„ค์ •์— ์˜์กดํ•˜์ง€ ๋ง๊ณ  ์žก(job) ๋‚ด๋ถ€์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ์กด์„ ์„ค์ •ํ•˜์„ธ์š”. ํ’€๋ง๋œ ์ปค๋„ฅ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปค๋„ฅ์…˜์„ ์ฒดํฌ์•„์›ƒํ•  ๋•Œ ์„ธ์…˜ ์„ค์ •์„ ๋ฆฌ์…‹ํ•˜์„ธ์š”.\n\n## ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๊นจ์ง€๋Š” ๋ฐฉ์‹: ๊ทธ๋ฃนํ™”, ๋ฒ„ํ‚ท, DST ๊ฐ„๊ทน\n\n๋Œ€์‹œ๋ณด๋“œ๋Š” ๋‹จ์ˆœํ•ด ๋ณด์ž…๋‹ˆ๋‹ค: ํ•˜๋ฃจ๋‹น ์ฃผ๋ฌธ ์ˆ˜๋ฅผ ์„ธ๊ณ , ์‹œ๊ฐ„๋ณ„ ๊ฐ€์ž…์„ ๋ณด์—ฌ์ฃผ๊ณ , ์ฃผ๋ณ„ ๋น„๊ต๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•˜๋‚˜์˜ โ€œ์ˆœ๊ฐ„(moment)โ€๋งŒ ์ €์žฅํ–ˆ๋Š”๋ฐ ์ฐจํŠธ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณด๋Š” ์‚ฌ๋žŒ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ โ€œ๋‚ ๋“คโ€๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.\n\n์‚ฌ์šฉ์ž ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€ ๊ธฐ์ค€์œผ๋กœ ์ผ๋ณ„ ๊ทธ๋ฃนํ™”๋ฅผ ํ•˜๋ฉด ๊ฐ™์€ ์‚ฌ๊ฑด์ด ๋‘ ์‚ฌ๋žŒ์—๊ฒŒ ๋‹ค๋ฅธ ๋‚ ์งœ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์Šค์•ค์ ค๋ ˆ์Šค์—์„œ 23:30์— ๋“ค์–ด์˜จ ์ฃผ๋ฌธ์€ ๋ฒ ๋ฅผ๋ฆฐ์—์„œ๋Š” ์ด๋ฏธ โ€œ๋‹ค์Œ ๋‚ โ€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TIMESTAMP์— ๋Œ€ํ•ด DATE(created_at)๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ์‹ค์ œ ์ˆœ๊ฐ„์ด ์•„๋‹Œ ๋ฒฝ์‹œ๊ณ„ ํŒ๋…๊ฐ’์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.\n\nDST ์ฃผ๋ณ€์˜ ์‹œ๊ฐ„๋ณ„ ์ฐจํŠธ๋Š” ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๋ด„์—๋Š” ํ•œ ๋กœ์ปฌ ์‹œ๊ฐ„์ด ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ฐจํŠธ์— ๊ฐ„๊ทน์ด ์ƒ๊ธฐ๊ณ , ๊ฐ€์„์—๋Š” ํ•œ ๋กœ์ปฌ ์‹œ๊ฐ„์ด ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•ด ์ŠคํŒŒ์ดํฌ๋‚˜ ์ค‘๋ณต๋œ ๋ฒ„ํ‚ท์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฟผ๋ฆฌ์™€ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์–ด๋–ค 01:30์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.\n\n์‹ค์šฉ์ ์ธ ์งˆ๋ฌธ: ๋‹น์‹ ์€ ์‹ค์ œ ์ˆœ๊ฐ„(real moments)์„ ์ฐจํŠธ๋กœ ๊ทธ๋ฆฌ๋Š”๊ฐ€(๋ณ€ํ™˜ํ•ด๋„ ์•ˆ์ „), ์•„๋‹ˆ๋ฉด ๋กœ์ปฌ ์Šค์ผ€์ค„ ์‹œ๊ฐ„(local schedule time)์„ ๊ทธ๋ฆฌ๋Š”๊ฐ€(์ ˆ๋Œ€ ๋ณ€ํ™˜ํ•˜๋ฉด ์•ˆ ๋จ)? ๋Œ€์‹œ๋ณด๋“œ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ์‹ค์ œ ์ˆœ๊ฐ„์„ ์›ํ•ฉ๋‹ˆ๋‹ค.\n\n### UTC๋กœ ๊ทธ๋ฃนํ™”ํ•  ๋•Œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๊ฐ„๋Œ€๋กœ ๊ทธ๋ฃนํ™”ํ•  ๋•Œ\n\nํ•˜๋‚˜์˜ ๊ทธ๋ฃนํ™” ๊ทœ์น™์„ ์„ ํƒํ•ด ๋ชจ๋“  ๊ณณ(SQL, API, BI ๋„๊ตฌ)์— ์ ์šฉํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ฉ๊ณ„๊ฐ€ driftํ•ฉ๋‹ˆ๋‹ค.\n\n๊ธ€๋กœ๋ฒŒํ•˜๊ณ  ์ผ๊ด€๋œ ์‹œ๊ณ„์—ด(์‹œ์Šคํ…œ ์ƒํƒœ, API ํŠธ๋ž˜ํ”ฝ, ๊ธ€๋กœ๋ฒŒ ๊ฐ€์ž…)์„ ์›ํ•˜๋ฉด UTC๋กœ ๊ทธ๋ฃนํ™”ํ•˜์„ธ์š”. โ€œ๊ทธ ๋‚ โ€์ด ๋ฒ•์ ยท์šด์˜์  ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๋•Œ(๋งค์žฅ ์˜์—…์ผ, SLA, ๊ธˆ์œต ๋งˆ๊ฐ)๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๊ฐ„๋Œ€๋กœ ๊ทธ๋ฃนํ™”ํ•˜์„ธ์š”. ๊ฐœ์ธํ™”๊ฐ€ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ๋ณด๋‹ค ์ค‘์š”ํ•  ๋•Œ๋งŒ ๋ทฐ์–ด์˜ ์‹œ๊ฐ„๋Œ€๋กœ ๊ทธ๋ฃนํ™”ํ•˜์„ธ์š”(๊ฐœ์ธ ํ™œ๋™ ํ”ผ๋“œ ๋“ฑ).\n\n์ผ๊ด€๋œ โ€œ๋น„์ฆˆ๋‹ˆ์Šค ์ผโ€ ๊ทธ๋ฃนํ™” ํŒจํ„ด ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:\n\nsql\nSELECT date_trunc('day', created_at AT TIME ZONE 'America/New_York') AS business_day,\n count(*)\nFROM orders\nGROUP BY 1\nORDER BY 1;\n\n\n### ๋ถˆ์‹ ์„ ๋ง‰๋Š” ๋ ˆ์ด๋ธ”\n\n์ˆซ์ž๊ฐ€ ํŠ€๊ณ  ์•„๋ฌด๋„ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์ฐจํŠธ๋ฅผ ์‹ ๋ขฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UI์— ์‚ฌ์šฉํ•œ ๊ทœ์น™์„ ๊ทธ๋Œ€๋กœ ๋ผ๋ฒจ๋กœ ํ‘œ์‹œํ•˜์„ธ์š”: โ€œDaily orders (America/New_York)โ€ ๋˜๋Š” โ€œHourly events (UTC)โ€. ๋™์ผํ•œ ๊ทœ์น™์„ ๋‚ด๋ณด๋‚ด๊ธฐ์™€ API์—๋„ ์‚ฌ์šฉํ•˜์„ธ์š”.\n\n## ๋ณด๊ณ  ๋ฐ API๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๊ทœ์น™ ์ง‘ํ•ฉ\n\n๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ๊ทธ ๊ฐ’์ด ์‹ค์ œ ์ˆœ๊ฐ„์„ ๋ฌ˜์‚ฌํ•˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋กœ์ปฌ ์‹œ๊ฐ์ธ์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”. ์ด ๋‘˜์„ ์„ž์–ด ์“ฐ๋ฉด ๋Œ€์‹œ๋ณด๋“œ์™€ API๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.\n\n์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ณด๊ณ ๋ฅผ ์œ„ํ•œ ๊ทœ์น™ ์ง‘ํ•ฉ:\n\n- ์‹ค์ œ ์ด๋ฒคํŠธ๋Š” TIMESTAMPTZ๋กœ ์ €์žฅํ•˜๊ณ  UTC๋ฅผ ์ง„์‹ค์˜ ์ถœ์ฒ˜๋กœ ์‚ผ์œผ์„ธ์š”.\n- โ€œ์ฒญ๊ตฌ์ผโ€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋…์€ DATE(๋˜๋Š” ์ง„์ •ํ•œ ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋ฉด ๋กœ์ปฌ ์‹œ๊ฐ„ ํ•„๋“œ)๋กœ ๋”ฐ๋กœ ์ €์žฅํ•˜์„ธ์š”.\n- API์—์„œ๋Š” ISO 8601๋กœ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ํ•˜์„ธ์š”: ํ•ญ์ƒ ์˜คํ”„์…‹์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜(์˜ˆ: +02:00) ํ•ญ์ƒ UTC์˜ Z๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.\n- ๋ณ€ํ™˜์€ ์—ฃ์ง€(UI ๋ฐ ๋ณด๊ณ  ๊ณ„์ธต)์—์„œ ์ˆ˜ํ–‰ํ•˜์„ธ์š”. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง๊ณผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žก ์•ˆ์—์„œ ์™”๋‹ค ๊ฐ”๋‹ค ๋ณ€ํ™˜ํ•˜์ง€ ๋งˆ์„ธ์š”.\n\n์ด ๋ฐฉ์‹์ด ์œ ํšจํ•œ ์ด์œ : ๋Œ€์‹œ๋ณด๋“œ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ„ํ‚ทํ•˜๊ณ  ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ดํŠธ(TIMESTAMPTZ)๋ฅผ ์ €์žฅํ•˜๋ฉด PostgreSQL์€ DST ์ „ํ™˜ ์‹œ์—๋„ ์ด๋ฒคํŠธ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃนํ™”ํ• ์ง€ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์‹œ๊ฐ(TIMESTAMP)๋งŒ ์ €์žฅํ•˜๋ฉด PostgreSQL์€ ๊ทธ ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๊ฐ€ ๋ฐ”๋€” ๋•Œ ๊ทธ๋ฃนํ™” ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\nโ€œ๋กœ์ปฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋‚ ์งœโ€๋Š” ์ธ์Šคํ„ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”. โ€œ2026-03-08์— ๋ฐฐ๋‹ฌโ€์€ ๋‚ ์งœ์˜ ๊ฒฐ์ •์ด์ง€ ์ˆœ๊ฐ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฅผ ํƒ€์ž„์Šคํƒฌํ”„์— ์–ต์ง€๋กœ ๋„ฃ์œผ๋ฉด DST๋กœ ์ธํ•ด ๋กœ์ปฌ ์‹œ๊ฐ„์ด ๋น ์ง€๊ฑฐ๋‚˜ ์ค‘๋ณต๋˜์–ด ๋‚˜์ค‘์— ๊ฐ„๊ทน์ด๋‚˜ ์ŠคํŒŒ์ดํฌ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\n\n## ๋‹จ๊ณ„๋ณ„: ๊ฐ ์‹œ๊ฐ„ ๊ฐ’์— ์ ์ ˆํ•œ ํƒ€์ž… ๊ณ ๋ฅด๊ธฐ\n\nTIMESTAMPTZ์™€ TIMESTAMP ์‚ฌ์ด ์„ ํƒ์€ ํ•œ ์งˆ๋ฌธ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค: ์ด ๊ฐ’์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚œ ์ˆœ๊ฐ„์„ ์„ค๋ช…ํ•˜๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ์ •ํ™•ํžˆ ์ ํžŒ ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ๋กœ์ปฌ ์‹œ๊ฐ„์ธ๊ฐ€?\n\n### 1) ์‹ค์ œ ์ด๋ฒคํŠธ์™€ ์˜ˆ์•ฝ๋œ ๋กœ์ปฌ ์‹œ๊ฐ„์„ ๋ถ„๋ฆฌํ•˜์„ธ์š”\n\n์นผ๋Ÿผ ๋ชฉ๋ก์„ ๋น ๋ฅด๊ฒŒ ์ •๋ฆฌํ•˜์„ธ์š”.\n\n์‹ค์ œ ์ด๋ฒคํŠธ(ํด๋ฆญ, ๊ฒฐ์ œ, ๋กœ๊ทธ์ธ, ๋ฐฐ์†ก, ์„ผ์„œ ์ธก์ •, ์ง€์› ๋ฉ”์‹œ์ง€)๋Š” ๋ณดํ†ต TIMESTAMPTZ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์—์„œ ๋ณด๋”๋ผ๋„ ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ์ˆœ๊ฐ„์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.\n\n์˜ˆ์•ฝ๋œ ๋กœ์ปฌ ์‹œ๊ฐ„์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค: โ€œ๋งค์žฅ ์˜คํ”ˆ 09:00โ€, โ€œํ”ฝ์—… ์ฐฝ๊ตฌ 16:00โ€“18:00โ€, โ€œ์ฒญ๊ตฌ๋Š” ๋งค์›” 1์ผ ํ˜„์ง€ ์‹œ๊ฐ„ 10:00โ€ ๋“ฑ์€ TIMESTAMP์™€ ๋ณ„๋„์˜ ์‹œ๊ฐ„๋Œ€ ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ์˜๋„๊ฐ€ ํŠน์ • ์žฅ์†Œ์˜ ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„์— ๋ฌถ์—ฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.\n\n### 2) ํ‘œ์ค€์„ ์ •ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜์„ธ์š”\n\n๋Œ€๋ถ€๋ถ„ ์ œํ’ˆ์— ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์€: ์ด๋ฒคํŠธ ์‹œ๊ฐ„์€ UTC๋กœ ์ €์žฅํ•˜๊ณ , ์‚ฌ์šฉ์ž ์‹œ๊ฐ„๋Œ€๋กœ ํ‘œ์‹œํ•˜์„ธ์š”. ์ด๋ฅผ ์Šคํ‚ค๋งˆ ์ฃผ์„, API ๋ฌธ์„œ, ๋Œ€์‹œ๋ณด๋“œ ์„ค๋ช… ๋“ฑ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์ฝ๋Š” ๊ณณ์— ๋ฌธ์„œํ™”ํ•˜์„ธ์š”. ๋˜ํ•œ โ€œ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดโ€์˜ ์ •์˜(UTC ๋ฐ์ด์ธ์ง€, ๋น„์ฆˆ๋‹ˆ์Šค ์กด ๋ฐ์ด์ธ์ง€, ๋ทฐ์–ด ๋กœ์ปฌ ๋ฐ์ด์ธ์ง€)๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜์„ธ์š”. ์ด ์„ ํƒ์ด ์ผ๋ณ„ ๋ณด๊ณ ๋ฅผ ์ขŒ์šฐํ•ฉ๋‹ˆ๋‹ค.\n\nํ˜„์žฅ์—์„œ ์ž‘๋™ํ•˜๋Š” ์งง์€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:\n\n- ๊ฐ ์‹œ๊ฐ„ ์นผ๋Ÿผ์„ โ€œevent instantโ€ ๋˜๋Š” โ€œlocal scheduleโ€๋กœ ํƒœ๊ทธํ•˜์„ธ์š”.\n- ์ด๋ฒคํŠธ ์ธ์Šคํ„ดํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UTC์— ์ €์žฅ๋œ TIMESTAMPTZ๋กœ ํ•˜์„ธ์š”.\n- ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์‹œ์—๋Š” ์‹ ์ค‘ํžˆ ๋ฐฑํ•„(backfill)ํ•˜๊ณ  ์ƒ˜ํ”Œ ํ–‰์„ ์†์œผ๋กœ ๊ฒ€์ฆํ•˜์„ธ์š”.\n- API ํฌ๋งท์„ ํ‘œ์ค€ํ™”ํ•˜์„ธ์š”(์ธ์Šคํ„ดํŠธ์—๋Š” ํ•ญ์ƒ Z ๋˜๋Š” ์˜คํ”„์…‹ ํฌํ•จ).\n- ETL, BI ์ปค๋„ฅํ„ฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค์—์„œ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.\n\nโ€œ๋ณ€ํ™˜ํ•˜๊ณ  ๋ฐฑํ•„โ€ ์ž‘์—…์— ์ฃผ์˜ํ•˜์„ธ์š”. ์ปฌ๋Ÿผ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด์ „ ๊ฐ’์ด ๋‹ค๋ฅธ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€ ํ•˜์—์„œ ํ•ด์„๋˜์—ˆ์„ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์กฐ์šฉํžˆ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n## ํ•˜๋ฃจ ์ฐจ์ด ๋ฐ DST ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ”ํ•œ ์‹ค์ˆ˜\n\n๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋ฒ„๊ทธ๋Š” โ€œPostgreSQL์˜ ์ด์ƒํ•œ ๋™์ž‘โ€์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณด๊ธฐ ์ข‹์€ ๊ฐ’์„ ์ž˜๋ชป๋œ ์˜๋ฏธ๋กœ ์ €์žฅํ•ด ์—ฌ๋Ÿฌ ๊ณ„์ธต์ด ๋ˆ„๋ฝ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”์ธกํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.\n\n### ์‹ค์ˆ˜ 1: ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„์„ ์ ˆ๋Œ€ ์‹œ๊ฐ„์ธ ์–‘ ์ €์žฅํ•˜๊ธฐ\n\nํ”ํ•œ ํ•จ์ •์€ ์ง€์—ญ ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„(์˜ˆ: ๋ฒ ๋ฅผ๋ฆฐ์˜ 2026-03-29 09:00)์„ TIMESTAMPTZ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PostgreSQL์€ ์ด๋ฅผ ์ˆœ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ˜„์žฌ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€์— ๋”ฐ๋ผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์˜๋„๋Š” โ€œํ•ญ์ƒ ํ˜„์ง€ ์‹œ๊ฐ„ ๊ธฐ์ค€ ์˜ค์ „ 9์‹œโ€์˜€๋‹ค๋ฉด ์˜๋ฏธ๋ฅผ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€์—์„œ ๊ฐ™์€ ํ–‰์„ ๋ณด๋ฉด ํ‘œ์‹œ๋˜๋Š” ์‹œ๊ฐ„์ด ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.\n\n์•ฝ์†(appointments)์€ ๋กœ์ปฌ ์‹œ๊ฐ„์„ TIMESTAMP๋กœ ์ €์žฅํ•˜๊ณ  ๋ณ„๋„์˜ ์‹œ๊ฐ„๋Œ€(๋˜๋Š” ์œ„์น˜) ํ•„๋“œ๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜์„ธ์š”. ์ผ์–ด๋‚œ ์‚ฌ๊ฑด์€ TIMESTAMPTZ๋กœ ์ €์žฅํ•˜์„ธ์š”.\n\n### ์‹ค์ˆ˜ 2: ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ€์ •\n\n๋กœ์ปฌ ๋…ธํŠธ๋ถ, ์Šคํ…Œ์ด์ง•, ํ”„๋กœ๋•์…˜์ด ๋™์ผํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ํ™˜๊ฒฝ์€ UTC๋กœ, ๋‹ค๋ฅธ ํ™˜๊ฒฝ์€ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด โ€œ์ผ๋ณ„ ๊ทธ๋ฃนํ™”โ€ ๋ณด๊ณ ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์•˜์ง€๋งŒ ์„ธ์…˜ ์„ค์ •์ด ๋ฐ”๋€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.\n\n### ์‹ค์ˆ˜ 3: ์‹œ๊ฐ„ ํ•จ์ˆ˜์˜ ๋ณด์žฅ ์‚ฌํ•ญ์„ ๋ชจ๋ฅธ ์ฑ„ ์‚ฌ์šฉ\n\nnow()์™€ current_timestamp๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. clock_timestamp()๋Š” ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์—ฌ๋Ÿฌ ์‹œ์ ์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ด ํ•จ์ˆ˜๋“ค์„ ์„ž์–ด ์“ฐ๋ฉด ์ •๋ ฌ๊ณผ ๊ธฐ๊ฐ„์ด ์ด์ƒํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n### ์‹ค์ˆ˜ 4: ๋‘ ๋ฒˆ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜์„ ์ „ํ˜€ ์•ˆ ํ•จ\n\n์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” API ๋ฒ„๊ทธ: ์•ฑ์ด ๋กœ์ปฌ ์‹œ๊ฐ„์„ UTC๋กœ ๋ณ€ํ™˜ํ•ด ๋†“๊ณ , ์ด๋ฅผ ๋‚˜์ด๋ธŒ ๋ฌธ์ž์—ด๋กœ ์ „์†กํ•˜๋ฉด DB ์„ธ์…˜์ด ์ž…๋ ฅ์„ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๊ฐ„์ฃผํ•ด ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค: ์•ฑ์ด ๋กœ์ปฌ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋Š”๋ฐ Z(UTC)๋ฅผ ๋ถ™์—ฌ ์ „์†กํ•ด ๋ Œ๋”๋ง ์‹œ ์ด๋™๋ฉ๋‹ˆ๋‹ค.\n\n### ์‹ค์ˆ˜ 5: ์˜๋„ํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ฐํžˆ์ง€ ์•Š๊ณ  ๋‚ ์งœ๋กœ ๊ทธ๋ฃนํ™”\n\nโ€œ์ผ๋ณ„ ํ•ฉ๊ณ„โ€๋Š” ์–ด๋А ๋‚  ๊ฒฝ๊ณ„๋ฅผ ๋งํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. TIMESTAMPTZ์—์„œ date(created_at)๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋Šฆ์€ ๋ฐค ์ด๋ฒคํŠธ๊ฐ€ ์ด์ „ ๋˜๋Š” ๋‹ค์Œ ๋‚ ๋กœ ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n๋Œ€์‹œ๋ณด๋“œ๋‚˜ API๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๊ธฐ๋ณธ์„ ์ ๊ฒ€ํ•˜์„ธ์š”: ์ฐจํŠธ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋ณด๊ณ  ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•ด ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๊ณ , API ํŽ˜์ด๋กœ๋“œ์— ์˜คํ”„์…‹์ด๋‚˜ Z๋ฅผ ํฌํ•จ์‹œํ‚ค๊ณ , ์Šคํ…Œ์ด์ง•๊ณผ ํ”„๋กœ๋•์…˜์˜ ์‹œ๊ฐ„๋Œ€ ์ •์ฑ…์„ ์ผ์น˜์‹œํ‚ค๋ฉฐ, ๊ทธ๋ฃนํ™” ์‹œ ์–ด๋–ค ์‹œ๊ฐ„๋Œ€๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ช…์‹œํ•˜์„ธ์š”.\n\n## ๋Œ€์‹œ๋ณด๋“œ๋‚˜ API ๋ฐฐํฌ ์ „์˜ ๋น ๋ฅธ ์ ๊ฒ€ํ‘œ\n\n์‹œ๊ฐ„ ๋ฒ„๊ทธ๋Š” ๋ณดํ†ต ํ•˜๋‚˜์˜ ์ž˜๋ชป๋œ ์ฟผ๋ฆฌ์—์„œ ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ, ๋ณด๊ณ , API ๊ฐ๊ฐ์ด ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฅธ ๊ฐ€์ •์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.\n\n๊ฐ„๋‹จํ•œ ์ถœ๊ณ  ์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:\n\n- ์‹ค์ œ ์ด๋ฒคํŠธ(๊ฐ€์ž…, ๊ฒฐ์ œ, ์„ผ์„œ ์‹ ํ˜ธ)๋Š” ์ธ์Šคํ„ดํŠธ๋กœ TIMESTAMPTZ์— ์ €์žฅํ•˜์„ธ์š”.\n- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ปฌ ๊ฐœ๋…(์ฒญ๊ตฌ์ผ, ๋ณด๊ณ  ๋‚ ์งœ)์€ DATE๋‚˜ TIME์œผ๋กœ ์ €์žฅํ•˜์„ธ์š”. ๋‚˜์ค‘์— ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํƒ€์ž„์Šคํƒฌํ”„์— ๋„ฃ์ง€ ๋งˆ์„ธ์š”.\n- ์Šค์ผ€์ค„ ์žก๊ณผ ๋ฆฌํฌํŠธ ๋Ÿฌ๋„ˆ์—์„œ๋Š” ์„ธ์…˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์˜๋„์ ์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”.\n- API ์‘๋‹ต์—๋Š” ์˜คํ”„์…‹ ๋˜๋Š” Z๋ฅผ ํฌํ•จํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฅผ ์‹œ๊ฐ„๋Œ€ ์ธ์ง€๋กœ ํŒŒ์‹ฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.\n- ๋Œ€์ƒ ์‹œ๊ฐ„๋Œ€์˜ DST ์ „ํ™˜ ์ฃผ๋ฅผ ์ตœ์†Œ ํ•˜๋‚˜ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.\n\n๋น ๋ฅธ ์ข…๋‹จ๊ฐ„ ๊ฒ€์ฆ: ํ•˜๋‚˜์˜ ์•Œ๋ ค์ง„ ์—ฃ์ง€ ์ผ€์ด์Šค ์ด๋ฒคํŠธ(์˜ˆ: DST ๊ด€์ฐฐ ์ง€์—ญ์˜ 2026-03-08 01:30)๋ฅผ ๊ณจ๋ผ ์ €์žฅ, ์ฟผ๋ฆฌ ์ถœ๋ ฅ, API JSON, ์ตœ์ข… ์ฐจํŠธ ๋ผ๋ฒจ๊นŒ์ง€ ๋”ฐ๋ผ๊ฐ€ ๋ณด์„ธ์š”. ์ฐจํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋‚ ์งœ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€๋งŒ ํˆดํŒ์— ์ž˜๋ชป๋œ ์‹œ๊ฐ„์ด ๋‚˜์˜ค๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋ผ๋ฉด ๋ณ€ํ™˜ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.\n\n## ์˜ˆ์‹œ: ๊ฐ™์€ ๋‚ ์งœ ์ˆ˜์น˜๋กœ ๋‘ ํŒ€์ด ๋‹คํˆฌ๋Š” ์ด์œ \n\n๋‰ด์š•์˜ ์ง€์›ํŒ€๊ณผ ๋ฒ ๋ฅผ๋ฆฐ์˜ ์žฌ๋ฌดํŒ€์ด ๊ฐ™์€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋ด…๋‹ˆ๋‹ค. DB ์„œ๋ฒ„๋Š” UTC๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ์ž ์ˆซ์ž๊ฐ€ ๋งž๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ โ€œ์–ด์ œโ€๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.\n\n์‚ฌ๊ฑด ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ๊ณ ๊ฐ ํ‹ฐ์ผ“์ด ๋‰ด์š• ์‹œ๊ฐ„์œผ๋กœ 3์›” 10์ผ 23:30์— ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” UTC๋กœ๋Š” 3์›” 11์ผ 04:30, ๋ฒ ๋ฅผ๋ฆฐ์œผ๋กœ๋Š” 05:30์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์˜ ์‹ค์ œ ์ˆœ๊ฐ„, ์„ธ ๊ฐ€์ง€ ๋‹ฌ๋ ฅ ๋‚ ์งœ.\n\n๋งŒ์•ฝ ์ƒ์„ฑ ์‹œ๊ฐ„์ด TIMESTAMP(์‹œ๊ฐ„๋Œ€ ์—†์Œ)๋กœ ์ €์žฅ๋˜์–ด ์•ฑ์ด ์ด๋ฅผ โ€œ๋กœ์ปฌโ€๋กœ ๊ฐ€์ •ํ•˜๋ฉด ์—ญ์‚ฌ๊ฐ€ ์กฐ์šฉํžˆ ๋‹ค์‹œ ์“ฐ์—ฌ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‰ด์š•์€ 2026-03-10 23:30์„ ๋‰ด์š• ์‹œ๊ฐ„์œผ๋กœ ํ•ด์„ํ•˜์ง€๋งŒ ๋ฒ ๋ฅผ๋ฆฐ์€ ๊ฐ™์€ ์ €์žฅ ๊ฐ’์„ ๋ฒ ๋ฅผ๋ฆฐ ์‹œ๊ฐ„์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ–‰์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ ์งœ์— ๋†“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.\n\nTIMESTAMPTZ๋กœ ์ €์žฅํ•˜๋ฉด PostgreSQL์€ ์ˆœ๊ฐ„์„ ์ผ๊ด€๋˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ์กฐํšŒ๋‚˜ ํฌ๋งท ์‹œ์—๋งŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— TIMESTAMPTZ์™€ TIMESTAMP์˜ ์ฐจ์ด๊ฐ€ ๋ณด๊ณ ์—์„œ โ€œํ•˜๋ฃจโ€์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.\n\nํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•œ ์ˆœ๊ฐ„(event instant), ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ณด๊ณ  ๋‚ ์งœ(reporting date).\n\n์‹ค์šฉ์  ํŒจํ„ด:\n\n1) ์ด๋ฒคํŠธ ์‹œ๊ฐ„์„ TIMESTAMPTZ๋กœ ์ €์žฅํ•˜์„ธ์š”.\n2) ๋ณด๊ณ  ๊ทœ์น™์„ ์ •ํ•˜์„ธ์š”: ๋ทฐ์–ด ๋กœ์ปฌ(๊ฐœ์ธ ๋Œ€์‹œ๋ณด๋“œ)์ธ์ง€, ์•„๋‹ˆ๋ฉด ํ•˜๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์กด(ํšŒ์‚ฌ ์ „์ฒด ์žฌ๋ฌด)์ธ์ง€.\n3) ์ฟผ๋ฆฌ ์‹œ ํ•ด๋‹น ๊ทœ์น™์œผ๋กœ ์ธ์Šคํ„ดํŠธ๋ฅผ ์„ ํƒํ•œ ์กด์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•˜์„ธ์š”.\n\n## ๋‹ค์Œ ๋‹จ๊ณ„: ์Šคํƒ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ํ‘œ์ค€ํ™”\n\n์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๊ทœ์น™์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฆฌํฌํŠธ๋งˆ๋‹ค ์ถ”์ธก ๊ฒŒ์ž„์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API, ๋Œ€์‹œ๋ณด๋“œ ์ „๋ฐ˜์—์„œ ์ง€๋ฃจํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„ ๋™์ž‘์œผ๋กœ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ์„ธ์š”.\n\n์งง์€ โ€œ์‹œ๊ฐ„ ๊ณ„์•ฝ(time contract)โ€์„ ์ž‘์„ฑํ•ด ์„ธ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ตํ•˜์„ธ์š”:\n\n- ์ด๋ฒคํŠธ ์‹œ๊ฐ„ ํ‘œ์ค€: ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ์ด๋ฒคํŠธ ์ธ์Šคํ„ดํŠธ๋ฅผ TIMESTAMPTZ(๋ณดํ†ต UTC)๋กœ ์ €์žฅํ•˜์„ธ์š”.\n- ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๊ฐ„๋Œ€: ๋ณด๊ณ ์— ์‚ฌ์šฉํ•  ํ•˜๋‚˜์˜ ์กด์„ ์„ ํƒํ•˜๊ณ  ์ผ/์ฃผ/์›”์„ ์ •์˜ํ•  ๋•Œ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.\n- API ํฌ๋งท: ํƒ€์ž„์Šคํƒฌํ”„๋Š” ํ•ญ์ƒ ์˜คํ”„์…‹์„ ํฌํ•จํ•œ ISO 8601(๋˜๋Š” Z)๋กœ ๋ณด๋‚ด๊ณ , ๊ฐ ํ•„๋“œ๊ฐ€ โ€œinstantโ€์ธ์ง€ โ€œlocal wall timeโ€์ธ์ง€ ๋ฌธ์„œํ™”ํ•˜์„ธ์š”.\n\nDST ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ์ฃผ๋ณ€์— ์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ๋น„์šฉ์ด ํฐ ๋ฒ„๊ทธ๋ฅผ ์ดˆ๊ธฐ์— ์žก์•„๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ์กด์— ๋Œ€ํ•ด โ€œ์ผ๋ณ„ ํ•ฉ๊ณ„โ€ ์ฟผ๋ฆฌ๊ฐ€ DST ๋ณ€๊ฒฝ ์ „ํ›„์—๋„ ์•ˆ์ •์ ์ธ์ง€, ๋˜ํ•œ 2026-11-01T01:30:00-04:00๊ณผ 2026-11-01T01:30:00-05:00์ด ์„œ๋กœ ๋‹ค๋ฅธ ์ˆœ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ๊ฒ€์ฆํ•˜์„ธ์š”.\n\n๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์‹ ์ค‘ํžˆ ๊ณ„ํšํ•˜์„ธ์š”. ํƒ€์ž…๊ณผ ๊ฐ€์ •์„ ์ œ์ž๋ฆฌ์—์„œ ๋ฐ”๊พธ๋ฉด ์ฐจํŠธ์˜ ์—ญ์‚ฌ๊ฐ€ ์กฐ์šฉํžˆ ๋‹ค์‹œ ์“ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์ƒˆ ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: created_at_utc TIMESTAMPTZ), ๊ฒ€ํ† ๋œ ๋ณ€ํ™˜์œผ๋กœ ๋ฐฑํ•„ํ•˜๊ณ  ์ฝ๊ธฐ๋ฅผ ์ƒˆ ์นผ๋Ÿผ์œผ๋กœ ์ „ํ™˜ํ•œ ๋’ค, ์ž ์‹œ ๋™์•ˆ ์˜› ๋ณด๊ณ ์™€ ์ƒˆ ๋ณด๊ณ ๋ฅผ ๋ณ‘ํ–‰ํ•ด ์ผ๋ณ„ ์ˆ˜์น˜์˜ ๋ณ€ํ™”๋ฅผ ๋ช…ํ™•ํžˆ ํ™•์ธํ•œ ๋‹ค์Œ ์˜› ์นผ๋Ÿผ์„ ์ œ๊ฑฐํ•˜์„ธ์š”.\n\n๋งŒ์•ฝ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ, API, ์Šคํฌ๋ฆฐ ์ „๋ฐ˜์—์„œ ์ด โ€œ์‹œ๊ฐ„ ๊ณ„์•ฝโ€์„ ์ ์šฉํ•  ์ค‘์•™ ์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ†ตํ•ฉ๋œ ๋นŒ๋“œ ์„ค์ •์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. AppMaster (appmaster.io)๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐฑ์—”๋“œ, ์›น ์•ฑ, API๋ฅผ ์ƒ์„ฑํ•ด ํƒ€์ž„์Šคํƒฌํ”„ ์ €์žฅ๊ณผ ํ‘œ์‹œ ๊ทœ์น™์„ ์•ฑ ์„ฑ์žฅ์— ๋งž์ถฐ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

์–ธ์ œ TIMESTAMPTZ๋ฅผ TIMESTAMP ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

Use TIMESTAMPTZ for anything that happened at a real moment (signups, payments, logins, messages, sensor pings). It stores one unambiguous instant and can be safely sorted, filtered, and compared across systems. Use plain TIMESTAMP only when the value is meant to be a wall-clock time that should stay exactly as written, usually paired with a separate time zone or location field.

PostgreSQL์—์„œ TIMESTAMP์™€ TIMESTAMPTZ์˜ ์‹ค์ œ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

TIMESTAMPTZ represents a real instant in time; PostgreSQL normalizes it internally and then displays it in your session time zone. TIMESTAMP is just a date and clock time with no zone attached, so PostgreSQL wonโ€™t shift it automatically. The key difference is meaning: instant versus local wall time.

๊ฐ™์€ ํ–‰์„ ์กฐํšŒํ•˜๋Š” ์‚ฌ๋žŒ์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

Because the session time zone controls how TIMESTAMPTZ is formatted on output and how some inputs are interpreted. Two tools can query the same row and show different clock times if one session is set to UTC and another to America/Los_Angeles. For reports and APIs, set the session time zone explicitly so results donโ€™t depend on hidden defaults.

๋‰ด์š•๊ณผ ๋ฒ ๋ฅผ๋ฆฐ์—์„œ ์ผ๋ณ„ ํ•ฉ๊ณ„๊ฐ€ ์™œ ๋‹ฌ๋ผ์ง€๋‚˜์š”?

Because โ€œa dayโ€ depends on a time zone boundary. If one dashboard groups by viewer-local time while another groups by UTC (or a business zone), late-night events can fall on different dates and change daily totals. Fix it by picking one grouping rule per chart (UTC or a specific business zone) and using it consistently in SQL, BI, and exports.

์‹œ๊ฐ„๋ณ„ ์ฐจํŠธ์—์„œ ๋น ์ง€๊ฑฐ๋‚˜ ์ค‘๋ณต๋œ ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋Š” DST ๋ฒ„๊ทธ๋Š” ์–ด๋–ป๊ฒŒ ํ”ผํ•˜๋‚˜์š”?

DST creates missing or duplicated local hours, which can produce gaps or double-counted buckets when grouping by local time. If your data represents real moments, store it as TIMESTAMPTZ and choose a clear chart time zone for bucketing. Also test the DST transition week for your target zones to catch surprises early.

TIMESTAMPTZ์— ์‚ฌ์šฉ์ž ์‹œ๊ฐ„๋Œ€๊ฐ€ ์ €์žฅ๋˜๋‚˜์š”?

No, PostgreSQL does not preserve the original time zone label with TIMESTAMPTZ; it stores the instant. When you query it, PostgreSQL displays it in the session time zone, which may differ from the userโ€™s original zone. If you need โ€œshow it in the customerโ€™s time zone,โ€ store that zone separately in another column.

ํ˜ผ๋™์„ ํ”ผํ•˜๋ ค๋ฉด API์—์„œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋‚˜์š”?

Return ISO 8601 timestamps that include an offset, and be consistent. A simple default is to always return UTC with Z for event instants, then let clients convert for display. Avoid sending โ€œnaiveโ€ strings like 2026-03-10 23:30:00 because clients will guess the zone differently.

์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, API, UI ์ค‘ ์–ด๋””์—์„œ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Convert at the edges: store event instants as TIMESTAMPTZ, then convert to the desired zone when you display or bucket for reporting. Avoid converting back and forth inside triggers, background jobs, and ETL unless you have a clear contract. Most reporting problems come from double conversion or from mixing naive and time-zone-aware values.

โ€˜๋งค์žฅ ์˜คํ”ˆ 09:00โ€™ ๊ฐ™์€ ์ผ์ •๊ณผ ์˜์—…์ผ์€ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•ด์•ผ ํ•˜๋‚˜์š”?

Use DATE for business concepts that are truly dates, like โ€œbilling day,โ€ โ€œreporting date,โ€ or โ€œdelivery date.โ€ Use TIME (or TIMESTAMP plus a separate time zone) for schedules like โ€œopens at 09:00 local time.โ€ Donโ€™t force these into TIMESTAMPTZ unless you really mean a single instant, because DST and zone changes can shift the intended meaning.

TIMESTAMP์—์„œ TIMESTAMPTZ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ณด๊ณ ์„œ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

First, decide whether itโ€™s an instant (TIMESTAMPTZ) or a local wall time (TIMESTAMP plus zone), then add a new column instead of rewriting in place. Backfill with a reviewed conversion under a known session time zone, and validate sample rows around midnight and DST boundaries. Run old and new reports side by side briefly so any shifts in totals are obvious before you remove the old column.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
TIMESTAMPTZ vs TIMESTAMP: PostgreSQL ๋Œ€์‹œ๋ณด๋“œ์™€ API | AppMaster