์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ETL ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํŠน์ˆ˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ถ”์ถœ, ๋ณ€ํ™˜ ๋ฐ ๋กœ๋“œํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž‘์—… ๋„๊ตฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธฐ๋ก๋˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋กœ๊ทธ์—๋Š” ๋„๊ตฌ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ์–ด๋–ค ๋ชจ๋“ˆ(์ข…์ข… java)์ด ์–ด๋””์—์„œ ์ค‘์ง€๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜(์˜ˆ: ํ…Œ์ด๋ธ” ๊ณ ์œ  ํ‚ค ์œ„๋ฐ˜)๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ETL ์˜ค๋ฅ˜ ์ •๋ณด๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋‚œ XNUMX๋…„ ๋™์•ˆ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋‹ค์†Œ ํฐ ์ €์žฅ์†Œ์— ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ETL ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜์—๋Š” ๊ณต๊ฐ„ ๋ถ€์กฑ, ์—ฐ๊ฒฐ ๋Š๊น€, ์„ธ์…˜ ์ค‘๋‹จ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜์—๋Š” ํ…Œ์ด๋ธ” ํ‚ค ์œ„๋ฐ˜, ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐœ์ฒด, ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋ถ€์กฑ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ •์‹œ์— ์‹œ์ž‘๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์‹ค์ˆ˜๋Š” ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข‹์€ ETL์€ ๋Œ€๋ถ€๋ถ„์„ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋ฌธ์ œ์˜ ์ ˆ๋ฐ˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ค์ˆ˜์˜ 48%๋Š” ๋‹จ์ˆœํ•œ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ๋ฌธ์ œ์˜ XNUMX/XNUMX์€ ์Šคํ† ๋ฆฌ์ง€ ๋…ผ๋ฆฌ ๋˜๋Š” ๋ชจ๋ธ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฌธ์ œ์˜ 18/XNUMX ๋ฏธ๋งŒ์ด ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ XNUMX%๋Š” ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜์˜ 22%๋Š” ๋ณต์žกํ•˜๋ฉฐ ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ๋งŽ์€ ์ฃผ์˜์™€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ์— ํ•œ ๋ฒˆ ์ •๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๊ฐ„๋‹จํ•œ ์‹ค์ˆ˜๋Š” ๊ฑฐ์˜ ๋งค์ผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ETL ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์˜ค๋ฅ˜ ์œ„์น˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ •ํ™•ํ•˜๊ฒŒ ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜๊ณ  ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ๋Š” ๋ฐ ์ตœ์†Œํ•œ์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•  ๋•Œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

ํšจ๊ณผ์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง

ETL ๋ชจ๋‹ˆํ„ฐ๋ง ํ”„๋กœ์„ธ์Šค์—์„œ ๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ETL ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง
์‹œ์ž‘ - ๊ทธ๊ฐ€ ์ผ์„ ์‹œ์ž‘ํ•œ ๋•Œ,
์†Œ์Šค - ๋ฐ์ดํ„ฐ ์†Œ์Šค,
๋ ˆ์ด์–ด - ์–ด๋–ค ์ˆ˜์ค€์˜ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ์žˆ๋Š”์ง€,
ETL ์ž‘์—… ์ด๋ฆ„ - ๋งŽ์€ ์ž‘์€ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ ์—…๋กœ๋“œ ์ ˆ์ฐจ,
๋‹จ๊ณ„ ๋ฒˆํ˜ธ - ์ˆ˜ํ–‰ ์ค‘์ธ ๋‹จ๊ณ„์˜ ๋ฒˆํ˜ธ,
์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ–‰ - ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘,
๊ธฐ๊ฐ„ ์ดˆ - ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„,
์ƒํƒœ - ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ธ์ง€ ์—ฌ๋ถ€: OK, ERROR, RUNNING, HANGS
๋ฉ”์‹œ์ง€ - ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ฑ๊ณตํ•œ ๋ฉ”์‹œ์ง€ ๋˜๋Š” ์˜ค๋ฅ˜ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํšŒ์›๋“ค์—๊ฒŒ ๋ณด๋‚ด๋Š” ํŽธ์ง€. ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ํŽธ์ง€๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์‚ฌ๊ณ  ์œ„์น˜๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋•Œ๋•Œ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ์ž์ฒด๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณด๊ณ ์„œ ์ž‘์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘ ๋ณด๊ธฐ(๋ณด๊ธฐ)๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ETL ๋ชจ๋‹ˆํ„ฐ๋ง ํ…Œ์ด๋ธ”

ETL ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๊ณผ ํ•˜๋‚˜์˜ ๋ณด๊ธฐ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ž‘์€ ์ฐฝ๊ณ  ๊ทธ๋ฆฌ๊ณ  sqlite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ”„๋กœํ† ํƒ€์ž…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

DDL ํ…Œ์ด๋ธ”

CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  SID               INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
  LOG_DT            INTEGER NOT NULL DEFAULT 0,  /* Date time */
  LOG_D             INTEGER NOT NULL DEFAULT 0,  /* Date */
  JOB_NAME          TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
  STEP_NAME         TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
  STEP_DESCR        TEXT,                        /* Description of task or error message */
  UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);

