๋ณต์กํ ๊ณ์ธต์ ๋ฐ์ดํฐ ์์ ์ ์ต์ ํ๋ ๊ด๊ณํ ๊ทธ๋ํ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ EdgeQL ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ๊ตฌํํ๋ EdgeDB 2.0 DBMS์ ๋ฆด๋ฆฌ์ค๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ฝ๋๋ Python ๋ฐ Rust(ํ์ ๋ฐ ์ฑ๋ฅ์ ์ค์ํ ๋ถ๋ถ)๋ก ์์ฑ๋์์ผ๋ฉฐ Apache 2.0 ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ PostgreSQL์ฉ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. Python, Go, Rust ๋ฐ TypeScript/Javascript์ฉ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค๋น๋์ด ์์ต๋๋ค. DBMS ๊ด๋ฆฌ ๋ฐ REPL(๋ํํ ์ฟผ๋ฆฌ ์คํ)์ ์ํ ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
EdgeDB๋ ํ ์ด๋ธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ ๋์ ๊ฐ์ฒด ์ ํ ๊ธฐ๋ฐ์ ์ ์ธ์ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ์ธ๋ ํค ๋์ ์ฐธ์กฐ์ ์ํ ์ฐ๊ฒฐ์ด ์ ํ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค(ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ์ฌ์ฉ๋ ์ ์์).
type Person { ํ์ ์์ฑ ์ด๋ฆ -> str; } type Movie { ํ์ ์์ฑ ์ ๋ชฉ -> str; ๋ฉํฐ๋งํฌ ์กํฐ -> ์ฌ๋; }
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ ์์ฑ ์ ํ ์ง์ , ์์ฑ ๊ฐ ์ ํ, ๊ณ์ฐ ์์ฑ ๋ฐ ์ ์ฅ ํ๋ก์์ ์ ๊ฐ์ ๊ธฐ๋ฅ๋ ์ง์๋ฉ๋๋ค. ORM์ ์ฐ์์ํค๋ EdgeDB ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์ฒด๊ณ์ ๊ธฐ๋ฅ์๋ ์คํค๋ง ํผํฉ, ๋ค์ํ ๊ฐ์ฒด์ ์์ฑ ์ฐ๊ฒฐ, ํตํฉ JSON ์ง์ ๊ธฐ๋ฅ์ด ํฌํจ๋ฉ๋๋ค.
์คํค๋ง ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฅํ๊ธฐ ์ํ ๋ด์ฅ ๋๊ตฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ๋ณ๋์ esdl ํ์ผ์ ์ง์ ๋ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ ํ "edgedb migration create" ๋ช ๋ น์ ์คํํ๋ฉด DBMS๊ฐ ์คํค๋ง์ ์ฐจ์ด์ ์ ๋ถ์ํ๊ณ ๋ํ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ก์ด ์คํค๋ง. ์คํค๋ง ๋ณ๊ฒฝ ๋ด์ญ์ด ์๋์ผ๋ก ์ถ์ ๋ฉ๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด GraphQL ์ฟผ๋ฆฌ ์ธ์ด์ ๊ณ์ธต์ ๋ฐ์ดํฐ์ ๋ํ SQL์ ์ ์ฉํ ๋ ์ EdgeDB ์ธ์ด๊ฐ ๋ชจ๋ ์ง์๋ฉ๋๋ค. ๋ชฉ๋ก ๋์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๊ตฌ์กฐํ๋ ๋ฐฉ์์ผ๋ก ํ์ํ๋๊ณ , ํ์ ์ฟผ๋ฆฌ ๋ฐ JOIN ๋์ ํ๋์ EdgeQL ์ฟผ๋ฆฌ๋ฅผ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ด์ ํํ์์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ํธ๋์ญ์ ๊ณผ ์ฃผ๊ธฐ๊ฐ ์ง์๋ฉ๋๋ค.
select Movie { title, actor: { ์ด๋ฆ } } filter .title = "The Matrix" insert Movie { title := "The Matrix Resurrections", actor := ( select Person filter .name in { 'Keanu Reeves', 'Carrie- Anne Moss', 'Laurence Fishburne' } ) } {0, 1, 2, 3} ์กฐํฉ์ ์ซ์์ ๋ํด ( { ์ซ์, ์ซ์ + 0.5 } ์ ํ);
์ ๋ฒ์ ์์:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ๋ฅผ ์ํด ๋ด์ฅ๋ ์น ์ธํฐํ์ด์ค๊ฐ ์ถ๊ฐ๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ํธ์งํ๊ณ , EdgeQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ์ฌ์ฉ๋ ์คํ ๋ฆฌ์ง ๊ตฌ์ฑํ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ "edgedb ui" ๋ช
๋ น์ผ๋ก ์์๋๋ฉฐ, ์ดํ localhost์ ์ก์ธ์คํ ๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
- "GROUP" ํํ์์ด ๊ตฌํ๋์ด SELECT ์์ ์ ๊ทธ๋ฃนํ์ ์ ์ฌํ๊ฒ ์์์ EdgeQL ํํ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๊ณ ์ง๊ณํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด ์์ค์์ ์ก์ธ์ค๋ฅผ ์ ์ดํ๋ โโ๊ธฐ๋ฅ. ์ก์ธ์ค ๊ท์น์ ์คํ ๋ฆฌ์ง ์คํค๋ง ์์ค์์ ์ ์๋๋ฉฐ ๊ฐ์ ธ์ค๊ธฐ, ์ฝ์ , ์ญ์ ๋ฐ ์ ๋ฐ์ดํธ ์์ ์์ ํน์ ๊ฐ์ฒด ์งํฉ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ฑ์๋ง ์ถํ๋ฌผ์ ์ ๋ฐ์ดํธํ๋๋ก ํ์ฉํ๋ ๊ท์น์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์คํ ๋ฆฌ์ง ์คํค๋ง์ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ฌ์ฉ์์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ์๋ก์ด ์ ์ญ ๋ณ์ current_user๊ฐ ์ ์๋์์ต๋๋ค.
- ๊ฐ ๋ฒ์๋ฅผ ์ ์ํ๋ ์ ํ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- Rust ์ธ์ด์ ๋ํ ๊ณต์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค๋น๋์์ต๋๋ค.
- EdgeDB ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด ์์ ํ๋์ด ๋์ผํ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ด์์ ๋์์ ์ฌ๋ฌ ๋ค๋ฅธ ์ธ์ ์ ์ฒ๋ฆฌํ๊ณ , HTTP๋ฅผ ํตํด ์ ๋ฌํ๊ณ , ์ ์ญ ๋ณ์์ ๋ก์ปฌ ์ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
- ์๋ฒ ํธ๋ค๋ฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ์ง ์๊ณ ์ฐ๊ฒฐ์ ์ค์ ํ๋ ค๊ณ ํ ๋๋ง ์คํํ ์ ์๋ ์์ผ ํ์ฑํ์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค(๊ฐ๋ฐ์ ์์คํ ์์ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๋ ๋ฐ ์ ์ฉํจ).
์ถ์ฒ : opennet.ru