๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ RESTful API๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ธ PostgREST 9.0.0 ๋ฆด๋ฆฌ์Šค

PostgreSQL DBMS์— ๋Œ€ํ•œ ๊ฒฝ๋Ÿ‰ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณ„๋„๋กœ ์šด์˜๋˜๋Š” ์›น ์„œ๋ฒ„์ธ PostgREST 9.0.0์ด ์ถœ์‹œ๋˜์–ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐœ์ฒด๋ฅผ RESTful API๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด(ORM)๋กœ ๋งคํ•‘ํ•˜๋Š” ๋Œ€์‹  PostgREST๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธก์€ JSON ์‘๋‹ต์˜ ์ง๋ ฌํ™”, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์Šน์ธ๋„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์€ ์ผ๋ฐ˜ ์„œ๋ฒ„์—์„œ ์ดˆ๋‹น ์ตœ๋Œ€ 2000๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” Haskell๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ถŒํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ HTTP๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ(ํ…Œ์ด๋ธ”, ๋ทฐ ์œ ํ˜• ๋ฐ ์ €์žฅ ํ”„๋กœ์‹œ์ €)์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ์ธ์ฝ”๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ GRANT ๋ช…๋ น์œผ๋กœ REST API๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ(ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ(JWT)๋ณ„ ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  "๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ"๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ PostgREST๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ์ƒํƒœ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์ด๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋‹จ์ผ ์•ก์„ธ์Šค(๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜(๋ฐ์ดํ„ฐ ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜)๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ RESTful API๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ธ PostgREST 9.0.0 ๋ฆด๋ฆฌ์Šค

์ƒˆ ๋ฒ„์ „์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • ๋ถ„ํ• ๋œ ํ…Œ์ด๋ธ”์ด ์Šคํ† ๋ฆฌ์ง€ ์Šคํ‚ค๋งˆ ์บ์‹œ์— ์ถ”๊ฐ€๋˜์–ด ํ•ด๋‹น ํ…Œ์ด๋ธ”์ด ์œ„์น˜ ์‘๋‹ต์— UPSERT ๋ฐ INSERT ์ž‘์—…์„ ํฌํ•จํ•˜๊ณ , OPTIONS ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , OpenAPI ์ง€์›์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • RPC POST๋ฅผ ํ†ตํ•ด ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "Prefer: params=single-object" ํ—ค๋” ์—†์ด ํ•˜๋‚˜์˜ JSON ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "Content-Type: application/octet-stream" ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ bytea ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "Content-Type: text/plain" ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์— ํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ค‘ ๊ด„ํ˜ธ ์•ˆ์˜ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "?col=in.("Double\"Quote"), ?col=in.("Back\\slash")").
  • ๋‚ด์žฅ๋œ ํ•„ํ„ฐ("/projects?select=*,clients!inner(*)&clients.id=eq.12")๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ค€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • "is" ์—ฐ์‚ฐ์ž๋Š” "unknown" ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • PostgreSQL 14์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋‹ฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ PostgreSQL 9.5์— ๋Œ€ํ•œ ์ง€์›์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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