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

๋ณด๊ณ ์šฉ PostgreSQL ๋ทฐ: ๋” ๊ฐ„๋‹จํ•œ ์กฐ์ธ, ์•ˆ์ •์ ์ธ ํ™”๋ฉด

๋ณด๊ณ ์šฉ PostgreSQL ๋ทฐ๋Š” ์กฐ์ธ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ค‘๋ณต SQL์„ ์ค„์ด๋ฉฐ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ทฐ๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ฆฌํฌํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ• ์ง€ ์•Œ์•„๋ณด์„ธ์š”.

๋ณด๊ณ ์šฉ PostgreSQL ๋ทฐ: ๋” ๊ฐ„๋‹จํ•œ ์กฐ์ธ, ์•ˆ์ •์ ์ธ ํ™”๋ฉด

์™œ ๋ฆฌํฌํŒ… ์ฟผ๋ฆฌ๊ฐ€ ๊ธˆ๋ฐฉ ์—‰๋ง์ด ๋˜๋Š”๊ฐ€

๋ฆฌํฌํŒ… ํ™”๋ฉด์€ ๊ฑฐ์˜ ๋‹จ์ˆœํ•œ ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต ํ•„ํ„ฐ์™€ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก, ๊ทธ ๋ชฉ๋ก๊ณผ ์ผ์น˜ํ•˜๋Š” ํ•ฉ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๋ณ„ยท์›”๋ณ„ยท๋‹ด๋‹น์ž๋ณ„ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ถ„ํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์กฐํ•ฉ์€ 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 ์ •์ฑ…
  • ๋…ผ๋ฆฌ๊ฐ€ ์ง„์งœ ๊ณ ์œ ํ•˜๊ณ  ์ž‘์„ ๋•Œ๋Š” ํ™”๋ฉด ์ „์šฉ ์ฟผ๋ฆฌ

์˜ˆ: ์ง€์›ํŒ€์€ "์˜ค๋Š˜ ์—์ด์ „ํŠธ๋ณ„ ํ‹ฐ์ผ“"์„ ์›ํ•˜๊ณ  ์žฌ๋ฌดํŒ€์€ "๊ณ„์•ฝ ์›”๋ณ„ ํ‹ฐ์ผ“"์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์„ ํ•˜๋‚˜์˜ ๋ทฐ์— ์–ต์ง€๋กœ ๋งž์ถ”๋ฉด ๋ณดํ†ต ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ปฌ๋Ÿผ๊ณผ ๋А๋ฆฐ ์Šค์บ”์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ž‘๊ณ  ์ง‘์ค‘๋œ ๋ทฐ(๋˜๋Š” ํ•˜๋‚˜์˜ ์š”์•ฝ ํ…Œ์ด๋ธ”๊ณผ ํ™”๋ฉด๋ณ„ ์ฟผ๋ฆฌ)๊ฐ€ ๋” ๋ช…ํ™•ํ•˜๊ณ  ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„: ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๋ฆฌํฌํŒ… ๋ทฐ ๋งŒ๋“ค๊ธฐ

