Backend๐Ÿ–ฅ๏ธ/DB, SQL๐Ÿ›ข๏ธ

[Supabase] cron (์Šค์ผ€์ค„๋ง) ์„ค์ •ํ•˜๊ธฐ

JanuDev 2025. 12. 2. 15:49

Supabase๋กœ ์Šค์ผ€์ค„๋ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋„์ „!!

 

1. Database > Extensions ํด๋ฆญ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๊ณ  ํ™•์žฅํ˜• ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์—

pg_cron์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค. 

์ง€๊ธˆ์€ ํ™œ์„ฑํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์œ„์— ์˜ฌ๋ผ์™€์„œ ๋ณด์ด์ง€๋งŒ.. ์•ˆ๋ณด์ธ๋‹ค๋ฉด ๊ฒ€์ƒ‰์ฐฝ์— pg_cron ๊ฒ€์ƒ‰ ํ›„ ํ™œ์„ฑํ™”ํ•  ๊ฒƒ

 

2. ์Šค์ผ€์ค„๋ง ์‹คํ–‰ํ•  ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

๋‚ด ๋กœ์ง์—๋Š” ๊ธฐ์กด์˜ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์ „๋ถ€ ์‚ญ์ œ → ๋žœ๋ค ์ฃผ์ œ ํ…Œ์ด๋ธ”์—์„œ ์ƒˆ๋กœ์šด row์„ ํƒ    ์ƒˆ๋กœ์šด ์ฃผ์ œ insert์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.

 

1. ๋žœ๋ค ์ฃผ์ œ INSERT

CREATE OR REPLACE FUNCTION dalmuri.get_random_topic_fix() 
RETURNS VOID 
LANGUAGE plpgsql
SET search_path = dalmuri, public
AS $$ 
DECLARE
    selected_topic_content text; 
BEGIN
    -- 1. ์กฐํšŒ ๋กœ์ง ...
    SELECT 
        "RANTO_CONTENT" INTO selected_topic_content
    FROM 
        "RANDOM_TOPIC_VIEW" 
    ORDER BY 
        RANDOM() 
    LIMIT 1;

    -- 2. ์‚ฝ์ž… ๋กœ์ง ...
    IF selected_topic_content IS NOT NULL THEN
        INSERT INTO 
            dalmuri."TODAY_WORD_TOPIC" ("TOPIC_ID", "TODAY_TOPIC", "INSERT_DATETIME")
        VALUES (
            gen_random_uuid(), 
            selected_topic_content, 
            NOW() 
        );
    ELSE
        RAISE NOTICE '[WARN]: RANDOM_TOPIC_VIEW์—์„œ ํ† ํ”ฝ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.';
    END IF;
    
    RETURN; 
    
END;
$$;

ํ•จ์ˆ˜ ์ •์˜ ๋ฐ ์„ค์ •

  • CREATE OR REPLACE FUNCTION : ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ๊ต์ฒดํ•˜๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ. ํ•จ์ˆ˜ ์ด๋ฆ„์€ get_random_topic_fix์ด๋ฉฐ ์ธ์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋Š” ์—†์Œ
  • RETURNS VOID : ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ
  • LANGUAGE plpgsql : ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด PostgreSQL๋กœ ์ž‘์„ฑ๋ฌ์Œ์„ ๋ช…์‹œ
  • SET search_path : ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ(search_path)๋ฅผ ์„ค์ •. ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ…Œ์ด๋ธ” ํ˜น์€ ๋ทฐ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์Šคํ‚ค๋งˆ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด dalmuri ์Šคํ‚ค๋งˆ๋ฅผ ๋จผ์ € ์ฐพ๊ณ , ์—†์œผ๋ฉด public ์Šคํ‚ค๋งˆ๋ฅผ ์ฐพ์Œ
  • DECLARE : ํ•จ ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ. ์—ฌ๊ธฐ์„  selected_topic_content

ํ•จ์ˆ˜ ๋ณธ๋ฌธ

  • BEGIN ~ END ์•ˆ์— ์ž‘์„ฑ

1๏ธโƒฃ ์กฐํšŒ ๋กœ์ง (๋ฌด์ž‘์œ„ ํ† ํ”ฝ ์„ ํƒ)

SELECT
    "RANTO_CONTENT" INTO selected_topic_content
FROM
    "RANDOM_TOPIC_VIEW"
ORDER BY
    RANDOM()
