๋ณด๊ณ ์ฉ PostgreSQL ๋ทฐ: ๋ ๊ฐ๋จํ ์กฐ์ธ, ์์ ์ ์ธ ํ๋ฉด
๋ณด๊ณ ์ฉ PostgreSQL ๋ทฐ๋ ์กฐ์ธ์ ๋จ์ํํ๊ณ ์ค๋ณต SQL์ ์ค์ด๋ฉฐ ๋์๋ณด๋๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค. ๋ทฐ๋ฅผ ์ธ์ ์ฌ์ฉํ๊ณ ๋ฒ์ ๊ด๋ฆฌํ๋ฉฐ ๋ฆฌํฌํธ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํ ์ง ์์๋ณด์ธ์.

์ ๋ฆฌํฌํ ์ฟผ๋ฆฌ๊ฐ ๊ธ๋ฐฉ ์๋ง์ด ๋๋๊ฐ
๋ฆฌํฌํ ํ๋ฉด์ ๊ฑฐ์ ๋จ์ํ ํ ๊ฐ์ง ์ง๋ฌธ์ ๋ฌป์ง ์์ต๋๋ค. ๋ณดํต ํํฐ์ ์ ๋ ฌ์ด ๊ฐ๋ฅํ ๋ชฉ๋ก, ๊ทธ ๋ชฉ๋ก๊ณผ ์ผ์นํ๋ ํฉ๊ณ, ๊ทธ๋ฆฌ๊ณ ์ํ๋ณยท์๋ณยท๋ด๋น์๋ณ ๊ฐ์ ๋ช ๊ฐ์ง ๋ถํด๊ฐ ํ์ํฉ๋๋ค.
๊ทธ ์กฐํฉ์ SQL์ด ์ ์ ์ปค์ง๊ฒ ๋ง๋ญ๋๋ค. ์ฒ์์ ๊น๋ํ SELECT๋ก ์์ํ์ง๋ง, ์ด๋ฆ๊ณผ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ํ ์กฐ์ธ์ ์ถ๊ฐํ๊ณ , "ํ์ฑ๋ง" ๊ท์น์ ๋ฃ๊ณ , ๋ ์ง ๋ฒ์๋ฅผ ๋ํ๊ณ , "ํ
์คํธ ๋ ์ฝ๋ ์ ์ธ" ๊ฐ์ ๊ฒ์ ์ถ๊ฐํฉ๋๋ค. ์ผ๋ง ์ง๋์ง ์์ ์ฟผ๋ฆฌ๋ ๋ ๊ฐ์ง ์ผ์ ๋์์ ํ๊ฒ ๋ฉ๋๋ค: ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋น์ฆ๋์ค ๊ท์น์ ์ธ์ฝ๋ฉํ๋ ๊ฒ.
์ค์ ๋ฌธ์ ๋ ๋์ผํ ๊ท์น์ด ์ฌ๋ฌ ๊ตฐ๋ฐ ๋ณต์ฌ๋ ๋ ์์๋ฉ๋๋ค. ํ ๋์๋ณด๋๋ ์ง๋ถ์ผ์ด ์๋ ๋ชจ๋ ์ธ๋ณด์ด์ค๋ฅผ โpaidโ๋ก ๊ณ์ฐํฉ๋๋ค. ๋ค๋ฅธ ๋์๋ณด๋๋ ์ฑ๊ณตํ ๊ฒฐ์ ๊ธฐ๋ก์ด ์๋ ๋ชจ๋ ๊ฒ์ โpaidโ๋ก ์ ๋๋ค. ๋ ๋ค ํฉ๋ฆฌ์ ์ผ๋ก ๋ค๋ฆฌ์ง๋ง, ์ด์ ๋ ํ๋ฉด์ด ๊ฐ์ ๊ธฐ๊ฐ์ ๋ํด ์๋ก ๋ค๋ฅธ ํฉ๊ณ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ฌด๋ ์ซ์๋ฅผ ์ ๋ขฐํ์ง ์์ต๋๋ค.
๋ฆฌํฌํ ์ฟผ๋ฆฌ๊ฐ ์๋ง์ด ๋๋ ๋ ๋ค๋ฅธ ์ด์ ๋ ์ฌ๋ฌ UI ์๊ตฌ๋ฅผ ๋์์ ๋ง์กฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค: ์ ์ฐํ ํํฐ(๋ ์ง, ๋ด๋น์, ์ํ, ์ง์ญ), ์ฝ๊ธฐ ์ฌ์ด ํ๋(๊ณ ๊ฐ ์ด๋ฆ, ํ๋, ๋ง์ง๋ง ํ๋), ํํฐ๋ ๋ชฉ๋ก๊ณผ ์ผ์นํ๋ ํฉ๊ณ, ์์ ์ ์ธ ์ปฌ๋ผ์ ๊ฐ์ง ๋ด๋ณด๋ด๊ธฐ ํ์ ๋ฑ์ ๋๋ค.
์์ ์: โOrdersโ ํ๋ฉด์ orders, customers, order_items, refunds๋ฅผ ์กฐ์ธํฉ๋๋ค. โRevenueโ ํ๋ฉด์ ๋๋ถ๋ถ์ ๋ฐ๋ณตํ์ง๋ง ํ๋ถ ๊ท์น์ด ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค. ๋ช ๋ฌ ํ์๋ ๋ถ๋ถ ํ๋ถ ์ฒ๋ฆฌ ๋ฐฉ์ ๊ฐ์ ์ฌ์ํ ๋ณ๊ฒฝ ๋๋ฌธ์ ์ฌ๋ฌ ํ๋ฉด์ ์ฟผ๋ฆฌ๋ฅผ ํธ์งํ๊ณ ์ฌํ ์คํธํด์ผ ํฉ๋๋ค.
๋ทฐ๋ ๊ณต์ ์กฐ์ธ๊ณผ ๊ท์น์ ํ๊ณณ์ ํํํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก ๋์์ด ๋ฉ๋๋ค. ํ๋ฉด ์ชฝ SQL์ ๋ ๋จ์ํด์ง๊ณ ์ซ์๋ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
๋ทฐ๋ฅผ ์ฝ๊ฒ ์ค๋ช ํ๋ฉด: ๋ทฐ๊ฐ ๋ฌด์์ด๊ณ ๋ฌด์์ด ์๋๊ฐ
PostgreSQL ๋ทฐ๋ ์ด๋ฆ ๋ถ์ ์ฟผ๋ฆฌ์
๋๋ค. ์ฌ์ฏ ๊ฐ ์กฐ์ธ์ด ๋ค์ด๊ฐ ๊ธด SELECT๋ฅผ ๋์๋ณด๋๋ง๋ค ๋ถ์ฌ๋ฃ๋ ๋์ ํ ๋ฒ ์ ์ฅํ๊ณ ํ
์ด๋ธ์ฒ๋ผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฆฌํฌํ
SQL์ด ๋ ์ฝ๊ธฐ ์ฌ์์ง๊ณ , "ํ์ฑ ๊ณ ๊ฐ์ด๋ ๋ฌด์์ธ๊ฐ" ๊ฐ์ ์ ์๋ฅผ ํ๊ณณ์ ๋ณด๊ดํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ๋ทฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์์ต๋๋ค. SELECT * FROM my_view๋ฅผ ์คํํ๋ฉด PostgreSQL์ด ๋ทฐ ์ ์๋ฅผ ํผ์ณ ๊ธฐ๋ฐ ํ
์ด๋ธ์ ๋ํด ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ ๋ทฐ๋ ์บ์๊ฐ ์๋๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์์ผ ๋ฟ์
๋๋ค.
materialized view๋ ๋ค๋ฆ ๋๋ค. ๊ฒฐ๊ณผ ์งํฉ์ ๋์คํฌ์ ์ ์ฅํด ์ค๋ ์ท์ฒ๋ผ ๋์ํฉ๋๋ค. ๋ณด๊ณ ์๊ฐ ํจ์ฌ ๋นจ๋ผ์ง ์ ์์ง๋ง materialized view๋ฅผ ์๋ก ๊ณ ์น๊ธฐ ์ ๊น์ง๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง ์์ต๋๋ค. ํธ๋ ์ด๋์คํ๋ ์๋ ๋ ์ ์ ๋์ ๋๋ค.
๋ทฐ๊ฐ ์ข์ ๊ฒฝ์ฐ:
- ์ฌ๋ฌ ํ๋ฉด์์ ๋ณต์กํ ์กฐ์ธ๊ณผ ๊ณ์ฐ ์ปฌ๋ผ์ ์ฌ์ฌ์ฉํ ๋
- ์ ์๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๊ณ ํ ๋ฒ๋ง ๊ณ ์น๋ฉด ๋ชจ๋ ๋ณด๊ณ ์์ ๋ฐ์๋๊ฒ ํ ๋
- ๋ฏผ๊ฐํ ์ปฌ๋ผ์ ์จ๊ธฐ๊ณ ๋ณด๊ณ ์์ ํ์ํ ๊ฒ๋ง ๋ ธ์ถํ ๋
- ๋ฆฌํฌํ ํ์ ๋ ๋จ์ํ โ๋ฆฌํฌํ ์คํค๋งโ๋ฅผ ์ ๊ณตํ ๋
๋ทฐ๊ฐ ๋ง๋ฒ์ฒ๋ผ ํด๊ฒฐํ์ง ๋ชปํ๋ ๊ฒ:
- ๋๋ฆฐ ๊ธฐ๋ฐ ํ ์ด๋ธ(๋ทฐ๋ ์ฌ์ ํ ๊ทธ๊ฒ๋ค์ ์ฝ์ต๋๋ค)
- ์กฐ์ธ ํค๋ ํํฐ ์ปฌ๋ผ์ ์๋ ์ธ๋ฑ์ค
- ์ธ๋ฑ์ค ์ฌ์ฉ์ ๋ง๋ ํํฐ(์: ์ธ๋ฑ์ฑ๋ ์ปฌ๋ผ์ ํจ์๋ฅผ ์ ์ฉํ
WHERE)
๋ชจ๋ ๋ณด๊ณ ์๊ฐ "๊ณ ๊ฐ ์ด๋ฆ๊ณผ ๊ฒฐ์ ์ํ๊ฐ ์๋ ์ฃผ๋ฌธ"์ ํ์๋ก ํ๋ค๋ฉด ๋ทฐ๋ ๊ทธ ์กฐ์ธ๊ณผ ์ํ ๋ก์ง์ ํ์คํํ ์ ์์ต๋๋ค. ํ์ง๋ง orders๊ฐ ๋งค์ฐ ํฌ๊ณ customer_id๋ created_at์ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด, ๋ทฐ๋ ๊ธฐ๋ฐ ํ
์ด๋ธ์ด ํ๋๋ ๋๊น์ง ์ฌ์ ํ ๋๋ฆฝ๋๋ค.
์ธ์ ๋ทฐ๊ฐ ๋ฆฌํฌํ ํ๋ฉด์ ์ ํฉํ ๋๊ตฌ์ธ๊ฐ
๋ฆฌํฌํ ํ๋ฉด์์ ๊ฐ์ ์กฐ์ธ, ํํฐ, ๊ณ์ฐ ํ๋๋ฅผ ๋ฐ๋ณตํ ๋ ๋ทฐ๊ฐ ์ ํฉํฉ๋๋ค. ๊ธด ์ฟผ๋ฆฌ๋ฅผ ๊ฐ ๋์๋ณด๋ ํ์ผ๊ณผ ๋ด๋ณด๋ด๊ธฐ์ ๋ถ์ฌ๋ฃ๋ ๋์ ํ ๋ฒ ์ ์ํ๊ณ ํ๋ฉด๋ค์ด ๊ทธ ์ด๋ฆ ๋ถ์ ๋ฐ์ดํฐ์ ์ ์ฝ๋๋ก ํ์ธ์.
๋ทฐ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฏธ์ธํ๊ฒ ์๋ชป ๊ตฌํํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ์ ํนํ ๋น์ ๋ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด "ํ์ฑ ๊ณ ๊ฐ"์ด "์ต๊ทผ 90์ผ ๋ด ์ต์ ํ ๊ฑด์ ์ ๋ฃ ์ธ๋ณด์ด์ค๊ฐ ์๊ณ churned๋ก ํ์๋์ง ์์"์ ์๋ฏธํ๋ค๋ฉด ๋ค์ฏ ํ๋ฉด์ด ๋ค์ฏ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ฒ ๋๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค. ํ ๋ทฐ์ ๋ฃ์ผ๋ฉด ๋ชจ๋ ๋ณด๊ณ ์๊ฐ ์ผ๊ด๋ฉ๋๋ค.
๋ํ ๋ฆฌํฌํ
๋๊ตฌ(๋๋ UI ๋น๋)๊ฐ ์์ ์ ์ธ ์ปฌ๋ผ ์ด๋ฆ์ ํ์๋ก ํ ๋ ์ ์ฉํฉ๋๋ค. ํ๋ฉด์ด customer_name, mrr, last_payment_at ๊ฐ์ ํ๋์ ์์กดํ ์ ์์ต๋๋ค. ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ฐ ํ
์ด๋ธ์ด ์งํํด๋ ๋ทฐ์ ๊ณ์ฝ์ ์ ์งํ๋ ํ ์ด๋ฌํ ์ปฌ๋ผ์ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค.
์์ฝํ์๋ฉด, ๊ณตํต ์กฐ์ธ๊ณผ ๋ฉํธ๋ฆญ์ ๋ํด ํ๋์ ๊ณต์ ์ ์์ ํ๋ฉด ๋ฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ํ ๊น๋ํ๊ณ ์์ธก ๊ฐ๋ฅํ ์ปฌ๋ผ ์งํฉ์ด ํ์ํ ๋ ๋ทฐ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ ์ ํ ๋๊ตฌ์ ๋๋ค.
์: ์ง์ ๋์๋ณด๋๋ "๊ณ ๊ฐ๋ณ ๋ฏธํด๊ฒฐ ํฐ์ผ"์, ์ฌ๋ฌด ๋์๋ณด๋๋ "์ฐ์ฒด ์ธ๋ณด์ด์ค๊ฐ ์๋ ๊ณ ๊ฐ"์ ๋ณด์ฌ์ค๋๋ค. ๋ ๋ค ๊ฐ์ ๊ณ ๊ฐ ์๋ณ ์กฐ์ธ, ๊ฐ์ "is_active" ๋ก์ง, ๊ฐ์ ๊ณ์ ๋ด๋น์ ํ๋๊ฐ ํ์ํฉ๋๋ค. reporting_customers ๊ฐ์ ๋จ์ผ ๋ทฐ๊ฐ ๊ทธ ํ๋๋ฅผ ํ ๋ฒ ์ ๊ณตํ๋ฉด ๊ฐ ํ๋ฉด์ ์์ ์ ์์ ํํฐ๋ง ์ถ๊ฐํฉ๋๋ค.
๋ทฐ๋ฅผ ํผํ๊ณ ๋ค๋ฅธ ํจํด์ ์ฌ์ฉํ ๋
๋ง์ ํ๋ฉด์ด ๊ฐ์ ์กฐ์ธ๊ณผ ์ ์๋ฅผ ํ์๋ก ํ ๋ ๋ทฐ๊ฐ ํ๋ฅญํฉ๋๋ค. ํ์ง๋ง ๊ฐ ๋ณด๊ณ ์๊ฐ ๊ณ ์ ํ ํน์ฑ์ ๋ง์ด ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ทฐ๋ ๋ณต์ก์ฑ์ ์จ๊ธฐ๋ ์ฅ์๊ฐ ๋์ด๋ฒ๋ฆด ์ ์์ต๋๋ค.
๋ทฐ๊ฐ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ:
- ๊ฐ ๋์๋ณด๋๊ฐ ์๋ก ๋ค๋ฅธ
GROUP BY, ๋ ์ง ๋ฒํท, "์์ N" ๋ก์ง์ ํ์๋ก ํ ๋ - ๋ทฐ๊ฐ ๋ชจ๋ ํ์ ๋์์ ์๋น์คํ๋ ค๊ณ ์์ญ ๊ฐ ์กฐ์ธ์ผ๋ก ์ปค์ง ๋
- ์๊ฒฉํ ํ ์์ค ๋ณด์(RLS)์ด ํ์ํ๊ณ ๋ทฐ๊ฐ ๊ทธ ์๋์์ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ ์ด ์์ ๋
- "์์ ๊ธฐ์ค ์์ ์ผ๋ก์ ๊ณ ์ ์ซ์" ๊ฐ์ ์ผ๊ด๋ ์์ ์ซ์๊ฐ ํ์ํ์ง๋ง ๊ธฐ๋ฐ ํ ์ด๋ธ์ ๊ณ์ ๋ณ๊ฒฝ๋ ๋
- ํน์
WHERE์ ์์๋ง ๋น ๋ฅด๊ณ ๋์ ์ค์บ์์ ๋๋ฆด ๋
์ด๋ด ๋๋ ์์ ์ ๋ง๋ ํจํด์ ์ ํํ์ธ์. ์ผ์ผ ์์ ๋์๋ณด๋์ฒ๋ผ ์๋์ ์์ ๋ ์ซ์๊ฐ ํ์ํ๋ฉด materialized view๋ ์ค์ผ์ค๋ก ๊ฐฑ์ ๋๋ ์์ฝ ํ ์ด๋ธ์ด ๋ผ์ด๋ธ ๋ทฐ๋ณด๋ค ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๋์์ผ๋ก ์์ฃผ ์ ๋ง๋ ๊ฒ๋ค:
- ์๊ฐ๋ณ ๋๋ ์ผ๋ณ๋ก ์๋ก ๊ณ ์นจ๋๋ ์ฌ์ ๊ณ์ฐ๋ ํฉ๊ณ๋ฅผ ์ํ materialized view
- ๋๊ท๋ชจ ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ ํฉํ ์์ ์ผ๋ก ์ ์ง๋๋ ์์ฝ ํ ์ด๋ธ
- ํ๋ฉด๋ณ๋ก ๋ชฉ์ ์ ๋ง๊ฒ ์์ ๋ทฐ๋ฅผ ๊ฐ์ง ์ ์ฉ ๋ฆฌํฌํ ์คํค๋ง
- ๊ถํ ์ฒ๋ฆฌ์ ๋ณต์กํจ์ด ์์ ๋ security-definer ํจ์๋ ์ ์ค๊ณ๋ RLS ์ ์ฑ
- ๋ ผ๋ฆฌ๊ฐ ์ง์ง ๊ณ ์ ํ๊ณ ์์ ๋๋ ํ๋ฉด ์ ์ฉ ์ฟผ๋ฆฌ
์: ์ง์ํ์ "์ค๋ ์์ด์ ํธ๋ณ ํฐ์ผ"์ ์ํ๊ณ ์ฌ๋ฌดํ์ "๊ณ์ฝ ์๋ณ ํฐ์ผ"์ ์ํฉ๋๋ค. ๋์ ํ๋์ ๋ทฐ์ ์ต์ง๋ก ๋ง์ถ๋ฉด ๋ณดํต ํผ๋์ค๋ฌ์ด ์ปฌ๋ผ๊ณผ ๋๋ฆฐ ์ค์บ์ด ๋์ต๋๋ค. ๋ ๊ฐ์ ์๊ณ ์ง์ค๋ ๋ทฐ(๋๋ ํ๋์ ์์ฝ ํ ์ด๋ธ๊ณผ ํ๋ฉด๋ณ ์ฟผ๋ฆฌ)๊ฐ ๋ ๋ช ํํ๊ณ ์์ ํฉ๋๋ค.
๋จ๊ณ๋ณ: ์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋ฆฌํฌํ ๋ทฐ ๋ง๋ค๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ํ๋ฉด์์ ์์ํ์ธ์. ๋ณด๊ณ ์๊ฐ ํ์ํ ์ ํํ ์ปฌ๋ผ, ์ฌ์ฉ์๊ฐ ๊ฐ์ฅ ์์ฃผ ์ ์ฉํ ํํฐ(๋ ์ง ๋ฒ์, ์ํ, ๋ด๋น์), ๊ธฐ๋ณธ ์ ๋ ฌ ์์๋ฅผ ์ ์ผ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด "๋ชจ๋ ๊ฒ์ ๋ด๋" ๋ทฐ๋ฅผ ๋ง๋๋ ์ผ์ ํผํ ์ ์์ต๋๋ค.
๊ทธ๋ค์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์ผ๋ฐ SELECT๋ก ์์ฑํ์ธ์. ์ค์ ์ํ ๋ฐ์ดํฐ๋ก ์ ํํ๊ฒ ๋ง๋์ง ํ์ธํ ๋ค์ ๋ฌด์์ ๊ณต์ ๋ทฐ์ ๋ฃ์์ง ๊ฒฐ์ ํ์ธ์.
์ค์ฉ์ ์ธ ์ ๊ทผ๋ฒ:
- ์ถ๋ ฅ ์ปฌ๋ผ๊ณผ ๊ฐ ์ปฌ๋ผ์ ์๋ฏธ๋ฅผ ์ ์ํ์ธ์.
- ๊ทธ ์ปฌ๋ผ๋ค์ ๋ฐํํ๋ ์ต์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋์ธ์.
- ์์ ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์กฐ์ธ๊ณผ ํ์ ํ๋๋ฅผ ๋ทฐ๋ก ์ฎ๊ธฐ์ธ์.
- ๋ทฐ๋ ์ข๊ฒ ์ ์ง(ํ๋์ ๋ชฉ์ , ํ๋์ ๋์)ํ๊ณ ๋ช ํํ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
- UI๊ฐ ์น์ ํ ๋ ์ด๋ธ์ ํ์๋ก ํ๋ค๋ฉด ํ์์ฉ(presentation) ๋ทฐ๋ฅผ ๋ณ๋๋ก ๋๊ณ ํต์ฌ ๋ทฐ์ ํฌ๋งทํ ์ ์์ง ๋ง์ธ์.
์ด๋ฆ๊ณผ ๋ช
ํ์ฑ์ด ์๋ฆฌํ SQL๋ณด๋ค ์ค์ํฉ๋๋ค. ๋ช
์์ ์ปฌ๋ผ ๋ชฉ๋ก์ ์ ํธํ๊ณ SELECT *๋ ํผํ์ธ์. ์ปฌ๋ผ ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช
ํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ์ธ์(์: total_paid_cents ๋์ amount์ฒ๋ผ ๋ชจํธํ ์ด๋ฆ ํผํ๊ธฐ).
์ฑ๋ฅ์ ์ฌ์ ํ ๋ทฐ ์๋์ ํ
์ด๋ธ์์ ์ต๋๋ค. ์ฃผ์ ํํฐ์ ์ ๋ ฌ์ ์๊ฒ ๋๋ฉด ๊ทธ์ ๋ง๋ ์ธ๋ฑ์ค(created_at, status, customer_id ๋๋ ์ ์ฉํ ๋ณตํฉ ์ธ๋ฑ์ค)๋ฅผ ์ถ๊ฐํ์ธ์.
๋ทฐ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํตํด ๋ฆฌํฌํ ๊นจ์ง ๋ฐฉ์งํ๊ธฐ
๋์๋ณด๋๊ฐ ๊นจ์ง๋ ์ด์ ๋ ๋๋ถ๋ถ ์ง๋ฃจํ ๋ณํ ๋๋ฌธ์ ๋๋ค: ์ปฌ๋ผ ์ด๋ฆ ๋ณ๊ฒฝ, ํ์ ๋ณ๊ฒฝ, ํํฐ ๋์ ๋ณ๊ฒฝ ๋ฑ. ๋ทฐ ๋ฒ์ ๊ด๋ฆฌ๋ ์ด๋ฅผ API์ฒ๋ผ ๋ค๋ฃจ์ด ์์ ๋ ๊ณ์ฝ์ ์ ์งํ๋ ๊ฒ์ ๋๋ค.
๋จผ์ ๋ชจ๋๊ฐ ์์กดํด๋ ์์ ํ ์ด๋ฆ ๊ท์น์ ์ ํ์ธ์. ๋ง์ ํ์ด ๋ฆฌํฌํ
์ฉ ๊ฐ์ฒด์ rpt_๋ vw_ ๊ฐ์ ์ ๋์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ๋ฌ ๋ฒ์ ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด ์ด๋ฆ์ ๊ทธ ์ ์ ์ฒ์๋ถํฐ ๋ฐ์ํ์ธ์(์: vw_sales_v1).
๋์๋ณด๋๋ฅผ ๊ตฌ๋ํ๋ ๋ทฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋๋ ์ถ๊ฐ์ ์ธ ๋ณ๊ฒฝ(์ถ๊ฐ๋ง ํ๊ธฐ)์ ์ ํธํ์ธ์. ์์ ๊ท์น์: ์ถ๊ฐ๋ OK, ์ด๋ฆ ๋ณ๊ฒฝ์ ๊ธ์ง.
- ์ ์ปฌ๋ผ์ ์ถ๊ฐํ๊ณ ๊ธฐ์กด ์ปฌ๋ผ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ๋ง์ธ์.
- ๊ธฐ์กด ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ ๋ณ๊ฒฝํ์ง ๋ง๊ณ ์ ์ปฌ๋ผ์ผ๋ก ์บ์คํ ํ์ธ์.
- ๊ธฐ์กด ์ปฌ๋ผ์ ์๋ฏธ๋ ๋ฐ๊พธ์ง ๋ง์ธ์.
- ์๋ฏธ์ ์ํฅ์ ์ฃผ๋ ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์ ๋ทฐ ๋ฒ์ ์ ๋ง๋์ธ์.
๊ตฌ์กฐ๊ฐ ๋ฌ๋ผ์ง๊ฑฐ๋ ์๋ฏธ๊ฐ ๋ฐ๋๋ฉด vw_sales_v2์ฒ๋ผ ์ ๋ฒ์ ์ ๋ง๋์ธ์. ์ผ๋ฐ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ ๋ณด์ด๋ ํ๋ ์ด๋ฆ ๋ณ๊ฒฝ, ๊ทธ๋ ์ธ ๋ณ๊ฒฝ(์: ์ฃผ๋ฌธ๋น ํ ํ์์ ๊ณ ๊ฐ๋น ํ ํ์ผ๋ก), ์๊ฐ๋๋ ํตํ ๊ท์น ๋ณ๊ฒฝ ๋ฑ์
๋๋ค. ์์ ์์ ์ผ๋ก ๊ณ์ฝ์ ๊นจ์ง ์๋๋ค๋ฉด ์ ์๋ฆฌ์ ์ ์ฉํด๋ ๋ฉ๋๋ค.
๋ชจ๋ ๋ณ๊ฒฝ์ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ์ถ์ ํ์ธ์. ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฆฌ๋ทฐ ๊ฐ๋ฅํ ์ฐจ์ด, ๋ฐฐํฌ ์์, ๋กค๋ฐฑ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๊ตฌํ ๋ทฐ๋ฅผ ์์ ํ๊ฒ ํ๊ธฐํ๋ ค๋ฉด ์ฌ์ฉ ํํฉ์ ํ์ธํ๊ณ v2๋ฅผ ๋ฐฐํฌํ ๋ค ์๋น์๋ค์ ์ ํํ๊ณ ์๋ฌ๋ฅผ ๋ชจ๋ํฐ๋งํ์ธ์. ๋ฒํผ ๊ธฐ๊ฐ ๋์ v1์ ์ ์งํ ๋ค ์๋ฌด๋ ์ฝ์ง ์๋ ๊ฒ์ ํ์ธํ ํ์ v1์ ์ ๊ฑฐํ์ธ์.
๋ฆฌํฌํ ์์ ์ฑ ์ ์ง: ๊ณ์ฝ, ์ฃ์ง ์ผ์ด์ค, ๊ถํ
๋ฆฌํฌํ ๋ทฐ๋ฅผ ๊ณ์ฝ์ฒ๋ผ ์ทจ๊ธํ์ธ์. ๋์๋ณด๋์ ๋ด๋ณด๋ด๊ธฐ๋ ์ปฌ๋ผ ์ด๋ฆ, ํ์ , ์๋ฏธ์ ์กฐ์ฉํ ์์กดํฉ๋๋ค. ๊ณ์ฐ์ ๋ณ๊ฒฝํด์ผ ํ ๋๋ ๊ธฐ์กด ์ปฌ๋ผ์ ์๋ฏธ๋ฅผ ๋ฐ๊พธ๊ธฐ๋ณด๋ค ์ ์ปฌ๋ผ(๋๋ ์ ๋ทฐ ๋ฒ์ )์ ์ถ๊ฐํ์ธ์.
NULL์ ํฉ๊ณ๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๋ ์กฐ์ฉํ ์์ธ์
๋๋ค. ํ๋์ ํ์ด NULL์ด ๋๋ฉด SUM์ด NULL๋ก ๋ฐ๋๊ฑฐ๋ ํ๊ท ์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ๋ทฐ์์ ๊ท์น์ ํ ๋ฒ ์ ํ์ธ์. discount_amount๊ฐ ์ ํ์ ์ด๋ฉด COALESCE(discount_amount, 0)์ฒ๋ผ ์ฒ๋ฆฌํด ํฉ๊ณ๊ฐ ํ์ง ์๊ฒ ํ์ธ์.
๋ ์ง๋ ๋์ผํ ๊ท์จ์ด ํ์ํฉ๋๋ค. "์ค๋"์ ์ ์(์ฌ์ฉ์ ์๊ฐ๋, ํ์ฌ ์๊ฐ๋, UTC)๋ฅผ ์ ํ๊ณ ์งํค์ธ์. ํฌํจ ๋ฒ์๋ ๋ช
ํํ ํ์ธ์. ํ์์คํฌํ์ ๋ํด ์์ ์ ์ธ ์ ํ์ ๋ฐ์ด๋ฆฐ ๊ตฌ๊ฐ(half-open interval)์
๋๋ค: created_at >= start AND created_at < end_next_day.
๊ถํ๋ ์ค์ํฉ๋๋ค. ๋ฆฌํฌํ ์ฌ์ฉ์๊ฐ ์์ ํ ์ด๋ธ์ ๋ณผ ํ์๊ฐ ๊ฑฐ์ ์์ผ๋ฏ๋ก ๋ทฐ์ ๊ถํ์ ์ฃผ๊ณ ๋ฏผ๊ฐํ ์ปฌ๋ผ์ ๋ทฐ์์ ์ ์ธํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋๊ตฐ๊ฐ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋์๋ณด๋์ ๋ค๋ฅธ ์ซ์๊ฐ ๋์ค๋ ์ผ์ ์ค์ผ ์ ์์ต๋๋ค.
์์ ํ
์คํธ ์ต๊ด์ด ํฐ ๋์์ด ๋ฉ๋๋ค. ๋ณ๊ฒฝ ํ ๋ค์ ์คํํ ์ ์๋ ๋ช ๊ฐ์ง ๊ณ ์ ์ผ์ด์ค๋ฅผ ๋์ธ์: ํ์ด 0์ธ ๋ (ํฉ๊ณ๊ฐ 0์ด์ด์ผ ํ๊ณ NULL์ด ์๋์ด์ผ ํจ), ๊ฒฝ๊ณ ํ์์คํฌํ(์ ํํ ์๊ฐ๋์ ์์ ์ ์ ํํ ํด๋นํ๋ ๊ฒฝ์ฐ), ํ๋ถ์ด๋ ์์ ์กฐ์ , ์ฝ๊ธฐ ์ ์ฉ ๊ถํ์ ๊ฐ์ง ์ญํ ํ
์คํธ ๋ฑ.
๋ฆฌํฌํธ๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํ๋ ์ค์ฉ์ ์ฑ๋ฅ ์ต๊ด
๋ทฐ๊ฐ ์๋์ผ๋ก ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ํด์ฃผ์ง๋ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ทฐ๋ ๋จ์ง ๋ณต์ก์ฑ์ ์จ๊ธธ ๋ฟ์ ๋๋ค. ๋ฆฌํฌํ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ์ ์งํ๋ ค๋ฉด ๋ทฐ๋ฅผ ๊ณต๊ฐ ์ฟผ๋ฆฌ์ฒ๋ผ ์ทจ๊ธํด ๋ฐ์ดํฐ๊ฐ ๋์ด๋๋ ํจ์จ์ ์ผ๋ก ๋์ํ๊ฒ ํ์ธ์.
PostgreSQL์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ง๋์ธ์. ํํฐ๋ ๊ฐ๋ฅํ ํ ์ด๊ธฐ์ ์ค์ ์ปฌ๋ผ์ ์ ์ฉ๋์ด์ผ ํ๋ฉฐ, ํ๋๋๊ฐ ์กฐ์ธ์ผ๋ก ํ์ด ๊ณฑํด์ง๊ธฐ ์ ์ ํ ์๋ฅผ ์ขํ ์ ์์ด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋๋ ค์ง์ ๋ง๋ ์ค์ฉ์ ์ต๊ด:
- ํ์ ํํ์ ๋์ ๊ธฐ๋ฐ ์ปฌ๋ผ(
created_at,status,account_id)์ ํํฐ๋ฅผ ์ ์ฉํ์ธ์. - ๊ฐ๋ฅํ๋ฉด
WHERE์์ ์ธ๋ฑ์ฑ๋ ์ปฌ๋ผ์ ํจ์๋ก ๊ฐ์ธ์ง ๋ง์ธ์. ์:DATE(created_at) = ...๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ ํ์์คํฌํ ๋ฒ์๋ฅผ ์ฌ์ฉํ์ธ์. - ์กฐ์ธ ํญ๋ฐ์ ์ฃผ์ํ์ธ์. ์กฐ์ธ ์กฐ๊ฑด ๋๋ฝ์ ์์ ๋ฆฌํฌํธ๋ฅผ ์๋ฐฑ๋ง ํ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
EXPLAIN(์์ ํ ํ๊ฒฝ์์๋EXPLAIN ANALYZE)๋ก ์ํ์ ์ค์บ, ์๋ชป๋ ํ ์ ์ถ์ , ์กฐ์ธ์ด ๋๋ฌด ์ผ์ฐ ์ผ์ด๋๋์ง ํ์ธํ์ธ์.- ํ๋ฉด์ ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ(๋ ์ง ๋ฒ์, limit)์ ์ค ์ฌ์ฉ์๊ฐ ๋ฒ์๋ฅผ ๋ํ ๋ ์๋์ ์ผ๋ก ํ๊ฒ ํ์ธ์.
๊ฐ์ ๋ฌด๊ฑฐ์ด ๋ฆฌํฌํธ๊ฐ ํ๋ฃจ ์ข ์ผ ์ฌ์ฉ๋๋ค๋ฉด materialized view๋ฅผ ๊ณ ๋ คํ์ธ์. ๋์๋ณด๋๊ฐ ์ฆ๊ฐ์ ์ผ๋ก ๋๊ปด์ง ์ ์์ง๋ง ๊ฐฑ์ ๋น์ฉ๊ณผ ์ ์ ๋ ๋น์ฉ์ ์ง๋ถํด์ผ ํฉ๋๋ค. ๋น์ฆ๋์ค ํ์์ ๋ง๋ ๊ฐฑ์ ์ฃผ๊ธฐ๋ฅผ ์ ํํ๊ณ "์ ์ ํจ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ช ํํ ํ์ธ์.
๋๋ฆฌ๊ฑฐ๋ ์๋ชป๋ ๋์๋ณด๋๋ฅผ ์ผ์ผํค๋ ํํ ์ค์
๋์๋ณด๋์ ๋ํ ์ ๋ขฐ๋ฅผ ๊นจ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ฆฌ๊ฒ ๋ง๋ค๊ฑฐ๋ ์กฐ์ฉํ ์๋ชป๋ ๊ฐ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ ๋ฌธ์ ๋ "PostgreSQL์ด ๋๋ฆฌ๋ค"๊ฐ ์๋๋ผ ์ค์ ๋ฐ์ดํฐ์ ์ฌ์ฉ์๊ฐ ๋ฑ์ฅํ๋ฉด์ ๋๋ฌ๋๋ ์ค๊ณ ๋ฌธ์ ์ ๋๋ค.
ํ ๊ฐ์ง ํํ ํจ์ ์ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ๊ฑฐ๋ํ ๋ทฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ํธ๋ฆฌํด ๋ณด์ด์ง๋ง ์ด๊ฒ์ ๊ฒฐ๊ตญ ๋ชจ๋ ํ๋ฉด์ด ์์กดํ๋ ๋์ ์กฐ์ธ ์ํ๊ฐ ๋ฉ๋๋ค. ํ ํ์ด ์ ๋ฉํธ๋ฆญ์ ์ํด ์กฐ์ธ์ ์ถ๊ฐํ๋ฉด ๋ชจ๋๊ฐ ์ถ๊ฐ ์์ ๊ณผ ์ํ์ ๋ ์๊ฒ ๋ฉ๋๋ค.
๋ทฐ ์์ UI ํฌ๋งทํ (์ฐ๊ฒฐ๋ ๋ ์ด๋ธ, ํตํ ๋ฌธ์์ด, ๋ณด๊ธฐ ์ข์ ๋ ์ง ๋ฑ)์ ๋ฃ์ง ๋ง์ธ์. ๊ทธ๋ฌ๋ฉด ์ ๋ ฌ๊ณผ ํํฐ๊ฐ ์ด๋ ค์์ง๊ณ ๋ก์ผ์ผ ๋ฒ๊ทธ๊ฐ ์๊ธธ ์ ์์ต๋๋ค. ๋ทฐ๋ ์ซ์, ํ์์คํฌํ, ID ๊ฐ์ ๊น๋ํ ํ์ ์ ์ง์คํ๊ณ ํ์ ๊ด๋ จ ํฌ๋งทํ ์ UI์ ๋งก๊ธฐ์ธ์.
SELECT *๋ ์กฐ์ฌํ์ธ์. ๋ฌดํดํด ๋ณด์ด์ง๋ง ๋๊ตฐ๊ฐ ๊ธฐ๋ฐ ํ
์ด๋ธ์ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ฉด ๋ณด๊ณ ์๊ฐ ๊ฐ์๊ธฐ ํํ๊ฐ ๋ฐ๋๋๋ค. ๋ช
์์ ์ปฌ๋ผ ๋ชฉ๋ก์ด ๋ทฐ ์ถ๋ ฅ์ ์์ ๋ ๊ณ์ฝ์ ๋ง๋ญ๋๋ค.
์๋ชป๋ ํฉ๊ณ๋ ์ข ์ข ํ์ ๊ณฑํ๋ ์กฐ์ธ์์ ์ต๋๋ค. ์ผ๋๋ค ์กฐ์ธ์ด ๊ฐ ๊ณ ๊ฐ์ ์ฌ๋ฌ ํ์ผ๋ก ๋ง๋ค๋ฉด "10๋ช ๊ณ ๊ฐ"์ด "50ํ"์ผ๋ก ๋ฐ๋ ์ ์์ต๋๋ค.
์ผ์ฐ ๊ฐ์งํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ: ์กฐ์ธ ์ ํ์ ์นด์ดํธ๋ฅผ ๋น๊ตํ๊ณ , "๋ง์" ์ชฝ์ ๋จผ์ ์ง๊ณํด์ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธํ๊ฑฐ๋ LEFT JOIN ๋ค์์ ์์์น ๋ชปํ NULL์ด ์๋์ง ํ์ธํ์ธ์.
materialized view๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ฐฑ์ ์์ ์ด ์ค์ํฉ๋๋ค. ํผํฌ ์๊ฐ์ ๊ฐฑ์ ํ๋ฉด ์ฝ๊ธฐ๋ฅผ ์ ๊ทธ๊ณ ๋ฆฌํฌํ ํ๋ฉด์ ๋ฉ์ถ ์ ์์ต๋๋ค. ์กฐ์ฉํ ์๊ฐ์ ์ค์ผ์ค๋ ๊ฐฑ์ ์ ํ๊ฑฐ๋ ์ค์ ์ด ํ๋ฝํ๋ฉด ๋์ ๊ฐฑ์ (concurrent refresh)์ ์ฌ์ฉํ์ธ์.
์ด์์ ์ฌ๋ฆฌ๊ธฐ ์ ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ
๋ฆฌํฌํ ๋ทฐ๊ฐ ๋์๋ณด๋์ ์ฃผ๊ฐ ์ด๋ฉ์ผ์ ๊ตฌ๋ํ๊ธฐ ์ ์๋ ์์ ๊ณต๊ฐ API์ฒ๋ผ ๋ค๋ฃจ์ธ์.
๋ช
ํ์ฑ ์ฐ์ : ์ปฌ๋ผ ์ด๋ฆ์ ๋ด๋ถ ํ
์ด๋ธ ์ด๋ฆ๋ณด๋ค๋ ๋ฆฌํฌํธ ๋ ์ด๋ธ์ฒ๋ผ ์ฝํ์ผ ํฉ๋๋ค. ๋จ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋์์ด ๋ฉ๋๋ค(amount_cents vs amount). ์์ ํ๋์ ํ์ ํ๋๊ฐ ๋ ๋ค ์๋ค๋ฉด ๊ตฌ๋ถ๋๊ฒ ํ์ํ์ธ์(status vs status_group).
๊ทธ๋ค์ ์ ํ์ฑ๊ณผ ์ฑ๋ฅ์ ํจ๊ป ์ ๊ฒํ์ธ์:
- ์กฐ์ธ ํค๊ฐ ์ค์ ๊ด๊ณ(1:1 vs 1:N)๋ฅผ ๋ฐ์ํ๋์ง ํ์ธํด ์นด์ดํธ์ ํฉ๊ณ๊ฐ ์๋์น ์๊ฒ ์ฆํญ๋์ง ์๊ฒ ํ์ธ์.
- ์ผ๋ฐ์ ์ธ ํํฐ๊ฐ ๊ธฐ๋ฐ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ ์ปฌ๋ผ(๋ ์ง, ๊ณ์ ID, ํ ๋ํธ ID)์ ์น๋์ง ํ์ธํ์ธ์.
- ์์ผ๋ก ๊ฒํ ํ ์ ์๋ ์์ ์๋ ค์ง ๋ฐ์ดํฐ์ ์์ ํฉ๊ณ๋ฅผ ๊ฒ์ฆํ์ธ์.
- ๋๊ณผ ์ฃ์ง์ผ์ด์ค(๋๋ฝ๋ ์ฌ์ฉ์, ์ญ์ ๋ ๋ ์ฝ๋, ์๊ฐ๋)๋ฅผ ๊ฒํ ํ๊ณ ๋ทฐ๊ฐ ๋ฌด์์ ์ถ๋ ฅํ ์ง ๊ฒฐ์ ํ์ธ์.
- ๋ทฐ๋ฅผ ์์ ํ๊ฒ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ ํ์ธ์: ์ถ๊ฐ ์ปฌ๋ผ๋ง ํ์ฉํ ์ง, ํธํ์ฑ ๊นจ์ง ์
report_sales_v2๊ฐ์ ๋ฒ์ ๋ช ์ ์ธ์ง ๊ฒฐ์ ํ์ธ์.
materialized view๋ฅผ ์ด๋ค๋ฉด ๋ฐฐํฌ ์ ์ ๊ฐฑ์ ๊ณํ์ ์ ํ์ธ์. ์ด๋ ์ ๋๊น์ง์ ์ ์ ๋๊ฐ ํ์ฉ๋๋์ง(๋ถ, ์๊ฐ, ํ๋ฃจ) ์ ํ๊ณ ๊ฐฑ์ ์ด ํผํฌ ์๊ฐ์ ์ ๊ธ์ ์ผ์ผํค์ง ์๋์ง ํ์ธํ์ธ์.
๋ง์ง๋ง์ผ๋ก ์ ๊ทผ์ ์ ๊ฒํ์ธ์. ๋ฆฌํฌํ ์ฌ์ฉ์๋ ๋ณดํต ์ฝ๊ธฐ ์ ์ฉ ๊ถํ์ด ํ์ํ๋ฏ๋ก ๋ทฐ๋ ๋ณด๊ณ ์์ ํ์ํ ๊ฒ๋ง ๋ ธ์ถํ๋๋ก ํ์ธ์.
์: ๋ ๊ฐ ํ๋ฉด์ ๊ตฌ๋ํ๋ ํ๋์ ๋ทฐ
์์ ์ด์์์ ๋ ํ๋ฉด์ ์์ฒญํ์ต๋๋ค: "์ผ์ผ ์์ต"(์ผ๋ณ ์ฐจํธ)๊ณผ "๋ฏธํด๊ฒฐ ์ธ๋ณด์ด์ค"(๋๊ฐ ์ผ๋ง๋ฅผ ๋น์ก๋์ง ํ). ์ฒซ ์๋๋ ์ข ์ข ์ฝ๊ฐ ๋ค๋ฅธ ์ธ๋ณด์ด์ค ์ํ, ํ๋ถ, ์ด๋ค ๊ณ ๊ฐ์ ์ ์ง์ ๋ํ ๊ท์น ๋๋ฌธ์ ๋ ๊ฐ์ ๋ณ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ํ ๋ฌ ํ ์ซ์๊ฐ ๋ง์ง ์์ต๋๋ค.
๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ ๊ณต์ ๊ท์น์ ํ๊ณณ์ ๋ฃ๋ ๊ฒ์ ๋๋ค. ์์ ํ ์ด๋ธ(customers, invoices, payments, credit_notes ๋ฑ)์์ ์์ํด ๋ก์ง์ ์ ๊ทํํ๋ ๊ณต์ ๋ทฐ๋ฅผ ์ ์ํ์ธ์.
์๋ฅผ ๋ค์ด reporting.invoice_facts_v1๋ผ๋ ๋ทฐ๋ฅผ ๋ง๋ค์ด ์ธ๋ณด์ด์ค๋น ํ ํ์ ๋ฐํํ๊ณ customer_name, invoice_total, paid_total, balance_due, invoice_state(open, paid, void), ๊ทธ๋ฆฌ๊ณ ๋ณด๊ณ ์ฉ์ผ๋ก ํฉ์ํ ๋จ์ผ effective_date ๊ฐ์ ์ผ๊ด๋ ํ๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ ํ๋ฉด์ ๊ทธ ๊ณ์ฝ ์์ ๊ตฌ์ถ๋ฉ๋๋ค:
- "๋ฏธํด๊ฒฐ ์ธ๋ณด์ด์ค"๋
invoice_state = 'open'์ ํํฐํ๊ณbalance_due๋ก ์ ๋ ฌํฉ๋๋ค. - "์ผ์ผ ์์ต"์
date_trunc('day', effective_date)๋ก ๊ทธ๋ฃนํํ๊ณ ์ง๊ธ์ก ํฉ๊ณ๋ฅผ ๊ตฌํฉ๋๋ค(๋๋ ์ธ์๋ ์์ต์ด๋ผ๋ฉด ๊ทธ ๊ท์น์ ๋ฐ๋ฆ ๋๋ค).
์ฌ์ ํ "์ผ์ผ ์์ต"์ด ๋ฌด๊ฒ๋ค๋ฉด ๋ ๋ฒ์งธ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ์ธ์: ์ผ๋ณ๋ก ๋ฏธ๋ฆฌ ์ง๊ณํ ๋กค์ ๋ทฐ(๋๋ materialized view)๋ฅผ ๋ง๋ค์ด ํ์์ ๋ง๊ฒ ์ค์ผ์ค๋ก ๊ฐฑ์ ํฉ๋๋ค.
์๊ตฌ๊ฐ ๋ฐ๋ ๋๋ reporting.invoice_facts_v2๋ฅผ ๋ฐฐํฌํ๊ณ v1์ ์ ์๋ฆฌ์์ ํธ์งํ์ง ๋ง์ธ์. ์ ํ๋ฉด์ v2๋ฅผ ์ฌ์ฉํ๊ณ , v1์ ๊ตฌํ ์๋น์๊ฐ ๋จ์ ์๋ ๋์ ์ ์งํ ๋ค ์์กด์ฑ์ด ์์ ๋ ์ ๊ฑฐํฉ๋๋ค.
์ฑ๊ณต์ ๋ชจ์ต์ ๋ ํ๋ฉด์ด ๊ฐ์ ๊ธฐ๊ฐ์ ๋ํด ์ผ์นํ๋ ์ซ์๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ๋ฌธ์๊ฐ ์ค๋ฉฐ, ๋น์ฉ์ด ๋ง์ด ๋๋ ์กฐ์ธ๊ณผ ์ํ ๊ท์น์ด ํ ์ ์์ ๋ชจ์ฌ ์์ด ๋ก๋ ์๊ฐ์ด ์์ธก ๊ฐ๋ฅํด์ง๋ ๊ฒ์ ๋๋ค.
๋ค์ ๋จ๊ณ: ๋ทฐ๋ฅผ ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ฆฌํฌํ ์ํฌํ๋ก์ฐ์ ์ผ๋ถ๋ก ๋ง๋ค๊ธฐ
์์ธก ๊ฐ๋ฅํ ๋ฆฌํฌํ ์ ์ง๋ฃจํ ์ต๊ด์์ ์ต๋๋ค: ๋ช ํํ ์ ์, ํต์ ๋ ๋ณ๊ฒฝ, ๊ธฐ๋ณธ ์ฑ๋ฅ ์ ๊ฒ. ๋ชฉํ๋ ๋ ๋ง์ SQL์ด ์๋๋ผ ๋น์ฆ๋์ค ๋ก์ง์ด ํฉ์ด์ง ์ ์๋ ์ฅ์๋ฅผ ์ค์ด๋ ๊ฒ์ ๋๋ค.
๋ทฐ๋ก ๋ง๋ค ๊ฐ์น๊ฐ ์๋ ๊ฒ์ ํ์คํํ์ธ์. ์ข์ ํ๋ณด๋ ์ด๋์๋ ์ฌ์ฌ์ฉ๋ ํต์ฌ ๋ฉํธ๋ฆญ(์์ต, ํ์ฑ ์ฌ์ฉ์, ์ ํ), ๊ณต์ ์ฐจ์(๊ณ ๊ฐ, ์ง์ญ, ์ ํ), ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๋ณด๊ณ ์์์ ๋ํ๋๋ ์กฐ์ธ ๊ฒฝ๋ก์ ๋๋ค.
์ํฌํ๋ก์ฐ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ์ธ์:
- ๋ทฐ ์ด๋ฆ์ ์ผ๊ด๋๊ฒ ํ์ธ์(์: ๋ฆฌํฌํ
์ฉ์
rpt_์ ๋์ด). - ๋ฒ์ ๊ต์ฒด ๋ฐฉ์์ ์ฌ์ฉํ์ธ์(์ ๋ฒ์ ์์ฑ, ์๋น์ ์ ํ,
v1ํ๊ธฐ). - ๋ณ๊ฒฝ์ ์๋ ํธ์ง์ด ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ํตํด ๋ฐฐํฌํ์ธ์.
- ์ปฌ๋ผ์ ์๋ฏธ, ๋จ์, ๋ ๊ท์น์ ๋ฌธ์ํํ ํ ๊ณณ์ ๋ง๋์ธ์.
- ๋๋ฆฐ ๋ฆฌํฌํธ ์ฟผ๋ฆฌ๋ฅผ ์ถ์ ํ๊ณ ์ ๊ธฐ์ ์ผ๋ก ๋ฆฌ๋ทฐํ์ธ์.
ํ๋ฉด๊ณผ ์๋ํฌ์ธํธ๋ฅผ ๋ทฐ ์์ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋ณ๋ชฉ์ด๋ผ๋ฉด AppMaster๋ฅผ ๊ฒํ ํด๋ณด์ธ์. PostgreSQL ๋ทฐ๋ฅผ ์ง์ง ๋จ์ผ ์ถ์ฒ๋ก ์ผ๊ณ , ๊ทธ ์์ ๋ฐฑ์๋ API์ ์น/๋ชจ๋ฐ์ผ UI๋ฅผ ์์ฑํด ๊ฐ ํ๋ฉด์์ ์กฐ์ธ๊ณผ ๊ท์น์ ๋ฐ๋ณต ๊ตฌํํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
์์ ํ์ผ๋ฟ์ ์คํํ์ธ์. ์ค๋ ๊ฐ์ฅ ๊ณ ํต์ค๋ฌ์ด ๋ฆฌํฌํ ํ๋ฉด ํ๋๋ฅผ ๊ณจ๋ผ ๊ทธ ๋ฉํธ๋ฆญ์ ๋ช ํํ ์ ์ํ๋ ๋ทฐ ํ๋๋ฅผ ์ค๊ณํด ํ ๋ฒ์ ๋ฐฐํฌ ์ฃผ๊ธฐ์ ๋ฃ์ด ๋ณด์ธ์. ๊ทธ๋ฐ ๋ค์ ์ฟผ๋ฆฌ ์ค๋ณต์ด ์ค๊ณ "์ซ์๊ฐ ์ผ์นํ์ง ์๋๋ค"๋ ๋ฒ๊ทธ๊ฐ ์ค์ด๋๋์ง ์ธก์ ํ์ธ์.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
์ฌ๋ฌ ํ๋ฉด์์ ๊ฐ์ ์กฐ์ธ๊ณผ ์ ์(์: โpaidโ๋ โactiveโ์ ์๋ฏธ)๋ฅผ ๋ฐ๋ณตํ ๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ์ธ์. ๊ณต์ ๋ก์ง์ ํ๊ณณ์ ๋๋ฉด ํฉ๊ณ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋๊ณ ๊ฐ ํ๋ฉด์ ์์ฒด ํํฐ์ ์ ๋ ฌ๋ง ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ผ๋ฐ ๋ทฐ๋ ์ด๋ฆ์ด ๋ถ์ ์ฟผ๋ฆฌ๋ก ๋ณดํต ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์์ต๋๋ค. materialized view๋ ๊ฒฐ๊ณผ๋ฅผ ๋์คํฌ์ ์ ์ฅํด ์ฝ๊ธฐ๊ฐ ํจ์ฌ ๋น ๋ฅผ ์ ์์ง๋ง, ๋ฐ์ดํฐ๋ ๋ง์ง๋ง ๊ฐฑ์ ์์ ๊น์ง ๊ฐฑ์ ๋์ง ์์ต๋๋ค.
์๋์. ๋ทฐ ์์ฒด๊ฐ ์คํ ์๋๋ฅผ ๋์ฌ์ฃผ์ง ์์ต๋๋ค. PostgreSQL์ ์ฌ์ ํ ๊ธฐ๋ฐ ํ ์ด๋ธ์ ๋ํด ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ธ๋ฑ์ค ๊ฐ์ , ๋ ์ ๋ณ์ ์ธ ํํฐ, ๋๋ materialized view๋ ์ง๊ณ ํ ์ด๋ธ ๊ฐ์ ์ฌ์ ๊ณ์ฐ ์์ฝ์ด ํ์ํฉ๋๋ค.
ํ๋ฉด์ด ํ์๋ก ํ๋ ์ ํํ ์ปฌ๋ผ๊ณผ ๊ฐ ์ปฌ๋ผ์ ์๋ฏธ๋ฅผ ๋จผ์ ์ ์ํ ๋ค์, ๊ทธ ์ปฌ๋ผ๋ง ๋ฐํํ๋ ์ต์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ธ์. ๊ทธ ํ ์์ ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์กฐ์ธ๊ณผ ํ์ ํ๋๋ง ๋ทฐ๋ก ์ฎ๊ธฐ๊ณ , ํํ(ํฌ๋งทํ )์ UI์ ๋งก๊ฒจ ์ ์ง๋ณด์์ฑ์ ๋์ ๋๋ค.
๋ทฐ๋ฅผ API ๊ณ์ฝ์ฒ๋ผ ์ทจ๊ธํ์ธ์. ์๋ก์ด ์ปฌ๋ผ์ ์ถ๊ฐํ๋ ์์ ์ถ๊ฐ์ (additive) ๋ณ๊ฒฝ์ ์ฐ์ ํ๊ณ , ์ด๋ฆ ๋ณ๊ฒฝ์ด๋ ํ์
๋ณ๊ฒฝ์ ํผํ์ธ์. ์๋ฏธ๋ ๊ทธ๋ ์ธ์ด ๋ฐ๋์ด ํธํ์ฑ์ ๊นจ์ผ ํ๋ค๋ฉด vw_xxx_v2์ฒ๋ผ ์ ๋ฒ์ ์ ๋ฐํํ๊ณ ํ๋ฉด์ ์ด ๋ฒ์ ์ผ๋ก ์ ํํ์ธ์.
NULL ๊ฐ์ ํฉ๊ณ๋ ํ๊ท ์ ์กฐ์ฉํ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํฉ๊ณ์์ ๋๋ฝ๋ ๊ฐ์ด 0์ฒ๋ผ ๋์ํด์ผ ํ๋ค๋ฉด ๋ทฐ์์ COALESCE(discount_amount, 0)์ฒ๋ผ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌํด ํฉ๊ณ๊ฐ ํ์ง ์๊ฒ ํ์ธ์.
๋๊ฐ ์ผ๋๋ค(1:N) ์กฐ์ธ์ด ํ์ ๊ณฑํด์ ๋ฐ์ํฉ๋๋ค. โ๋ง์โ ์ชฝ์ ๋จผ์ ์ง๊ณํ ๋ค์ ์กฐ์ธํ๊ฑฐ๋, ์๋ํ ๊ทธ๋ ์ธ์ ์ ์งํ๋ ํค๋ก ์กฐ์ธํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค(์: โ์ธ๋ณด์ด์ค๋น ํ ํโ ๋๋ โ๊ณ ๊ฐ๋น ํ ํโ).
์ธ๋ฑ์ค๋ฅผ ๋ฌด๋ ฅํํ๋ ํจ์๋ ํํ์์ WHERE์ ์ฐ์ง ๋ง์ธ์. ๋ณดํต DATE(created_at) = ...๋ณด๋ค created_at >= ... AND created_at < ... ๊ฐ์ ํ์์คํฌํ ๋ฒ์ ํํฐ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํฉ๋๋ค.
๋ฆฌํฌํ ์ฌ์ฉ์๋ ๋ณดํต ์์ ํ ์ด๋ธ์ ๋ณผ ํ์๊ฐ ์์ผ๋ ๋ทฐ์๋ง ์ ๊ทผ ๊ถํ์ ์ฃผ๊ณ ๊ธฐ๋ฐ ํ ์ด๋ธ ์ ๊ทผ์ ๊ธ์งํ์ธ์. RLS๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ค์ ์ญํ ๋ก ์ฃ์ง์ผ์ด์ค๋ฅผ ํ ์คํธํด๋ณด์ธ์. ๋ทฐ์ ์กฐ์ธ์ด ์์ด๋ฉด ๊ถํ ๋์์ด ๋๋๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค.
UI ๋น๋๋ API ๋ ์ด์ด์์ ๊ฐ์ ๋ฉํธ๋ฆญ์ ๋ฐ๋ณต ์์ฑํ๋ค๋ฉด PostgreSQL ๋ทฐ๋ฅผ ๋จ์ผ ์ถ์ฒ๋ก ์ผ์ ํ๋ฉด์ ๊ตฌ์ฑํ์ธ์. AppMaster๋ฅผ ์ฌ์ฉํ๋ฉด PostgreSQL์ ์ฐ๊ฒฐํด ๊ทธ ๋ทฐ๋ฅผ ์์ ์ ๋ฐ์ดํฐ์ ์ผ๋ก ์ฐ๊ณ , ์กฐ์ธ๊ณผ ๊ท์น์ ํ๋ฉด๋ง๋ค ๋ค์ ๊ตฌํํ์ง ์๊ณ ๋ ๋ฐฑ์๋ ์๋ํฌ์ธํธ์ ์น/๋ชจ๋ฐ์ผ ํ๋ฉด์ ์์ฑํ ์ ์์ต๋๋ค.


