2025๋…„ 11์›” 15์ผยท5๋ถ„ ์ฝ๊ธฐ

PostgreSQL์—์„œ ๋ฐ˜๋ณต ์ผ์ •๊ณผ ์‹œ๊ฐ„๋Œ€: ํŒจํ„ด

PostgreSQL์—์„œ ๋ฐ˜๋ณต ์ผ์ •๊ณผ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋‹ค๋ฃจ๋Š” ์‹ค์šฉ์  ์ €์žฅ ํ˜•์‹, ๋ฐ˜๋ณต ๊ทœ์น™, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์ฟผ๋ฆฌ ํŒจํ„ด์„ ๋ฐฐ์šฐ๊ณ  ์บ˜๋ฆฐ๋”๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

PostgreSQL์—์„œ ๋ฐ˜๋ณต ์ผ์ •๊ณผ ์‹œ๊ฐ„๋Œ€: ํŒจํ„ด

์‹œ๊ฐ„๋Œ€์™€ ๋ฐ˜๋ณต ์ด๋ฒคํŠธ๊ฐ€ ์ž˜๋ชป๋˜๋Š” ์ด์œ 

๋Œ€๋ถ€๋ถ„์˜ ์บ˜๋ฆฐ๋” ๋ฒ„๊ทธ๋Š” ์ˆ˜ํ•™์  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜๋ฏธ์ƒ์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€(ํŠน์ • ์‹œ์ )๋ฅผ ์ €์žฅํ–ˆ๋Š”๋ฐ, ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ๊ฒƒ(ํŠน์ • ์žฅ์†Œ์˜ ๋กœ์ปฌ ์‹œ๊ฐ)์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฐจ์ด๊ฐ€ ๋ฐ˜๋ณต ์ผ์ •๊ณผ ์‹œ๊ฐ„๋Œ€๋ฅผ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด๊ฒŒ ํ–ˆ๋‹ค๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ๊นจ์ง€๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ผ๊ด‘์ ˆ์•ฝ์‹œ๊ฐ„(DST)์€ ์ „ํ˜•์ ์ธ ํŠธ๋ฆฌ๊ฑฐ์ž…๋‹ˆ๋‹ค. โ€œ๋งค์ฃผ ์ผ์š”์ผ 09:00โ€์ด๋ผ๋Š” ํ‘œํ˜„์€ โ€œ์‹œ์ž‘ ํƒ€์ž„์Šคํƒฌํ”„์—์„œ 7์ผ๋งˆ๋‹คโ€์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํ”„์…‹์ด ๋ฐ”๋€Œ๋ฉด ๋‘ ๊ฐœ๋…์€ ํ•œ ์‹œ๊ฐ„์”ฉ ์–ด๊ธ‹๋‚˜๊ณ  ์บ˜๋ฆฐ๋”๋Š” ์กฐ์šฉํžˆ ํ‹€์–ด์ง‘๋‹ˆ๋‹ค.

์—ฌํ–‰๊ณผ ํ˜ผํ•ฉ๋œ ์‹œ๊ฐ„๋Œ€๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์•ฝ์€ ๋ฌผ๋ฆฌ์  ์žฅ์†Œ(์˜ˆ: ์‹œ์นด๊ณ ์˜ ๋ฏธ์šฉ์‹ค ์ขŒ์„)์— ๋ฌถ์—ฌ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ์€ ๋Ÿฐ๋˜์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์†Œ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„์„ ์‚ฌ๋žŒ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ ์–ด๋„ ํ•œ์ชฝ์—๋Š” ์ž˜๋ชป๋œ ๋กœ์ปฌ ์‹œ๊ฐ„์ด ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์‹คํŒจ ๋ชจ๋“œ:

  • ์ €์žฅ๋œ ํƒ€์ž„์Šคํƒฌํ”„์— ๊ฐ„๊ฒฉ์„ ๋”ํ•ด ๋ฐœ์ƒ์„ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ DST๊ฐ€ ๋ฐ”๋€๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋Œ€ ๊ทœ์น™ ์—†์ด "๋กœ์ปฌ ์‹œ๊ฐ„"๋งŒ ์ €์žฅํ•ด ๋‚˜์ค‘์— ์˜๋„ํ•œ ์‹œ์ ์„ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • DST ๊ฒฝ๊ณ„๋ฅผ ๋„˜์ง€ ์•Š๋Š” ๋‚ ์งœ๋งŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์—์„œ โ€œ์ด๋ฒคํŠธ ์‹œ๊ฐ„๋Œ€โ€, โ€œ์‚ฌ์šฉ์ž ์‹œ๊ฐ„๋Œ€โ€, โ€œ์„œ๋ฒ„ ์‹œ๊ฐ„๋Œ€โ€๋ฅผ ์„ž์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์ „์—, ์ œํ’ˆ์—์„œ โ€œ์ •ํ™•ํ•จโ€์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”.

์˜ˆ์•ฝ์˜ ๊ฒฝ์šฐ โ€œ์ •ํ™•ํ•จโ€์€ ๋ณดํ†ต: ์•ฝ์†์ด ์žฅ์†Œ์˜ ์‹œ๊ฐ„๋Œ€์—์„œ ์˜๋„๋œ ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•˜๊ณ , ์ด๋ฅผ ๋ณด๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€ํ™˜๋˜์–ด ๋ณด์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ต๋Œ€ ๊ทผ๋ฌด์˜ ๊ฒฝ์šฐ โ€œ์ •ํ™•ํ•จโ€์€ ์ข…์ข…: ์ง์›์ด ์—ฌํ–‰ ์ค‘์ด๋”๋ผ๋„ ๊ทผ๋ฌด๋Š” ๋งค์žฅ ๊ณ ์ •์˜ ๋กœ์ปฌ ์‹œ๊ฐ„์— ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฅ์†Œ์— ๋ฌถ์„์ง€ ์‚ฌ๋žŒ์— ๋ฌถ์„์ง€ ํ•˜๋Š” ๊ทธ ํ•œ ๊ฐ€์ง€ ๊ฒฐ์ •์ด ๋‚˜๋จธ์ง€๋ฅผ ๋ชจ๋‘ ์ขŒ์šฐํ•ฉ๋‹ˆ๋‹ค: ๋ฌด์—‡์„ ์ €์žฅํ• ์ง€, ์–ด๋–ป๊ฒŒ ๋ฐ˜๋ณต์„ ์ƒ์„ฑํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•œ ์‹œ๊ฐ„ ์ฐจ์ด์˜ ๋†€๋ผ์›€ ์—†์ด ์บ˜๋ฆฐ๋” ๋ทฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐํšŒํ• ์ง€.

์˜ฌ๋ฐ”๋ฅธ ์‚ฌ๊ณ  ๋ชจ๋ธ ์„ ํƒ: ์ธ์Šคํ„ดํŠธ vs ๋กœ์ปฌ ์‹œ๊ฐ„