LIMIT 1;
  • "RANDOM_TOPIC_VIEW"๋ทฐ์—์„œ "RANTO_CONTENT ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์กฐํšŒ
  • ORDER BY RANDOM() : ์กฐํšŒ๋œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์ •๋ ฌ
  • LIMIT 1: ๋ฌด์ž‘์œ„๋กœ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ ์ค‘ ์ฒซ๋ฒˆ์งธ ํ•ญ๋ชฉ ๋‹จ ํ•˜๋‚˜๋งŒ ์„ ํƒ

2๏ธโƒฃ ์‚ฝ์ž… ๋กœ์ง (์„ ํƒ๋œ ํ† ํ”ฝ ์ €์žฅ)

IF selected_topic_content IS NOT NULL THEN
    INSERT INTO
        dalmuri."TODAY_WORD_TOPIC" ("TOPIC_ID", "TODAY_TOPIC", "INSERT_DATETIME")
    VALUES (
        gen_random_uuid(),
        selected_topic_content,
        NOW()
    );
ELSE
    RAISE NOTICE '[WARN]: RANDOM_TOPIC_VIEW์—์„œ ํ† ํ”ฝ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.';
END IF;

 

  • IF selected_topic_content INS NOT NULL THEN : 1๋‹จ๊ณ„ ์กฐํšŒ ๋กœ์ง์—์„œ selected_topic_content๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์™”๋Š”์ง€ ํ™•์ธ
  • NULL์ด ์•„๋‹ ๊ฒฝ์šฐ = ํ† ํ”ฝ์„ ์ฐพ์•˜์„ ๊ฒฝ์šฐ
    • dalmuri."TODAY_WORD_TOPIC" ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ํ–‰์„ ์‚ฝ์ž…
    • "TOPIC_ID" ์ปฌ๋Ÿผ : gen_random_uuid() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ ํ•œ ๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž(UUID)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅ
    • "TODAY_TOPIC" ์ปฌ๋Ÿผ : ์กฐํšŒํ•œ ๋ฌด์ž‘์œ„ ํ† ํ”ฝ ๋‚ด์šฉ(selected_topic_content)์„ ์ €์žฅ
    • "INSERT_DATETIME" : NOW()ํ•จ์ˆ˜(ํ˜„์žฌ ์‹œ๊ฐ)๋ฅผ ์ €์žฅ 
  • NULL์ผ ๊ฒฝ์šฐ = ํ† ํ”ฝ์„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
    • RAISE NOTICE : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฉ”์‹œ์ง€ ์ฐฝ์— ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  • RETURN : ํ•จ์ˆ˜ ์ข…๋ฃŒ

2. ์˜ค๋Š˜์˜ ๋žœ๋ค ์ฃผ์ œ ๋ฐ ๋Œ“๊ธ€ DELETE

CREATE OR REPLACE FUNCTION dalmuri.reset_today_topic()
RETURNS void
LANGUAGE plpgsql
SET search_path = dalmuri, public
AS $$
  BEGIN
  -- TODAY_WORD_CMNT ๊ด€๋ จ ๋ชจ๋“  ํ–‰ ์‚ญ์ œ
  DELETE FROM dalmuri."TODAY_WORD_CMNT";
  -- TODAY_WORD_TOPIC ๊ด€๋ จ ๋ชจ๋“  ํ–‰ ์‚ญ์ œ
  DELETE FROM dalmuri."TODAY_WORD_TOPIC";
  -- get_random_topic_fix ์‹คํ–‰์œผ๋กœ ๋žœ๋คํ•œ ํ–‰ ์ถ”๊ฐ€
  PERFORM dalmuri.get_random_topic_fix();
  RETURN;
END;
$$;

ํ•จ์ˆ˜ ์ •์˜ ๋ฐ ์„ค์ •

  • CREATE OR REPLACE FUNCTION : ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ต์ฑ„, ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ, ์ธ์ˆ˜๋Š” ์—†์Œ
  • RETURNS VOID : ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜. ๋‚ด๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰
  • LANGUAGE plpgsql : ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด PostgreSQL๋กœ ์ž‘์„ฑ๋จ
  • SET search path = dalmuri, public : ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ๋ฅผ dalmuri์™€ public์œผ๋กœ ์„ค์ •

ํ•จ์ˆ˜ ๋ณธ๋ฌธ

1๏ธโƒฃ TODAY_WORD_CMNT ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™” (๋Œ“๊ธ€ ์‚ญ์ œ)