DDL ๋ณด๊ธฐ/๋ณด๊ณ 

CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
  SELECT LOG_D,
    LOG_DT,
    UTL_JOB_STATUS_ID,
    SID,
	CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
	     WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
	     WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
	     WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
	     WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
		 WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
	     WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
	     ELSE 'N/A' END AS LAYER,
	CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
	     WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
	     WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
	     ELSE 'N/A' END AS SOURCE,
    JOB_NAME,
    STEP_NAME,
    CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
    CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
    CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS ERROR_FLAG,
    STEP_NAME || ' : ' || STEP_DESCR AS STEP_LOG,
	SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS AFFECTED_ROWS
  FROM UTL_JOB_STATUS
  WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
  JB.MIN_LOG_DT AS START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
  JB.SOURCE,
  JB.LAYER,
  JB.JOB_NAME,
  CASE
  WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
  ELSE 'OK'
  END AS STATUS,
  ERR.STEP_LOG     AS STEP_LOG,
  JB.CNT           AS STEP_CNT,
  JB.AFFECTED_ROWS AS AFFECTED_ROWS,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS JOB_START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS JOB_END_DT,
  JB.MAX_LOG_DT - JB.MIN_LOG_DT AS JOB_DURATION_SEC
FROM
  ( SELECT SID, SOURCE, LAYER, JOB_NAME,
           MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
           MAX(START_FLAG)       AS START_FLAG,
           MAX(END_FLAG)         AS END_FLAG,
           MAX(ERROR_FLAG)       AS ERROR_FLAG,
           MIN(LOG_DT)           AS MIN_LOG_DT,
           MAX(LOG_DT)           AS MAX_LOG_DT,
           SUM(1)                AS CNT,
           SUM(IFNULL(AFFECTED_ROWS, 0)) AS AFFECTED_ROWS
    FROM SRC
    GROUP BY SID, SOURCE, LAYER, JOB_NAME
  ) JB,
  ( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
    FROM SRC
    WHERE 1 = 1
  ) ERR
WHERE 1 = 1
  AND JB.SID = ERR.SID
  AND JB.JOB_NAME = ERR.JOB_NAME
  AND JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;

SQL ์ƒˆ ์„ธ์…˜ ๋ฒˆํ˜ธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

SELECT SUM (
  CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
	    AND NOT ( 'y' = 'n' ) /* force restart PARAMETER */
       THEN 1 ELSE 0
  END ) AS IS_RUNNING
  FROM
    ( SELECT 1 AS dummy FROM UTL_JOB_STATUS WHERE sid = -1) d_job
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID, 1 AS dummy
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
	    AND STEP_NAME = 'ETL_START'
      GROUP BY JOB_NAME, SID
    ) start_job /* starts */
  ON d_job.dummy = start_job.dummy
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG'  /* job name PARAMETER */
	    AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
      GROUP BY JOB_NAME, SID
    ) end_job /* ends */
  ON start_job.JOB_NAME = end_job.JOB_NAME
     AND start_job.SID = end_job.SID

ํ…Œ์ด๋ธ” ๊ธฐ๋Šฅ:

  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ์˜ ์‹œ์ž‘๊ณผ ๋ ๋’ค์—๋Š” ETL_START ๋ฐ ETL_END ๋‹จ๊ณ„๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ETL_ERROR ๋‹จ๊ณ„๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ„ํ‘œ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • force_restart=y ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋กœ์‹œ์ €๋ฅผ ๋™์‹œ์— ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ์—†์œผ๋ฉด ์™„๋ฃŒ๋œ ํ”„๋กœ์‹œ์ €์—๋งŒ ์„ธ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ฐœํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ๋Š” ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ ˆ์ฐจ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ž‘์—…์— ํ•„์š”ํ•œ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‹คํ–‰ ์ค‘์ธ ETL ํ”„๋กœ์‹œ์ €์˜ ์„ธ์…˜ ๋ฒˆํ˜ธ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ํ…Œ์ด๋ธ”์— ๋กœ๊ทธ ํ•ญ๋ชฉ ์‚ฝ์ž…
  • ETL ํ”„๋กœ์‹œ์ €์˜ ๋งˆ์ง€๋ง‰ ์„ฑ๊ณต์ ์ธ ๋ ˆ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ

Oracle ๋˜๋Š” Postgres์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sqlite๋Š” ์™ธ๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜๋ฉฐ ์ด ๊ฒฝ์šฐ PHP๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘.

์ถœ๋ ฅ

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋„๊ตฌ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ์˜ ์›์ธ์„ ๋นจ๋ฆฌ ์ฐพ๊ธฐ ์œ„ํ•ด ์ตœ์ ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ ˆ์ฐจ ์ˆ˜๊ฐ€ XNUMX๊ฐœ์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” ํ”„๋กœํ† ํƒ€์ž…์˜ ํ˜•ํƒœ๋กœ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ž‘์€ ์ €์žฅ์†Œ ํ”„๋กœํ† ํƒ€์ž…์€ gitlab์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQLite PHP ETL ์œ ํ‹ธ๋ฆฌํ‹ฐ.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€