๋ทฐ ์œ„์— ๋ฆฌํฌํŠธ ๊ตฌ์ถ•
PostgreSQL ๋ทฐ๋ฅผ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์‚ฌ์šฉํ•ด SQL์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํฌํŒ… ํ™”๋ฉด์„ ๋งŒ๋“œ์„ธ์š”.
AppMaster ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ํ™”๋ฉด์—์„œ ์‹œ์ž‘ํ•˜์„ธ์š”. ๋ณด๊ณ ์„œ๊ฐ€ ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ์ปฌ๋Ÿผ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์ ์šฉํ•  ํ•„ํ„ฐ(๋‚ ์งœ ๋ฒ”์œ„, ์ƒํƒœ, ๋‹ด๋‹น์ž), ๊ธฐ๋ณธ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ ์œผ์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด "๋ชจ๋“  ๊ฒƒ์„ ๋‹ด๋Š”" ๋ทฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋‹ค์Œ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์ผ๋ฐ˜ 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๋ฅผ ์“ด๋‹ค๋ฉด ๋ฐฐํฌ ์ „์— ๊ฐฑ์‹  ๊ณ„ํš์„ ์ •ํ•˜์„ธ์š”. ์–ด๋А ์ •๋„๊นŒ์ง€์˜ ์‹ ์„ ๋„๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€(๋ถ„, ์‹œ๊ฐ„, ํ•˜๋ฃจ) ์ •ํ•˜๊ณ  ๊ฐฑ์‹ ์ด ํ”ผํฌ ์‹œ๊ฐ„์— ์ž ๊ธˆ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ ‘๊ทผ์„ ์ ๊ฒ€ํ•˜์„ธ์š”. ๋ฆฌํฌํŒ… ์‚ฌ์šฉ์ž๋Š” ๋ณดํ†ต ์ฝ๊ธฐ ์ „์šฉ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ทฐ๋Š” ๋ณด๊ณ ์„œ์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋…ธ์ถœํ•˜๋„๋ก ํ•˜์„ธ์š”.

์˜ˆ: ๋‘ ๊ฐœ ํ™”๋ฉด์„ ๊ตฌ๋™ํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ทฐ

์ผ๊ด€๋œ ๋ฉ”ํŠธ๋ฆญ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ
์ด๋ฏธ ์‹ ๋ขฐํ•˜๋Š” ๋ฆฌํฌํŒ… ๊ณ„์•ฝ์—์„œ ๋ฐฑ์—”๋“œ API์™€ ์›น UI๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
๋นŒ๋“œ ์‹œ์ž‘