DELETE FROME dalmuri."TODAY_WORD_CMNT";
  • dalmuri ์Šคํ‚ค๋งˆ์˜ "TODAY_WORD_CMNT" ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์„ ์‚ญ์ œ

2๏ธโƒฃ TODAY_WORD_TOPIC ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™” (ํ† ํ”ฝ ์‚ญ์ œ)

DELETE FROM dalmuri."TODAY_WORD_TOPIC";
  • dalmuri ์Šคํ‚ค๋งˆ์˜ "TODAY_WORD_TOPIC" ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ํ–‰์„ ์‚ญ์ œ

3๏ธโƒฃ ์ƒˆ๋กœ์šด ๋ฌด์ž‘์œ„ ํ† ํ”ฝ ์„ค์ •

PERFORM dalmuri.get_random_topic_fix();
  • PERFORM ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ•จ์ˆ˜์ธ dalmuri.get_random_topic_fix()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹คํ–‰
  • PERFORM : ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ ๋ฌด์‹œํ•˜๊ณ , ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ์ž‘์—…(side effect)๋งŒ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ
๋”๋ณด๊ธฐ

๐Ÿ‘ฝ ์ง€ํ”ผํ‹ฐ๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” PERFORM๋ฌธ๐Ÿ‘ฝ

 

"๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—” ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ญ”๊ฐ€ ํ•˜๊ณ  ์žˆ์Œ"

ํ•จ์ˆ˜๊ฐ€ ๋ญ”๊ฐ€ ๊ฐ’์„ ๋Œ๋ ค์ฃผ๊ธด ํ•˜์ง€๋งŒ ๊ทธ ๊ฐ’์„ ๊ตณ์ด ๋ฐ›์„ ํ•„์š”๋Š” ์—†๊ณ , ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ํ–‰๋™(INSERT, UPDATE, DELETE)๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ฐ๋Š” ๋ช…๋ น์–ด.

 

๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€

SELECT dalmuri.get_random_topic_fix();

์ฒ˜๋Ÿผ ์ƒ๊ฒผ์ง€๋งŒ SELECT๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ›์•„์„œ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ชฉ์ ์ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด DB ๋‚ด๋ถ€์—์„œ ๋Œ์•„๊ฐ€๋Š” ํ•จ์ˆ˜๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๋ถ€์ˆ˜ํšจ๊ณผ(side effect)๋ฅผ ์ผ์œผํ‚ค๋ ค๊ณ  ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

  • ์ž๋™์œผ๋กœ insertํ•˜๊ฑฐ๋‚˜
  • ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ฑฐ๋‚˜
  • ์–ด๋– ํ•œ ๊ณ„์‚ฐ์„ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜

์ด๋Ÿด๋•Œ ๊ตณ์ด SELECT๋ฌธ์„ ์ž‘์„ฑํ•˜๋ฉด "๊ฒฐ๊ณผ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค" ๋“ฑ์˜ ํ˜•ํƒœ๋กœ ์“ธ๋ฐ์—†๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด ๋”ฐ๋ผ์˜ค๋Š”๋ฐ,