๋งŽ์€ ๋ฒ„๊ทธ๋Š” ๋‘ ๊ฐ€์ง€ ์‹œ๊ฐ„ ๊ฐœ๋…์„ ์„ž์–ด์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

  • ์ธ์Šคํ„ดํŠธ: ์ ˆ๋Œ€์ ์ธ ํ•œ ์ˆœ๊ฐ„. ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์‹œ๊ฐ„ ๊ทœ์น™: โ€œํŒŒ๋ฆฌ์—์„œ ๋งค์ฃผ ์›”์š”์ผ ์˜ค์ „ 9์‹œโ€ ๊ฐ™์€ ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„.

์ธ์Šคํ„ดํŠธ๋Š” ์–ด๋””์„œ๋‚˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. โ€œ2026-03-10 14:00 UTCโ€๋Š” ์ธ์Šคํ„ดํŠธ์ž…๋‹ˆ๋‹ค. ํ™”์ƒ ํ†ตํ™”, ํ•ญ๊ณตํŽธ ์ถœ๋ฐœ, โ€œ์ •ํ™•ํžˆ ์ด ์ˆœ๊ฐ„์— ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹คโ€๋Š” ๋ณดํ†ต ์ธ์Šคํ„ดํŠธ์ž…๋‹ˆ๋‹ค.

๋กœ์ปฌ ์‹œ๊ฐ„์€ ํŠน์ • ์žฅ์†Œ์˜ ์‹œ๊ณ„์—์„œ ์ฝํžˆ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. โ€œEurope/Paris์—์„œ ํ‰์ผ๋งˆ๋‹ค ์˜ค์ „ 9์‹œโ€๋Š” ๋กœ์ปฌ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์˜์—…์‹œ๊ฐ„, ๋ฐ˜๋ณต ์ˆ˜์—…, ์ง์› ๊ต๋Œ€๋Š” ๋ณดํ†ต ์žฅ์†Œ์˜ ์‹œ๊ฐ„๋Œ€์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋Œ€๋Š” ๋‹จ์ˆœํ•œ ํ‘œ์‹œ ์„ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์˜๋ฏธ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ฒฝํ—˜ ๋ฒ•์น™:

  • ์ด๋ฒคํŠธ๊ฐ€ ์ „ ์„ธ๊ณ„์—์„œ ํ•˜๋‚˜์˜ ์‹ค์ œ ์ˆœ๊ฐ„์— ์ผ์–ด๋‚˜์•ผ ํ•˜๋ฉด ์‹œ์ž‘/์ข…๋ฃŒ๋ฅผ ์ธ์Šคํ„ดํŠธ๋กœ(timestamptz) ์ €์žฅํ•˜์„ธ์š”.
  • ์ด๋ฒคํŠธ๊ฐ€ ํ•œ ์žฅ์†Œ์˜ ์‹œ๊ณ„์— ๋”ฐ๋ผ์•ผ ํ•˜๋ฉด ๋กœ์ปฌ ๋‚ ์งœ์™€ ๋กœ์ปฌ ์‹œ๊ฐ„์— ์‹œ๊ฐ„๋Œ€ ID๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•˜์„ธ์š”. ๋ฐœ์ƒ์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์ด๋ฅผ ์‹ค์ œ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์„ธ์š”.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋™ ์ค‘์ด๋ฉด ๋ทฐ์–ด์˜ ์‹œ๊ฐ„๋Œ€๋กœ ํ‘œ์‹œํ•˜๋˜, ์Šค์ผ€์ค„์€ ๊ทธ ์žฅ์†Œ์— ๊ณ ์ •ํ•˜์„ธ์š”.
  • +02:00 ๊ฐ™์€ ์˜คํ”„์…‹์œผ๋กœ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ถ”์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์˜คํ”„์…‹์€ DST ๊ทœ์น™์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ: ๋ณ‘์› ๊ต๋Œ€๋Š” โ€œMon-Fri 09:00-17:00 America/New_Yorkโ€์ž…๋‹ˆ๋‹ค. DST๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ฃผ์—๋„ ๊ต๋Œ€๋Š” ํ˜„์ง€ ๊ธฐ์ค€์œผ๋กœ ์—ฌ์ „ํžˆ 9์‹œ๋ถ€ํ„ฐ 5์‹œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ UTC ์ธ์Šคํ„ดํŠธ๋Š” ํ•œ ์‹œ๊ฐ„์”ฉ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL์—์„œ ์ค‘์š”ํ•œ ํƒ€์ž…(๊ทธ๋ฆฌ๊ณ  ํ”ผํ•  ๊ฒƒ)

๋Œ€๋ถ€๋ถ„์˜ ์บ˜๋ฆฐ๋” ๋ฒ„๊ทธ๋Š” ์ž˜๋ชป๋œ ์ปฌ๋Ÿผ ํƒ€์ž…์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ์‹ค์ œ ์ˆœ๊ฐ„๊ณผ ๋ฒฝ์‹œ๊ณ„ ๊ธฐ๋Œ€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ์ธ์Šคํ„ดํŠธ์—๋Š” timestamptz๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”: ์˜ˆ์•ฝ, ์ถœํ‡ด๊ทผ ๊ธฐ๋ก, ์•Œ๋ฆผ, ์‚ฌ์šฉ์ž๋‚˜ ์ง€์—ญ ๊ฐ„ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค. PostgreSQL์€ ์ด๋ฅผ ์ ˆ๋Œ€ ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ํ‘œ์‹œํ•  ๋•Œ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ ์ •๋ ฌ๊ณผ ์ค‘๋ณต ๊ฒ€์‚ฌ์—์„œ ๊ธฐ๋Œ€ํ•œ ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๋ฒฝ์‹œ๊ณ„ ๊ฐ’์—๋Š” timestamp without time zone(๋˜๋Š” ๋‹จ์ˆœํžˆ time/date ์กฐํ•ฉ)์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์˜ˆ: โ€œ๋งค์ฃผ ์›”์š”์ผ 09:00โ€ ๊ฐ™์€ ๊ฐ’์€ ์ž์ฒด๋กœ ์ธ์Šคํ„ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์‹œ๊ฐ„๋Œ€ ์‹๋ณ„์ž์™€ ์Œ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ฐœ์ƒ์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต ํŒจํ„ด์—๋Š” ๊ธฐ๋ณธ ํƒ€์ž…๋“ค์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค:

  • date๋Š” ๋‚ ์งœ ๋‹จ์œ„ ์˜ˆ์™ธ(๊ณตํœด์ผ)์— ์œ ์šฉ
  • time์€ ์ผ๋ณ„ ์‹œ์ž‘ ์‹œ๊ฐ„
  • interval์€ ์ง€์† ์‹œ๊ฐ„(์˜ˆ: 6์‹œ๊ฐ„ ๊ต๋Œ€)

