PostgreSQL DBMS์ ๋ํ ๊ฒฝ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ๋ณ๋๋ก ์ด์๋๋ ์น ์๋ฒ์ธ PostgREST 9.0.0์ด ์ถ์๋์ด ๊ธฐ์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด๋ฅผ RESTful API๋ก ๋ณํํฉ๋๋ค. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด(ORM)๋ก ๋งคํํ๋ ๋์ PostgREST๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ๋ทฐ๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธก์ JSON ์๋ต์ ์ง๋ ฌํ, ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์น์ธ๋ ์ฒ๋ฆฌํฉ๋๋ค. ์์คํ ์ฑ๋ฅ์ ์ผ๋ฐ ์๋ฒ์์ ์ด๋น ์ต๋ 2000๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ํ๋ก์ ํธ ์ฝ๋๋ Haskell๋ก ์์ฑ๋์์ผ๋ฉฐ MIT ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ถํ ๋ฉ์ปค๋์ฆ๋ง ์ฌ์ฉํ์ฌ HTTP๋ฅผ ํตํด ๋ฐ์ดํฐ(ํ ์ด๋ธ, ๋ทฐ ์ ํ ๋ฐ ์ ์ฅ ํ๋ก์์ )์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ทธ๋ฌํ ๋ณํ์ ์ธ์ฝ๋ฉํ ํ์๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ GRANT ๋ช ๋ น์ผ๋ก REST API๋ฅผ ํตํด ํ ์ด๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ ํ ์์ค ๋ณด์(ํ ์์ค ๋ณด์)์ ์ฌ์ฉํ์ฌ ํ ํฐ(JWT)๋ณ ์ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ๊ณ "๋ฉํฐํ ๋์"๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๊ตฌ์กฐ์ ์ผ๋ก PostgREST๋ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ํ ์์ฒด๋ฅผ ์ ์ฅํ์ง ์๊ณ ์ด๋ฅผ ์ํด ๋ฐ์ดํฐ์ ๋ํ ๋จ์ผ ์ก์ธ์ค(๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต)๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์งํฅ ์ํคํ ์ฒ(๋ฐ์ดํฐ ์งํฅ ์ํคํ ์ฒ)๋ฅผ ์งํฅํฉ๋๋ค.
์ ๋ฒ์ ์ ๋ณ๊ฒฝ ์ฌํญ:
- ๋ถํ ๋ ํ ์ด๋ธ์ด ์คํ ๋ฆฌ์ง ์คํค๋ง ์บ์์ ์ถ๊ฐ๋์ด ํด๋น ํ ์ด๋ธ์ด ์์น ์๋ต์ 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