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

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•  ๋•Œ๋Š” SQL ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ปค์„œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ SELECT ๋ฌธ์ด ์‹คํ–‰๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DBMS)์€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํ–‰์„ ํ•œ ๋ฒˆ์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŠนํžˆ ๋งŽ์€ ์ˆ˜์˜ ํ–‰์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ด๊ณ  ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ณ  ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—์„œ ํ•œ ๋ฒˆ์— ํ•˜์œ„ ์ง‘ํ•ฉ์ด๋‚˜ ๋‹จ์ผ ํ–‰๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ถ€๋‹ด์„ ์ค„์ž„์œผ๋กœ์จ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ปค์„œ๋Š” AppMasterno-code ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ”Œ๋žซํผ์˜ ์‹œ๊ฐ์  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ƒ์„ฑ, ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ์„ค๊ณ„ ๋ฐ ์ž๋™ ์ƒ์„ฑ๋œ REST API ํ†ตํ•ฉ์„ ํ†ตํ•ด PostgreSQL ํ˜ธํ™˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์„œ๋Š” ์ถ”๊ฐ€ ์ œ์–ด ๋ฐ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ์™€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋˜๋Š” DBMS์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ปค์„œ๊ฐ€ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก ์ปค์„œ์™€ ์„œ๋ฒ„ ์ธก ์ปค์„œ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฒ”์ฃผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์ธก ์ปค์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ปค์„œ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์„œ๋ฒ„ ์ธก ์ปค์„œ๋Š” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ปค์„œ ์œ„์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋ฒ„์— ์˜ํ•ด ์ œ์–ด๋˜๋ฉฐ ์ง€์ •๋œ ํ–‰๋งŒ ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

AppMaster ๊ฐ€ ์ง€์›ํ•˜๋Š” PostgreSQL ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋งฅ๋ฝ์—์„œ ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„ ์ธก ์ปค์„œ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปค์„œ๋Š” DECLARE CURSOR ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ FETCH ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ์ฟผ๋ฆฌ์—์„œ ํ–‰์„ ํ•˜๋‚˜์”ฉ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MOVE, UPDATE, DELETE ๋ช…๋ น ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์„œ์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ปค์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋จผ์ € ์ปค์„œ๊ฐ€ ํ–‰์„ ๊ฐ€์ ธ์˜ฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์ •์˜ํ•˜๋Š” SELECT ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด SQL ๋ฌธ์€ ์ปค์„œ์— ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ• ๋‹นํ•˜๋Š” DECLARE CURSOR ๋ช…๋ น์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. OPEN ๋ช…๋ น์€ ์ปค์„œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ํ–‰ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. FETCH ๋ช…๋ น์€ ์›ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ปค์„œ์—์„œ ํ–‰์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. CLOSE ๋ช…๋ น์€ ์ปค์„œ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ปค์„œ์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ซ๊ณ  ํ•ด์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด "product_id", "์ˆ˜๋Ÿ‰" ๋ฐ "sale_price" ์—ด์ด ์žˆ๋Š” "sales"๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. sale_price๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ปค์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ SQL ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

sales_cursor CURSOR FOR ์„ ์–ธ
  SELECT ์ œํ’ˆ_ID, ์ˆ˜๋Ÿ‰, ํ• ์ธ๊ฐ€
  ํŒ๋งค์—์„œ
  ํŒ๋งค๊ฐ€ DESC๋กœ ์ฃผ๋ฌธ;

OPEN ํŒ๋งค_์ปค์„œ;

sales_cursor์—์„œ ๋‹ค์Œ ํ•ญ๋ชฉ ๊ฐ€์ ธ์˜ค๊ธฐ;

์ด ์˜ˆ์˜ FETCH ๋ช…๋ น์€ sales_price๊ฐ€ ๊ฐ€์žฅ ๋†’์€ sales ํ…Œ์ด๋ธ”์˜ ๋‹ค์Œ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ–‰์ด ๊ฒ€์ƒ‰๋  ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€ FETCH ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ CLOSE ๋ช…๋ น์€ sales_cursor๋ฅผ ๋‹ซ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์ปค์„œ ์™ธ์—๋„ PostgreSQL์€ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰์„ ํ—ˆ์šฉํ•˜๋Š” ์Šคํฌ๋กค ๊ฐ€๋Šฅ ์ปค์„œ, ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค์„œ๋ฅผ ์—ด์–ด๋‘๋Š” ๋ณด์œ  ๊ฐ€๋Šฅ ์ปค์„œ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ปค์„œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ์ปค์„œ ๊ธฐ๋Šฅ์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ์™€ ๋ณต์žกํ•œ ๊ฒฐ๊ณผ ์„ธํŠธ๋กœ ์ž‘์—…ํ•  ๋•Œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

์š”์•ฝํ•˜๋ฉด, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…์ŠคํŠธ์˜ ์ปค์„œ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. AppMaster ์—์„œ ์‚ฌ์šฉํ•˜๋Š” PostgreSQL ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์šฉ ์„œ๋ฒ„ ์ธก ์ปค์„œ์— ์ค‘์ ์„ ๋‘์–ด ํšจ์œจ์ ์ธ ํ–‰ ๊ฒ€์ƒ‰ ๋ฐ ์กฐ์ž‘์„ ์ง€์›ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํƒ์ƒ‰์„ ์ œ์–ดํ•˜๊ณ  ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‚ฌ์šฉ ๋ฐ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ปค์„œ๋Š” AppMasterno-code ํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.