์‹œ๊ฐ„๋Œ€๋Š” IANA ์ด๋ฆ„(์˜ˆ: America/New_York)์œผ๋กœ text ์ปฌ๋Ÿผ์— ์ €์žฅํ•˜์„ธ์š”(๋˜๋Š” ์ž‘์€ ๋ฃฉ์—… ํ…Œ์ด๋ธ”). -0500 ๊ฐ™์€ ์˜คํ”„์…‹์€ DST ๊ทœ์น™์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์•ฑ์— ์‹ค์šฉ์ ์ธ ์„ธํŠธ:

  • ์˜ˆ์•ฝ๋œ ์•ฝ์†์˜ ์‹œ์ž‘/์ข…๋ฃŒ ์ธ์Šคํ„ดํŠธ๋Š” timestamptz
  • ์˜ˆ์™ธ์ผ์€ date
  • ๋ฐ˜๋ณต ๋กœ์ปฌ ์‹œ์ž‘ ์‹œ๊ฐ„์€ time
  • ์ง€์† ์‹œ๊ฐ„์€ interval
  • IANA ์‹œ๊ฐ„๋Œ€ ID๋Š” text

์˜ˆ์•ฝ ๋ฐ ๊ต๋Œ€ ์•ฑ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์˜ต์…˜

์ตœ๊ณ ์˜ ์Šคํ‚ค๋งˆ๋Š” ์Šค์ผ€์ค„์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐ”๋€Œ๋Š”์ง€์™€ ์‚ฌ์šฉ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์•ž์„ ์กฐํšŒํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์ฒ˜์Œ์— ๋งŽ์€ ํ–‰์„ ์“ฐ๊ฑฐ๋‚˜ ์ฝ์„ ๋•Œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ A: ๋ชจ๋“  ๋ฐœ์ƒ์„ ์ €์žฅํ•˜๊ธฐ

ํ™•์žฅ๋œ ๊ฐ ๊ต๋Œ€๋‚˜ ์˜ˆ์•ฝ๋งˆ๋‹ค ํ•œ ํ–‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๊ฐ€ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์“ฐ๊ธฐ ๋น„์šฉ์ด ํฌ๊ณ  ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ๋งŽ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ์ด๋ฒคํŠธ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ผํšŒ์„ฑ์ด๊ฑฐ๋‚˜, ์•ž์œผ๋กœ ์งง์€ ๊ธฐ๊ฐ„(์˜ˆ: ๋‹ค์Œ 30์ผ)๋งŒ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ B: ๊ทœ์น™์„ ์ €์žฅํ•˜๊ณ  ์ฝ์„ ๋•Œ ํ™•์žฅํ•˜๊ธฐ

์Šค์ผ€์ค„ ๊ทœ์น™(์˜ˆ: "America/New_York์—์„œ ๋งค์ฃผ ์›”ยท์ˆ˜ ์˜ค์ „ 9์‹œ")์„ ์ €์žฅํ•˜๊ณ  ์š”์ฒญ๋œ ๋ฒ”์œ„์—์„œ ๋ฐœ์ƒ์„ ์˜จ๋””๋งจ๋“œ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์œ ์—ฐํ•˜๊ณ  ์ €์žฅ ๊ณต๊ฐ„์ด ์ ๊ฒŒ ๋“ค์ง€๋งŒ, ์ฟผ๋ฆฌ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์›”๋ณ„ ๋ณด๊ธฐ์—์„œ๋Š” ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์บ์‹œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ C: ๊ทœ์น™ + ์บ์‹œ๋œ ๋ฐœ์ƒ(ํ•˜์ด๋ธŒ๋ฆฌ๋“œ)

๊ทœ์น™์„ ์ง„์‹ค์˜ ๊ทผ์›์œผ๋กœ ๋‘๊ณ , ๋กค๋ง ์œˆ๋„์šฐ(์˜ˆ: 60-90์ผ) ๋™์•ˆ ์ƒ์„ฑ๋œ ๋ฐœ์ƒ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ์บ์‹œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ๊ต๋Œ€ ์•ฑ์— ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค: ์›”๋ทฐ๋Š” ๋น ๋ฅด๊ฒŒ ์œ ์ง€๋˜์ง€๋งŒ ํŒจํ„ด์„ ํŽธ์ง‘ํ•  ํ•œ ๊ณณ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ํ…Œ์ด๋ธ” ์„ธํŠธ:

  • schedule: ์†Œ์œ ์ž/๋ฆฌ์†Œ์Šค, ์‹œ๊ฐ„๋Œ€, ๋กœ์ปฌ ์‹œ์ž‘ ์‹œ๊ฐ„, ์ง€์† ์‹œ๊ฐ„, ๋ฐ˜๋ณต ๊ทœ์น™
  • occurrence: start_at timestamptz, end_at timestamptz์™€ ์ƒํƒœ๋ฅผ ํฌํ•จํ•œ ํ™•์žฅ๋œ ์ธ์Šคํ„ด์Šค
  • exception: "์ด ๋‚ ์งœ๋Š” ๊ฑด๋„ˆ๋œ€" ๋˜๋Š” "์ด ๋‚ ์งœ๋Š” ๋‹ค๋ฆ„" ํ‘œ์‹œ์ž
  • override: ํŠน์ • ๋ฐœ์ƒ์— ๋Œ€ํ•œ ์ˆ˜์ •(๋ณ€๊ฒฝ๋œ ์‹œ์ž‘ ์‹œ๊ฐ„, ๊ต๋Œ€ ๊ต์ฒด, ์ทจ์†Œ ํ”Œ๋ž˜๊ทธ)
  • (์„ ํƒ) schedule_cache_state: ๋งˆ์ง€๋ง‰ ์ƒ์„ฑ๋œ ๋ฒ”์œ„๋กœ ๋‹ค์Œ์— ์ฑ„์›Œ์•ผ ํ•  ๋ฒ”์œ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

์บ˜๋ฆฐ๋” ๋ฒ”์œ„ ์ฟผ๋ฆฌ์šฉ ์ธ๋ฑ์Šค:

  • occurrence: btree (resource_id, start_at) ๋ฐ ์ข…์ข… btree (resource_id, end_at)
  • ๋ฒ”์œ„ ์ค‘์ฒฉ(overlaps) ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ๋‹ค๋ฉด: tstzrange(start_at, end_at) ์ƒ์„ฑ ์ปฌ๋Ÿผ๊ณผ gist ์ธ๋ฑ์Šค

๊ทœ์น™์„ ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต ๊ทœ์น™ ํ‘œํ˜„ํ•˜๊ธฐ

์‹œ๊ฐ„ ๊ทœ์น™์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•˜๊ธฐ
์‹œ๊ฐ„ ๊ทœ์น™์„ ๋น ๋ฅด๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์—†์ด ๋ฐ˜๋ณตํ•˜์„ธ์š”.
์‹œ์ž‘ํ•˜๊ธฐ