์˜์—… ์šด์˜์—์„œ ๋‘ ํ™”๋ฉด์„ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค: "์ผ์ผ ์ˆ˜์ต"(์ผ๋ณ„ ์ฐจํŠธ)๊ณผ "๋ฏธํ•ด๊ฒฐ ์ธ๋ณด์ด์Šค"(๋ˆ„๊ฐ€ ์–ผ๋งˆ๋ฅผ ๋นš์กŒ๋Š”์ง€ ํ‘œ). ์ฒซ ์‹œ๋„๋Š” ์ข…์ข… ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ธ๋ณด์ด์Šค ์ƒํƒœ, ํ™˜๋ถˆ, ์–ด๋–ค ๊ณ ๊ฐ์„ ์…€์ง€์— ๋Œ€ํ•œ ๊ทœ์น™ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋‹ฌ ํ›„ ์ˆซ์ž๊ฐ€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๊ณต์œ  ๊ทœ์น™์„ ํ•œ๊ณณ์— ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›์‹œ ํ…Œ์ด๋ธ”(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๋ฅผ ์ƒ์„ฑํ•ด ๊ฐ ํ™”๋ฉด์—์„œ ์กฐ์ธ๊ณผ ๊ทœ์น™์„ ๋ฐ˜๋ณต ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์€ ํŒŒ์ผ๋Ÿฟ์„ ์‹คํ–‰ํ•˜์„ธ์š”. ์˜ค๋Š˜ ๊ฐ€์žฅ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋ฆฌํฌํŒ… ํ™”๋ฉด ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๊ทธ ๋ฉ”ํŠธ๋ฆญ์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๋Š” ๋ทฐ ํ•˜๋‚˜๋ฅผ ์„ค๊ณ„ํ•ด ํ•œ ๋ฒˆ์˜ ๋ฐฐํฌ ์ฃผ๊ธฐ์— ๋„ฃ์–ด ๋ณด์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฟผ๋ฆฌ ์ค‘๋ณต์ด ์ค„๊ณ  "์ˆซ์ž๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๋ฒ„๊ทธ๊ฐ€ ์ค„์–ด๋“œ๋Š”์ง€ ์ธก์ •ํ•˜์„ธ์š”.

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

์–ธ์ œ PostgreSQL ๋ทฐ๊ฐ€ ๋ฆฌํฌํŒ… ํ™”๋ฉด์— ์ ํ•ฉํ•œ๊ฐ€?

์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ฐ™์€ ์กฐ์ธ๊ณผ ์ •์˜(์˜ˆ: โ€œpaidโ€๋‚˜ โ€œactiveโ€์˜ ์˜๋ฏธ)๋ฅผ ๋ฐ˜๋ณตํ•  ๋•Œ ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ณต์œ  ๋กœ์ง์„ ํ•œ๊ณณ์— ๋‘๋ฉด ํ•ฉ๊ณ„๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜๊ณ  ๊ฐ ํ™”๋ฉด์€ ์ž์ฒด ํ•„ํ„ฐ์™€ ์ •๋ ฌ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ทฐ์™€ materialized view์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

์ผ๋ฐ˜ ๋ทฐ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ์ฟผ๋ฆฌ๋กœ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. materialized view๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•ด ์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋Š” ๋งˆ์ง€๋ง‰ ๊ฐฑ์‹  ์‹œ์ ๊นŒ์ง€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฆฌํฌํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋‚˜์š”?

์•„๋‹ˆ์š”. ๋ทฐ ์ž์ฒด๊ฐ€ ์‹คํ–‰ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ์ง„ ์•Š์Šต๋‹ˆ๋‹ค. PostgreSQL์€ ์—ฌ์ „ํžˆ ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์ •์˜๋œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธ๋ฑ์Šค ๊ฐœ์„ , ๋” ์„ ๋ณ„์ ์ธ ํ•„ํ„ฐ, ๋˜๋Š” materialized view๋‚˜ ์ง‘๊ณ„ ํ…Œ์ด๋ธ” ๊ฐ™์€ ์‚ฌ์ „ ๊ณ„์‚ฐ ์š”์•ฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ๋ฆฌํฌํŒ… ๋ทฐ๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋‚˜์š”?

ํ™”๋ฉด์ด ํ•„์š”๋กœ ํ•˜๋Š” ์ •ํ™•ํ•œ ์ปฌ๋Ÿผ๊ณผ ๊ฐ ์ปฌ๋Ÿผ์˜ ์˜๋ฏธ๋ฅผ ๋จผ์ € ์ •์˜ํ•œ ๋‹ค์Œ, ๊ทธ ์ปฌ๋Ÿผ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์†Œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. ๊ทธ ํ›„ ์•ˆ์ •์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์กฐ์ธ๊ณผ ํŒŒ์ƒ ํ•„๋“œ๋งŒ ๋ทฐ๋กœ ์˜ฎ๊ธฐ๊ณ , ํ‘œํ˜„(ํฌ๋งทํŒ…)์€ UI์— ๋งก๊ฒจ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊นจ์ง€ ์•Š๊ณ  ๋ทฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋‚˜์š”?

๋ทฐ๋ฅผ API ๊ณ„์•ฝ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜์„ธ์š”. ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์‹์˜ ์ถ”๊ฐ€์ (additive) ๋ณ€๊ฒฝ์„ ์šฐ์„ ํ•˜๊ณ , ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด๋‚˜ ํƒ€์ž… ๋ณ€๊ฒฝ์€ ํ”ผํ•˜์„ธ์š”. ์˜๋ฏธ๋‚˜ ๊ทธ๋ ˆ์ธ์ด ๋ฐ”๋€Œ์–ด ํ˜ธํ™˜์„ฑ์„ ๊นจ์•ผ ํ•œ๋‹ค๋ฉด vw_xxx_v2์ฒ˜๋Ÿผ ์ƒˆ ๋ฒ„์ „์„ ๋ฐœํ–‰ํ•˜๊ณ  ํ™”๋ฉด์„ ์ด ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”.

ํ•ฉ๊ณ„๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋„๋ก NULL์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋‚˜์š”?

NULL ๊ฐ’์€ ํ•ฉ๊ณ„๋‚˜ ํ‰๊ท ์„ ์กฐ์šฉํžˆ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„์—์„œ ๋ˆ„๋ฝ๋œ ๊ฐ’์ด 0์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ทฐ์—์„œ COALESCE(discount_amount, 0)์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ํ•ฉ๊ณ„๊ฐ€ ํŠ€์ง€ ์•Š๊ฒŒ ํ•˜์„ธ์š”.

JOIN์„ ์ถ”๊ฐ€ํ•œ ๋’ค ํ•ฉ๊ณ„๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋Œ€๊ฐœ ์ผ๋Œ€๋‹ค(1:N) ์กฐ์ธ์ด ํ–‰์„ ๊ณฑํ•ด์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. โ€˜๋งŽ์€โ€™ ์ชฝ์„ ๋จผ์ € ์ง‘๊ณ„ํ•œ ๋‹ค์Œ ์กฐ์ธํ•˜๊ฑฐ๋‚˜, ์˜๋„ํ•œ ๊ทธ๋ ˆ์ธ์„ ์œ ์ง€ํ•˜๋Š” ํ‚ค๋กœ ์กฐ์ธํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: โ€˜์ธ๋ณด์ด์Šค๋‹น ํ•œ ํ–‰โ€™ ๋˜๋Š” โ€˜๊ณ ๊ฐ๋‹น ํ•œ ํ–‰โ€™).