์ด๋•Œ PERFORM์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋ฒ„๋ฆฌ๊ณ ("๊ฒฐ๊ณผ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์“ธ๋ฐ์—†๋Š”๊ฑธ ๋ฒ„๋ฆผ) ํ•จ์ˆ˜๋งŒ ์‹คํ–‰ํ•œ๋‹ค.

PERFORM dalmuri.get_random_topic_fix();

 ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’(="๊ฒฐ๊ณผ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค")๋Š” ๋ฒ„๋ฆฌ๊ณ  ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฒŒ์–ด์ง€๋Š” ์ผ๋งŒ ์‹คํ–‰ํ•œ๋‹ค. 

3. ์Šค์ผ€์ค„๋ง๋ฌธ ์ž‘์„ฑ

SELECT cron.schedule(
    'daily-topic-reset',                 -- 1. ์ž‘์—… ์ด๋ฆ„ (job_name)
    '0 0 * * *',                         -- 2. Cron ์Šค์ผ€์ค„ (schedule)
    'SELECT dalmuri.reset_today_topic();' -- 3. ์‹คํ–‰ํ•  SQL ๋ช…๋ น (command)
);

pg_cron ํ™•์žฅ ๋ชจ๋“ˆ์— ์ƒˆ๋กœ์šด ์Šค์ผ€์ค„๋ง ์ž‘์—…์„ ๋“ฑ๋กํ–ˆ๋‹ค. 

  • ์ž‘์—… ์ด๋ฆ„ : ๊ด€๋ฆฌ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„
  • Cron ์Šค์ผ€์ค„ : ์ž‘์—…์„ ์‹คํ–‰ํ•  ์‹œ๊ฐ„์„ ์ •์˜ํ•˜๋Š” ํ‘œ์ค€ ํฌ๋ก  ํ‘œํ˜„์‹
  • SQL ๋ช…๋ น : ์Šค์ผ€์ค„์— ๋งž์ถ”์–ด ์‹ค์ œ๋กœ ์‹คํ–‰๋  SQL ์ฝ”๋“œ

๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์‹คํ–‰์ด ์•ˆ๋ฌ๋”ฐใ…‹ ์ง„์งœ ์˜ค๋งŒ๊ฐ€์ง€ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์ผ๋‹ค

 

1. ์Šค์ผ€์ค„๋ง ๋ณ€๊ฒฝ

SELECT cron.alter_job(
    (SELECT jobid FROM cron.job WHERE jobname = 'daily-topic-reset'), -- 1. job_id
    '0 15 * * *',                                                    -- 2. ์ƒˆ๋กœ์šด Cron ์Šค์ผ€์ค„
    NULL                                                             -- 3. command (๊ธฐ์กด ์œ ์ง€)
);

jobid๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ž‘์—… ์ด๋ฆ„์„ ํ†ตํ•ด jobid๋ฅผ ์กฐํšŒํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋‹ค. 

2. ๋“ฑ๋ก๋œ ๋ชจ๋“  ์Šค์ผ€์ค„๋ง ์ž‘์—… ์กฐํšŒ

SELECT * FROM cron.job;

 2-1 ํŠน์ • ์ปฌ๋Ÿผ์˜ ๋“ฑ๋ก๋œ ์ž‘์—… ์กฐํšŒ

SELECT jobid, jobname, schedule, active, database, username
FROM cron.job
WHERE jobname = 'daily-topic-reset';

3. ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœ์„ธ์Šค ํ™œ์„ฑํ™” ํ™•์ธ

SELECT application_name, backend_type, state
FROM pg_stat_activity
WHERE backend_type = 'pg_cron launcher' OR application_name LIKE 'pg\_cron%';

PostgreSQL ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก(pg_stat_activity)๋ฅผ ์กฐํšŒํ•˜์—ฌ pg_cron์˜ ํ•ต์‹ฌ ํ”„๋กœ์„ธ์Šค์ธ pg_cron launcher๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

pg_cron launcher๊ฐ€ ์‹คํ–‰์ค‘์ด์–ด์•ผ ์Šค์ผ€์ค„๋ง ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

state๊ฐ€ null์ผ ๋•Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋˜์–ด ๋‹ค์Œ ์Šค์ผ€์ค„ ์‹œ๊ฐ„ ๋Œ€๊ธฐ์ค‘(ํœด๋ฉด์ƒํƒœ)์ด๋ผ๋Š” ์˜๋ฏธ๋‹ค.

(์ฐธ๊ณ ๋กœ ๋‚˜๋„ null์ด ๋‚˜์™”๋‹ค)

 

4. ์‹œ๊ฐ„๋Œ€ ํ™•์ธ ๐Ÿ‘ˆ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ

SHOW timezone;

์ด๊ฑธ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ,

์ด๊ฒŒ ๋‚˜์™”๋‹ค. 

์ด๊ฒŒ ์™œ ๋ฌธ์ œ๋ƒ๋ฉด, ํ•œ๊ตญ ์‹œ๊ฐ„์€ UTC๊ฐ€ ์•„๋‹Œ KST๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

๊ทธ๋Ÿฌ๋ฏ€๋กœ UTC๋ฅผ ๊ธฐ์ค€์œผ๋กœ

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด, UTC ๊ธฐ์ค€์˜ ์‹œ๊ฐ„๋Œ€๋กœ ์˜ค์ „ 12์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ตญ ์‹œ๊ฐ„์œผ๋ก  ์˜คํ›„ 3์‹œ์— ์‹คํ–‰๋˜๋Š” ์Šค์ผ€์ค„๋ง์ด๋‹ค.

ํ•œ๊ตญ ์ž…์žฅ์—์„  ์˜คํ›„ 3์‹œ๋กœ ์„ค์ •ํ•ด๋†“๊ณ  ์™œ ์˜ค์ „ 12์‹œ์— ์Šค์ผ€์ค„๋ง ์‹คํ–‰์ด ์•ˆ๋œ๊ฑฐ์ง€?? ํ•œ๊ฑฐ๋‹ค!

UTC - ํ˜‘์ • ์„ธ๊ณ„์‹œ ๊ตญ์ œ์ ์ธ ์‹œ๊ฐ„ ํ‘œ์ค€์œผ๋กœ, ๋Ÿฐ๋˜ ๊ทธ๋ฆฌ๋‹ˆ์น˜ ์ฒœ๋ฌธ๋Œ€ ์‹œ๊ฐ ๊ธฐ์ค€
KST - ํ•œ๊ตญ ํ‘œ์ค€์‹œ ํ•œ๊ตญ์ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€์‹œ๋กœ, UTC๋ณด๋‹ค 9์‹œ๊ฐ„ ๋น ๋ฆ„

๋”ฐ๋ผ์„œ ์Šค์ผ€์ค„๋ง์—์„œ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•  ๋•Œ 

'0 15 * * *',

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ•œ๊ตญ์˜ ์˜ค์ „ 12์‹œ ์‹คํ–‰์ด ์™„์„ฑ๋˜๋Š”๊ฑฐ๋‹ค.

์–ด์ฉ์ง€ 9์‹œ 45๋ถ„์— insert๋œ๊ฑธ ์™œ 0์‹œ 45๋ถ„์— insert๋ฌ๋‹ค๊ณ  ๋œฌ๊ฑด์ง€...!!! ๋‚˜์ค‘๊ฐ€์„œ์•ผ ์•Œ์•„์ฑ˜๋‹ค...

 

๐Ÿ•’ Cron ํ‘œํ˜„์‹ ๊ตฌ์กฐ

Cron ํ‘œํ˜„์‹์€ ๋ณ„๋„์˜ 5๊ฐœ ํ•„๋“œ์ด๋ฉฐ ๊ฐ ํ•„๋“œ๋ณ„๋กœ ํŠน์ • ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ˆœ์„œ ํ•„๋“œ ์˜๋ฏธ ํ—ˆ์šฉ ๋ฒ”์œ„
1 * ๋ถ„(Minute) 0 ~ 59
2 * ์‹œ(Hour) 0 ~ 23
3 * ์ผ(Day) 1 ~ 31 
4 * ์›”(Month) 1 ~ 12
5 * ์š”์ผ(Week) 0 ~7

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ '0 15 * * * ' ์ด๊ฑฐ๋Š”

  • ๋งค ์‹œ๊ฐ„ 0๋ถ„(์ •๊ฐ)
  • ํ•˜๋ฃจ ์ค‘ 15์‹œ(=์˜คํ›„ 3์‹œ)
  • ๋งค์ผ (*)
  • ๋งค์›” (*)
  • ๋งค ์š”์ผ (*)

์ด๋ผ๋Š” ๋œป์ด์—ˆ๋‹ค...

์ฐธ๊ณ ๋กœ Supabase์—์„  ํƒ€์ž„์กด์„ KST๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ UTC ๊ธฐ์ค€์œผ๋กœ ๋งž์ท„๋‹ค.

 

๊ฒฐ๊ณผ

์‹คํ—˜ํ•œ๋Œ€๋กœ ์ฃผ์ œ๋„ ์ž˜ ๋“ค์–ด๊ฐ”๊ณ , ๋Œ“๊ธ€๋„ ์ง€์›Œ์กŒ๋‹ค. ๋งŒ์กฑ!

 

[์ฐธ๊ณ  ์ž๋ฃŒ]

https://silver-line-blog.tistory.com/3

 

UTC์™€ KST, ํ—ท๊ฐˆ๋ ค์„œ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค

์‹œ๊ฐ„์€ ์–ด๋””์„œ๋‚˜ ํ๋ฅด์ง€๋งŒ, ํ‘œํ˜„ ๋ฐฉ์‹์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.์ „ ์„ธ๊ณ„๊ฐ€ ๊ณต์œ ํ•˜๋Š” UTC, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” KST. ์ด ๋‘˜์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์–ด์•ผ ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๐ŸŒ UTC๋ž€?UTC๋Š” Univ

silver-line-blog.tistory.com