๋ฐ˜๋ณต ์Šค์ผ€์ค„์€ ๊ทœ์น™์ด ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์œ ์—ฐํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ธ”๋กญ์œผ๋กœ ์ €์žฅ๋  ๋•Œ ๊นจ์ง‘๋‹ˆ๋‹ค. ์ข‹์€ ๊ทœ์น™ ํ˜•์‹์€ ์•ฑ์—์„œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ณ  ํŒ€์ด ๋น ๋ฅด๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์  ์ ‘๊ทผ:

  • ์‹ค์ œ๋กœ ์ง€์›ํ•˜๋Š” ํŒจํ„ด์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•œ ์ปค์Šคํ…€ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉ(์ฃผ๊ฐ„ ๊ต๋Œ€, ์›”๊ฐ„ ์ฒญ๊ตฌ์ผ ๋“ฑ)
  • ๋งŽ์€ ์กฐํ•ฉ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์บ˜๋ฆฐ๋”๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๋ณด๋‚ด์•ผ ํ•˜๋ฉด iCalendar ์Šคํƒ€์ผ(RRULE) ์‚ฌ์šฉ

์‹ค์šฉ์ ์ธ ์ ˆ์ถฉ์•ˆ: ์ œํ•œ๋œ ์˜ต์…˜์„ ํ—ˆ์šฉํ•˜๊ณ  ์ปฌ๋Ÿผ์— ์ €์žฅํ•˜๋˜ RRULE ๋ฌธ์ž์—ด์€ ๊ตํ™˜์šฉ์œผ๋กœ๋งŒ ์ทจ๊ธ‰ํ•˜์„ธ์š”.

์˜ˆ: ์ฃผ๊ฐ„ ๊ต๋Œ€ ๊ทœ์น™์€ ๋‹ค์Œ ํ•„๋“œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • freq(daily/weekly/monthly)์™€ interval(๋งค NํšŒ)
  • byweekday(0-6 ๋ฐฐ์—ด ๋˜๋Š” ๋น„ํŠธ๋งˆ์Šคํฌ)
  • ์›”๊ฐ„ ๊ทœ์น™์„ ์œ„ํ•œ ์„ ํƒ์  bymonthday(1-31)
  • ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ starts_at_local(๋กœ์ปฌ ๋‚ ์งœ+์‹œ๊ฐ„)๊ณผ tzid
  • ์„ ํƒ์  until_date ๋˜๋Š” count(๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ)

๊ฒฝ๊ณ„๋Š” **์ง€์† ์‹œ๊ฐ„(duration)**์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ˆ: 8์‹œ๊ฐ„) โ€” ๊ฐ ๋ฐœ์ƒ์˜ ์ข…๋ฃŒ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๋งค๋ฒˆ ์ €์žฅํ•˜๋Š” ๋Œ€์‹ . ์ง€์† ์‹œ๊ฐ„์€ ์‹œ๊ณ„๊ฐ€ ์ด๋™ํ•ด๋„ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ๋ฐœ์ƒ๋ณ„ ์ข…๋ฃŒ ์‹œ๊ฐ„์€: ์‹œ์ž‘ + ์ง€์† ์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทœ์น™์„ ํ™•์žฅํ•  ๋•Œ๋Š” ์•ˆ์ „ํ•˜๊ณ  ํ•œ์ •๋œ ๋ฒ”์œ„๋กœ ํ•˜์„ธ์š”:

  • window_start์™€ window_end ๋‚ด์—์„œ๋งŒ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐค์ƒ˜ ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•ด ์ž‘์€ ๋ฒ„ํผ(์˜ˆ: 1์ผ)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€ ์ธ์Šคํ„ด์Šค ์ˆ˜(์˜ˆ: 500) ์ดํ›„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ ์ „์— ํ›„๋ณด๋ฅผ ๋จผ์ € ํ•„ํ„ฐ๋ง(์˜ˆ: tzid, freq, ์‹œ์ž‘ ๋‚ ์งœ)ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„: DST ์•ˆ์ „ํ•œ ๋ฐ˜๋ณต ์Šค์ผ€์ค„ ๊ตฌ์ถ•ํ•˜๊ธฐ

์›น๊ณผ ๋ชจ๋ฐ”์ผ์„ ํ•จ๊ป˜ ๋นŒ๋“œํ•˜๊ธฐ
์˜ˆ์•ฝ ์ œํ’ˆ์šฉ ๋ฐฑ์—”๋“œ, ์›น์•ฑ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜์„ธ์š”.
์•ฑ ์ƒ์„ฑ

์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์€: ๊ฐ ๋ฐœ์ƒ์„ ๋จผ์ € ๋กœ์ปฌ ์บ˜๋ฆฐ๋” ์˜๋„(๋‚ ์งœ + ๋กœ์ปฌ ์‹œ๊ฐ„ + ์žฅ์†Œ์˜ ์‹œ๊ฐ„๋Œ€)๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์ •๋ ฌ, ์ถฉ๋Œ ๊ฒ€์‚ฌ ๋˜๋Š” ํ‘œ์‹œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1) UTC ์ถ”์ธก์ด ์•„๋‹Œ ๋กœ์ปฌ ์˜๋„๋ฅผ ์ €์žฅํ•˜์„ธ์š”

์Šค์ผ€์ค„์˜ ์œ„์น˜ ์‹œ๊ฐ„๋Œ€(IANA ์ด๋ฆ„, ์˜ˆ: America/New_York)์™€ ๋กœ์ปฌ ์‹œ์ž‘ ์‹œ๊ฐ„(์˜ˆ: 09:00)์„ ์ €์žฅํ•˜์„ธ์š”. ์ด ๋กœ์ปฌ ์‹œ๊ฐ„์€ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ด๋ฉฐ DST๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ง€์† ์‹œ๊ฐ„๊ณผ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„(์‹œ์ž‘ ๋‚ ์งœ์™€ ์ข…๋ฃŒ ๋‚ ์งœ ๋˜๋Š” ๋ฐ˜๋ณต ํšŸ์ˆ˜)๋ฅผ ์ €์žฅํ•˜์„ธ์š”. ๊ฒฝ๊ณ„๋Š” "๋ฌดํ•œ ํ™•์žฅ" ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2) ์˜ˆ์™ธ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ๋ณ„๋„๋กœ ๋ชจ๋ธ๋งํ•˜์„ธ์š”

๊ฑด๋„ˆ๋›ธ ๋‚ ์งœ์™€ ๋ณ€๊ฒฝ๋œ ๋ฐœ์ƒ์„ ์œ„ํ•œ ๋‘ ๊ฐœ์˜ ์ž‘์€ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์„ธ์š”. schedule_id + local_date๋กœ ํ‚ค๋ฅผ ์ง€์ •ํ•˜๋ฉด ์›๋ž˜ ๋ฐ˜๋ณต๊ณผ ์ •ํ™•ํžˆ ๋งค์นญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์šฉ์  ๊ตฌ์กฐ ์˜ˆ:

-- core schedule
-- tz is the location time zone
-- start_time is local wall-clock time
schedule(id, tz text, start_date date, end_date date, start_time time, duration_mins int, by_dow int[])