์ธ๋ฑ์Šค๋ฅผ ์ฃฝ์ด์ง€ ์•Š๊ณ  ๋‚ ์งœ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํ•„ํ„ฐํ•˜๋ ค๋ฉด?

์ธ๋ฑ์Šค๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ํ‘œํ˜„์‹์„ WHERE์— ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋ณดํ†ต DATE(created_at) = ...๋ณด๋‹ค created_at >= ... AND created_at < ... ๊ฐ™์€ ํƒ€์ž„์Šคํƒฌํ”„ ๋ฒ”์œ„ ํ•„ํ„ฐ๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํฌํŒ… ๋ทฐ์˜ ๊ถŒํ•œ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?

๋ฆฌํฌํŒ… ์‚ฌ์šฉ์ž๋Š” ๋ณดํ†ต ์›์‹œ ํ…Œ์ด๋ธ”์„ ๋ณผ ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ ๋ทฐ์—๋งŒ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ฃผ๊ณ  ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ” ์ ‘๊ทผ์€ ๊ธˆ์ง€ํ•˜์„ธ์š”. RLS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ์—ญํ• ๋กœ ์—ฃ์ง€์ผ€์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”. ๋ทฐ์™€ ์กฐ์ธ์ด ์„ž์ด๋ฉด ๊ถŒํ•œ ๋™์ž‘์ด ๋†€๋ž๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL ๋ทฐ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ AppMaster๋Š” ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋‚˜์š”?

UI ๋นŒ๋”๋‚˜ API ๋ ˆ์ด์–ด์—์„œ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ์„ ๋ฐ˜๋ณต ์ž‘์„ฑํ•œ๋‹ค๋ฉด PostgreSQL ๋ทฐ๋ฅผ ๋‹จ์ผ ์ถœ์ฒ˜๋กœ ์‚ผ์•„ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜์„ธ์š”. AppMaster๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด PostgreSQL์— ์—ฐ๊ฒฐํ•ด ๊ทธ ๋ทฐ๋ฅผ ์•ˆ์ •์  ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์“ฐ๊ณ , ์กฐ์ธ๊ณผ ๊ทœ์น™์„ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฑ์—”๋“œ ์—”๋“œํฌ์ธํŠธ์™€ ์›น/๋ชจ๋ฐ”์ผ ํ™”๋ฉด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์‹œ์ž‘ํ•˜๋‹ค
๋ณด๊ณ ์šฉ PostgreSQL ๋ทฐ: ๋” ๊ฐ„๋‹จํ•œ ์กฐ์ธ, ์•ˆ์ •์ ์ธ ํ™”๋ฉด | AppMaster