schedule_skip(schedule_id, local_date date)

schedule_override(schedule_id, local_date date, new_start_time time, new_duration_mins int)

3) ์š”์ฒญ๋œ ์œˆ๋„์šฐ ์•ˆ์—์„œ๋งŒ ํ™•์žฅํ•˜์„ธ์š”

๋ Œ๋”๋งํ•  ๋ฒ”์œ„(์ฃผ, ์›” ๋“ฑ)์˜ ๋กœ์ปฌ ๋‚ ์งœ ํ›„๋ณด๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์š”์ผ๋กœ ํ•„ํ„ฐ๋งํ•œ ๋’ค ๊ฑด๋„ˆ๋›ฐ๊ธฐ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ์ ์šฉํ•˜์„ธ์š”.

WITH days AS (
  SELECT d::date AS local_date
  FROM generate_series($1::date, $2::date, interval '1 day') d
), base AS (
  SELECT s.id, s.tz, days.local_date,
         make_timestamp(extract(year from days.local_date)::int,
                        extract(month from days.local_date)::int,
                        extract(day from days.local_date)::int,
                        extract(hour from s.start_time)::int,
                        extract(minute from s.start_time)::int, 0) AS local_start
  FROM schedule s
  JOIN days ON days.local_date BETWEEN s.start_date AND s.end_date
  WHERE extract(dow from days.local_date)::int = ANY (s.by_dow)
)
SELECT b.id,
       (b.local_start AT TIME ZONE b.tz) AS start_utc
FROM base b
LEFT JOIN schedule_skip sk
  ON sk.schedule_id = b.id AND sk.local_date = b.local_date
WHERE sk.schedule_id IS NULL;

4) ๋ณ€ํ™˜์€ ๋งจ ๋งˆ์ง€๋ง‰์—, ๋ทฐ์–ด์šฉ์œผ๋กœ๋งŒ ํ•˜์„ธ์š”

์ •๋ ฌ, ์ถฉ๋Œ ๊ฒ€์‚ฌ, ์˜ˆ์•ฝ์—๋Š” start_utc๋ฅผ timestamptz๋กœ ์œ ์ง€ํ•˜์„ธ์š”. ํ‘œ์‹œํ•  ๋•Œ๋งŒ ๋ทฐ์–ด์˜ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด DST ๋†€๋ผ์›€์„ ํ”ผํ•˜๊ณ  ์บ˜๋ฆฐ๋” ๋ทฐ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์บ˜๋ฆฐ๋” ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฟผ๋ฆฌ ํŒจํ„ด

์บ˜๋ฆฐ๋” ํ™”๋ฉด์€ ๋ณดํ†ต ๋ฒ”์œ„ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค: โ€œfrom_ts์™€ to_ts ์‚ฌ์ด์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋ณด์—ฌ์ค˜.โ€ ์•ˆ์ „ํ•œ ํŒจํ„ด์€:

  1. ํ•ด๋‹น ์œˆ๋„์šฐ์˜ ํ›„๋ณด๋งŒ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜ˆ์™ธ/์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์ตœ์ข… ํ–‰์„ start_at์™€ end_at์„ timestamptz๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

generate_series๋กœ ์ผ๊ฐ„ ๋˜๋Š” ์ฃผ๊ฐ„ ํ™•์žฅ

๊ฐ„๋‹จํ•œ ์ฃผ๊ฐ„ ๊ทœ์น™(์˜ˆ: "๋งค์ฃผ ์›”~๊ธˆ ๋กœ์ปฌ ์˜ค์ „ 9์‹œ")์—๋Š” ์Šค์ผ€์ค„์˜ ์‹œ๊ฐ„๋Œ€์—์„œ ๋กœ์ปฌ ๋‚ ์งœ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ๊ฐ ๋กœ์ปฌ ๋‚ ์งœ + ๋กœ์ปฌ ์‹œ๊ฐ„์„ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์„ธ์š”.

-- Inputs: :from_ts, :to_ts are timestamptz
-- rule.tz is an IANA zone like 'America/New_York'
WITH bounds AS (
  SELECT
    (:from_ts AT TIME ZONE rule.tz)::date AS from_local_date,
    (:to_ts   AT TIME ZONE rule.tz)::date AS to_local_date
  FROM rule
  WHERE rule.id = :rule_id
), days AS (
  SELECT d::date AS local_date
  FROM bounds, generate_series(from_local_date, to_local_date, interval '1 day') AS g(d)
)
SELECT
  (local_date + rule.start_local_time) AT TIME ZONE rule.tz AS start_at,
  (local_date + rule.end_local_time)   AT TIME ZONE rule.tz AS end_at
FROM rule
JOIN days ON true
WHERE EXTRACT(ISODOW FROM local_date) = ANY(rule.by_isodow);

์ด ๋ฐฉ๋ฒ•์€ ๋ฐœ์ƒ๋งˆ๋‹ค timestamptz๋กœ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ DST ๋ณ€ํ™”๊ฐ€ ํ•ด๋‹น ๋‚ ์งœ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

"n๋ฒˆ์งธ ์š”์ผ" ๊ฐ™์€ ๋ณต์žกํ•œ ๊ทœ์น™์—๋Š” ์žฌ๊ท€ CTE

๊ทœ์น™์ด "n๋ฒˆ์งธ ์š”์ผ"์ด๋‚˜ ๊ฐญ, ์ปค์Šคํ…€ ๊ฐ„๊ฒฉ์— ์˜์กดํ•˜๋ฉด ์žฌ๊ท€ CTE๋กœ ๋‹ค์Œ ๋ฐœ์ƒ์„ ๋ฐ˜๋ณต ์ƒ์„ฑํ•ด to_ts๋ฅผ ์ง€๋‚  ๋•Œ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์œˆ๋„์šฐ์— ๊ณ ์ •ํ•˜์—ฌ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

ํ›„๋ณด ํ–‰์„ ์–ป์œผ๋ฉด (rule_id, start_at) ๋˜๋Š” (rule_id, local_date) ๊ฐ™์€ ๋กœ์ปฌ ํ‚ค๋กœ ์˜ˆ์™ธ์™€ ์ทจ์†Œ๋ฅผ ์กฐ์ธํ•ด ์ ์šฉํ•˜์„ธ์š”. ์ทจ์†Œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํ–‰์„ ์ œ๊ฑฐํ•˜๊ณ , ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์žˆ์œผ๋ฉด start_at/end_at์„ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๊ด€๋ จ ํŒจํ„ด:

  • ์ดˆ๊ธฐ์— ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜์„ธ์š”: ๊ทœ์น™์„ ๋จผ์ € ํ•„ํ„ฐ๋งํ•œ ๋’ค [from_ts, to_ts) ๋‚ด์—์„œ๋งŒ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์™ธ/์˜ค๋ฒ„๋ผ์ด๋“œ ํ…Œ์ด๋ธ”์€ (rule_id, start_at) ๋˜๋Š” (rule_id, local_date)์— ์ธ๋ฑ์Šคํ•˜์„ธ์š”.
  • ์›”๋ทฐ๋ฅผ ์œ„ํ•ด ์ˆ˜๋…„์น˜๋ฅผ ํ™•์žฅํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ๊ทœ์น™์ด ๋ฐ”๋€” ๋•Œ ๊น”๋”ํ•˜๊ฒŒ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™•์žฅ๋œ ๋ฐœ์ƒ์„ ์บ์‹œํ•˜์„ธ์š”.

์˜ˆ์™ธ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์—”๋“œํˆฌ์—”๋“œ ์Šค์ผ€์ค„๋ง ์™„์„ฑํ•˜๊ธฐ
์ธ์ฆ, ์•Œ๋ฆผ, ์Šค์ผ€์ค„ ์›Œํฌํ”Œ๋กœ๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ๋•์…˜ ์ค€๋น„๋œ ์•ฑ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์„ธ์š”.
์ง€๊ธˆ ์‹œ์ž‘

๋ฐ˜๋ณต ์Šค์ผ€์ค„์€ ์•ˆ์ „ํ•˜๊ฒŒ ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด์•ผ ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ์•ฝ๊ณผ ๊ต๋Œ€ ์•ฑ์—์„œ โ€œ์ •์ƒโ€ ์ฃผ๋Š” ๊ธฐ๋ณธ ๊ทœ์น™์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค: ๊ณตํœด์ผ, ์ทจ์†Œ, ์ด๋™๋œ ์•ฝ์†, ์ง์› ๊ต์ฒด ๋“ฑ. ์˜ˆ์™ธ๋ฅผ ๋‚˜์ค‘์— ๋ง๋ถ™์ด๋ฉด ์บ˜๋ฆฐ๋” ๋ทฐ๊ฐ€ ์–ด๊ธ‹๋‚˜๊ฑฐ๋‚˜ ์ค‘๋ณต์ด ์ƒ๊น๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•˜์„ธ์š”:

  • ๊ธฐ๋ณธ ์Šค์ผ€์ค„(๋ฐ˜๋ณต ๊ทœ์น™๊ณผ ๊ทธ ์‹œ๊ฐ„๋Œ€)
  • ๊ฑด๋„ˆ๋›ฐ๊ธฐ(๋ฐœ์ƒํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๋‚ ์งœ/์ธ์Šคํ„ด์Šค)
  • ์˜ค๋ฒ„๋ผ์ด๋“œ(๋ฐœ์ƒ์€ ์กด์žฌํ•˜์ง€๋งŒ ์„ธ๋ถ€๊ฐ€ ๋ณ€๊ฒฝ๋จ)

๊ณ ์ •๋œ ์šฐ์„ ์ˆœ์œ„ ์‚ฌ์šฉ

ํ•œ ๊ฐ€์ง€ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”. ์ผ๋ฐ˜์ ์ธ ์„ ํƒ:

  1. ๊ธฐ๋ณธ ๋ฐ˜๋ณต์—์„œ ํ›„๋ณด ์ƒ์„ฑ
  2. ์˜ค๋ฒ„๋ผ์ด๋“œ ์ ์šฉ(์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋Œ€์ฒด)
  3. ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์ ์šฉ(์ˆจ๊น€)

์‚ฌ์šฉ์ž์—๊ฒŒ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฌ์šด ๊ทœ์น™์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์ฒดํ•  ๋•Œ ์ค‘๋ณต ๋ฐฉ์ง€

์ค‘๋ณต์€ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ ๋ฐœ์ƒ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ–‰์„ ๋‘˜ ๋‹ค ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •์  ํ‚ค๋กœ ๋ฐฉ์ง€ํ•˜์„ธ์š”:

  • ๊ฐ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์— (schedule_id, local_date, start_time, tzid) ๊ฐ™์€ ์•ˆ์ • ํ‚ค๋ฅผ ๋ถ€์—ฌํ•˜์„ธ์š”.
  • ์˜ค๋ฒ„๋ผ์ด๋“œ ํ–‰์— ์ด ํ‚ค๋ฅผ "์›๋ž˜ ๋ฐœ์ƒ ํ‚ค"๋กœ ์ €์žฅํ•˜์„ธ์š”.
  • ๊ธฐ๋ณธ ๋ฐœ์ƒ๋‹น ํ•˜๋‚˜์˜ ์˜ค๋ฒ„๋ผ์ด๋“œ๋งŒ ์กด์žฌํ•˜๋„๋ก ๊ณ ์œ  ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฟผ๋ฆฌ์—์„œ ๋งค์นญ๋˜๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ๋œ ๋ฐœ์ƒ์€ ์ œ์™ธํ•˜๊ณ  ์˜ค๋ฒ„๋ผ์ด๋“œ ํ–‰์„ ํ•ฉ์น˜๋ฉด ์ค‘๋ณต์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๊ฐ€๋Šฅ์„ฑ ์œ ์ง€

์˜ˆ์™ธ๋Š” ๋ถ„์Ÿ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ณณ์ž…๋‹ˆ๋‹ค("๋ˆ„๊ฐ€ ๋‚ด ๊ต๋Œ€๋ฅผ ๋ฐ”๊ฟจ์ง€?"). skips์™€ overrides์— ๊ธฐ๋ณธ ๊ฐ์‚ฌ ํ•„๋“œ(created_by, created_at, updated_by, updated_at, ์„ ํƒ์  ์ด์œ )๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

ํ•œ ์‹œ๊ฐ„ ์˜ค์ฐจ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ”ํ•œ ์‹ค์ˆ˜

๋Œ€๋ถ€๋ถ„์˜ ํ•œ ์‹œ๊ฐ„ ๋ฒ„๊ทธ๋Š” ์ธ์Šคํ„ดํŠธ(UTC ํƒ€์ž„๋ผ์ธ์˜ ์ )์™€ ๋กœ์ปฌ ์‹œ๊ณ„ ์ฝ๊ธฐ(์˜ˆ: ๋‰ด์š•์˜ ๋งค์ฃผ ์›”์š”์ผ 09:00)๋ฅผ ํ˜ผ๋™ํ•˜๋Š” ๋ฐ์„œ ์˜ต๋‹ˆ๋‹ค.

์ „ํ˜•์ ์ธ ์‹ค์ˆ˜๋Š” ๋กœ์ปฌ ๋ฒฝ์‹œ๊ณ„ ๊ทœ์น™์„ timestamptz๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋‰ด์š•์˜ ์›”์š”์ผ ์˜ค์ „ 9์‹œ"๋ฅผ ๋‹จ์ผ timestamptz๋กœ ์ €์žฅํ•˜๋ฉด ์ด๋ฏธ ํŠน์ • ๋‚ ์งœ(๋ฐ ๊ทธ๋•Œ์˜ DST ์ƒํƒœ)๋ฅผ ์„ ํƒํ•œ ์…ˆ์ด ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋ฏธ๋ž˜์˜ ์›”์š”์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์›๋ž˜ ์˜๋„("ํ•ญ์ƒ ๋กœ์ปฌ 09:00")๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋นˆ๋ฒˆํ•œ ์›์ธ์€ -05:00 ๊ฐ™์€ ๊ณ ์ • UTC ์˜คํ”„์…‹์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜คํ”„์…‹์€ DST ๊ทœ์น™์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IANA ์กด ์ด๋ฆ„(์˜ˆ: America/New_York)์„ ์ €์žฅํ•˜๊ณ  PostgreSQL์ด ๊ฐ ๋‚ ์งœ์— ๋งž๋Š” ๊ทœ์น™์„ ์ ์šฉํ•˜๊ฒŒ ํ•˜์„ธ์š”.

๋ณ€ํ™˜ ์‹œ์ ์„ ์กฐ์‹ฌํ•˜์„ธ์š”. ๋ฐ˜๋ณต ์ƒ์„ฑ ์ค‘์— ๋„ˆ๋ฌด ์ผ์ฐ UTC๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด DST ์˜คํ”„์…‹์„ ๊ณ ์ •ํ•ด ๋งค ๋ฐœ์ƒ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์•ˆ์ „ํ•œ ํŒจํ„ด์€: ๋ฐœ์ƒ์„ ๋กœ์ปฌ(๋‚ ์งœ + ๋กœ์ปฌ ์‹œ๊ฐ„ + ์กด)์œผ๋กœ ์ƒ์„ฑํ•œ ๋’ค ๊ฐ ๋ฐœ์ƒ์„ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฐ˜๋ณต๋˜๋Š” ์‹ค์ˆ˜ ๋ชฉ๋ก:

  • ๋ฐ˜๋ณต ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ €์žฅํ•ด์•ผ ํ•  ๋•Œ timestamptz๋ฅผ ์‚ฌ์šฉํ•จ(์ด๋Ÿด ๋•Œ๋Š” time + tzid + ๊ทœ์น™์ด ํ•„์š”)
  • IANA ์กด์ด ์•„๋‹ˆ๋ผ ์˜คํ”„์…‹๋งŒ ์ €์žฅํ•จ
  • ๋ฐ˜๋ณต ์ƒ์„ฑ ์ค‘์— ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•จ์ด ์•„๋‹ˆ๋ผ ๋งˆ์ง€๋ง‰์— ๋ณ€ํ™˜ํ•จ
  • ๋ฌดํ•œํžˆ ํ™•์žฅ๋˜๋Š” ๋ฐ˜๋ณต์„ ํ•˜๋“œํ•œ ์‹œ๊ฐ„ ์œˆ๋„์šฐ ์—†์ด ํ™•์žฅํ•จ
  • DST ์‹œ์ž‘ ์ฃผ์™€ ์ข…๋ฃŒ ์ฃผ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Œ

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ์žก๋Š” ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ: DST๊ฐ€ ์žˆ๋Š” ์กด์„ ๊ณจ๋ผ ์ฃผ๊ฐ„ 09:00 ๊ต๋Œ€๋ฅผ ๋งŒ๋“ค๊ณ  DST ๋ณ€๊ฒฝ์„ ํฌํ•จํ•œ ๋‘ ๋‹ฌ์งœ๋ฆฌ ์บ˜๋ฆฐ๋”๋ฅผ ๋ Œ๋”๋งํ•˜์„ธ์š”. ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋กœ์ปฌ ๊ธฐ์ค€์œผ๋กœ ๋งค๋ฒˆ 09:00์œผ๋กœ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” UTC ์ธ์Šคํ„ดํŠธ๋Š” ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค).

์ถœ์‹œ ์ „์— ํ™•์ธํ•  ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์žฅ์†Œ๋ณ„๋กœ ๊ต๋Œ€ ๊ทผ๋ฌด ๊ด€๋ฆฌํ•˜๊ธฐ
์žฅ์†Œ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ ์ •๋œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ง์› ๊ต๋Œ€ ์Šค์ผ€์ค„์„ ๋งŒ๋“œ์„ธ์š”.
AppMaster ์ฒดํ—˜ํ•˜๊ธฐ

์ถœ์‹œ ์ „์— ๊ธฐ๋ณธ์„ ์ ๊ฒ€ํ•˜์„ธ์š”:

  • ๋ชจ๋“  ์Šค์ผ€์ค„์ด ๋ช…๋ช…๋œ ์‹œ๊ฐ„๋Œ€์™€ ์—ฐ๊ณ„๋˜์–ด ์žˆ๋Š”๊ฐ€(์Šค์ผ€์ค„ ์ž์ฒด์— ์ €์žฅ)?
  • IANA ์กด ID(์˜ˆ: America/New_York)๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”๊ฐ€, ์›์‹œ ์˜คํ”„์…‹์ด ์•„๋‹Œ๊ฐ€?
  • ๋ฐ˜๋ณต ํ™•์žฅ์€ ์š”์ฒญ๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๋Š”๊ฐ€?
  • ์˜ˆ์™ธ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ์— ๋‹จ์ผ ๋ฌธ์„œํ™”๋œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š”๊ฐ€?
  • DST ๋ณ€๊ฒฝ ์ฃผ์™€ ์Šค์ผ€์ค„ ์‹œ๊ฐ„๋Œ€์™€ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์˜ ๋ทฐ์–ด๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๊ฐ€?

ํ˜„์‹ค์ ์ธ ๋“œ๋ผ์ด๋Ÿฐ์„ ํ•˜๋‚˜ ํ•ด๋ณด์„ธ์š”: Europe/Berlin์˜ ๋งค์ฃผ 09:00 ๊ต๋Œ€๊ฐ€ ์žˆ๊ณ  ๋งค๋‹ˆ์ €๋Š” America/Los_Angeles์—์„œ ๋ด…๋‹ˆ๋‹ค. ๊ฐ ์ฃผ๋งˆ๋‹ค ๊ต๋Œ€๊ฐ€ ๋ฒ ๋ฅผ๋ฆฐ ์‹œ๊ฐ„์œผ๋กœ 09:00์œผ๋กœ ์œ ์ง€๋˜๋Š”์ง€, ๊ฐ ์ง€์—ญ์˜ DST๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ”๋€Œ์–ด๋„ ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์˜ˆ์‹œ: ๊ณตํœด์ผ๊ณผ DST ๋ณ€๊ฒฝ์ด ํฌํ•จ๋œ ์ฃผ๊ฐ„ ์ง์› ๊ต๋Œ€

์บ˜๋ฆฐ๋” ํ…Œ์ด๋ธ” ์„ค๊ณ„ํ•˜๊ธฐ
Data Designer๋ฅผ ์‚ฌ์šฉํ•ด ์Šค์ผ€์ค„, ๋ฐœ์ƒ ํ•ญ๋ชฉ, ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ๊น”๋”ํ•œ ์Šคํ‚ค๋งˆ๋กœ ๋ชจ๋ธ๋งํ•˜์„ธ์š”.
ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์ž‘์€ ํด๋ฆฌ๋‹‰์ด ๋งค์ฃผ ์›”์š”์ผ 09:00~17:00 America/New_York ํ˜„์ง€ ์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜๋ณต ๊ต๋Œ€๋ฅผ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ฃผ์˜ ์›”์š”์ผ์€ ๊ณตํœด์ผ์ด๋ผ ๋ฌธ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ํ•œ ์ง์›์€ 2์ฃผ๊ฐ„ ์œ ๋Ÿฝ์œผ๋กœ ์ด๋™ ์ค‘์ด์ง€๋งŒ ์Šค์ผ€์ค„์€ ์ง์›์˜ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ํด๋ฆฌ๋‹‰์˜ ๋ฒฝ์‹œ๊ณ„์— ๋ฌถ์—ฌ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด:

  • ์š”์ผ = ์›”์š”์ผ, ๋กœ์ปฌ ์‹œ๊ฐ„ = 09:00~17:00 ๊ฐ™์€ ๋กœ์ปฌ ๋‚ ์งœ์— ๊ณ ์ •๋œ ๋ฐ˜๋ณต ๊ทœ์น™์„ ์ €์žฅํ•˜์„ธ์š”.
  • ์Šค์ผ€์ค„ ์‹œ๊ฐ„๋Œ€(America/New_York)๋ฅผ ์ €์žฅํ•˜์„ธ์š”.
  • ๊ทœ์น™์— ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์ ์ด ๋˜๋„๋ก ์œ ํšจ ์‹œ์ž‘ ๋‚ ์งœ๋ฅผ ์ €์žฅํ•˜์„ธ์š”.
  • ๊ณตํœด์ผ ์›”์š”์ผ์„ ์ทจ์†Œํ•˜๋Š” ์˜ˆ์™ธ(๋ฐ ์ผํšŒ์„ฑ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์˜ค๋ฒ„๋ผ์ด๋“œ)๋ฅผ ์ €์žฅํ•˜์„ธ์š”.

์ด์ œ DST ๋ณ€๊ฒฝ์„ ํฌํ•จํ•˜๋Š” 2์ฃผ ๋ฒ”์œ„๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด, ์ฟผ๋ฆฌ๋Š” ํ•ด๋‹น ๋กœ์ปฌ ๋‚ ์งœ ๋ฒ”์œ„์˜ ์›”์š”์ผ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋ฆฌ๋‹‰์˜ ๋กœ์ปฌ ์‹œ๊ฐ„์„ ๋ถ™์ธ ๋’ค ๊ฐ ๋ฐœ์ƒ์„ ์ ˆ๋Œ€ ์ธ์Šคํ„ดํŠธ(timestamptz)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜์ด ๋ฐœ์ƒ๋งˆ๋‹ค ์ผ์–ด๋‚˜๋ฏ€๋กœ DST๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋‚ ์งœ์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ๋ทฐ์–ด๋Š” ๋™์ผํ•œ ์ธ์Šคํ„ดํŠธ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋กœ์ปฌ ์‹œ๊ฐ์„ ๋ด…๋‹ˆ๋‹ค:

  • ๋กœ์Šค์•ค์ ค๋ ˆ์Šค์˜ ๋งค๋‹ˆ์ €๋Š” ์‹œ๊ณ„์ƒ ๋” ์ด๋ฅธ ์‹œ๊ฐ„์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.
  • ๋ฒ ๋ฅผ๋ฆฐ์— ์žˆ๋Š” ์ด๋™ ์ค‘์ธ ์ง์›์€ ๋” ๋Šฆ์€ ์‹œ๊ฐ„์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ํด๋ฆฌ๋‹‰์€ ์›ํ•œ ๊ฒƒ์„ ์–ป์Šต๋‹ˆ๋‹ค: ๋งค์ฃผ ๊ณตํœด์ผ์ด ์•„๋‹Œ ์›”์š”์ผ๋งˆ๋‹ค ๋‰ด์š• ์‹œ๊ฐ„์œผ๋กœ 09:00~17:00.

๋‹ค์Œ ๋‹จ๊ณ„: ๊ตฌํ˜„, ํ…Œ์ŠคํŠธ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด

์‹œ๊ฐ„ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์กฐ๊ธฐ์— ๊ณ ์ •ํ•˜์„ธ์š”: ๊ทœ์น™๋งŒ ์ €์žฅํ• ์ง€, ๋ฐœ์ƒ๋งŒ ์ €์žฅํ• ์ง€, ์•„๋‹ˆ๋ฉด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์ผ์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”. ๋งŽ์€ ์˜ˆ์•ฝยท๊ต๋Œ€ ์ œํ’ˆ์—๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๊ฐ€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค: ๊ทœ์น™์„ ์ง„์‹ค์˜ ๊ทผ์›์œผ๋กœ ๋‘๊ณ  ํ•„์š”ํ•˜๋ฉด ๋กค๋ง ์บ์‹œ๋ฅผ ์ €์žฅํ•˜๋ฉฐ ์˜ˆ์™ธ์™€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋Š” ๊ตฌ์ฒด์  ํ–‰์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ณณ์— "์‹œ๊ฐ„ ๊ณ„์•ฝ(time contract)"์„ ๋ฌธ์„œํ™”ํ•˜์„ธ์š”: ๋ฌด์—‡์ด ์ธ์Šคํ„ดํŠธ์ธ์ง€, ๋ฌด์—‡์ด ๋กœ์ปฌ ๋ฒฝ์‹œ๊ณ„์ธ์ง€, ๊ฐ ๊ฐ’์„ ์–ด๋А ์ปฌ๋Ÿผ์— ์ €์žฅํ•˜๋Š”์ง€. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•œ ์—”๋“œํฌ์ธํŠธ๋Š” ๋กœ์ปฌ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๋Š” UTC๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณต ์ƒ์„ฑ ๋กœ์ง์€ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ์œ ์ง€ํ•˜์„ธ์š”. ๊ทธ๋ž˜์•ผ "๋กœ์ปฌ ์˜ค์ „ 9์‹œ"๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐ”๊ฟ€ ๋•Œ ํ•œ ๊ณณ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ์†์œผ๋กœ ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์Šค์ผ€์ค„๋ง ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด AppMaster (appmaster.io)์€ ์ด๋Ÿฐ ์ž‘์—…์— ์‹ค์šฉ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค: Data Designer์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ชจ๋ธ๋งํ•˜๊ณ , ์‹œ๊ฐ์  ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐ˜๋ณต๊ณผ ์˜ˆ์™ธ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋ฉด ์‹ค์ œ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ์™€ ์•ฑ ์ฝ”๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์‹œ์ž‘ํ•˜๋‹ค
PostgreSQL์—์„œ ๋ฐ˜๋ณต ์ผ์ •๊ณผ ์‹œ๊ฐ„๋Œ€: ํŒจํ„ด | AppMaster