EdgeDB

https://www.edgedb.com/docs/intro/quickstart 페이지를 참고 하여 튜토리얼을 따라해 본 내용을 서술하였습니다.
 

설명

EdgeDB는 차세대 graph-relational database 로 관계 데이터베이스, 그래프 데이터베이스, ORM의 장점을 적용한 신형 데이터베이스입니다.
SQL database의 장점인 Type safety, 성능, 안정성, 트랜잭션을 가지고 있습니다. 그러나 관계형 database는 테이블형식으로 모델링하는 대신 EdgeDB는 속성과 다른 개체에 대한 링크가 포함된 형태로 데이터를 나타냅니다. 이러한 개체 지향 모델을 활용하여 SQL의 가장 큰 유용성 문제 중 일부를 해결하는 초강력 쿼리 언어를 제공한다.

 

 

Quick start

1. 설치

먼저 EdgeDB CLI를 설치해야 합니다. 각 운영체제별로 설치방법은 아래와 같습니다.
  • macOS/Linux
curl https://sh.edgedb.com --proto '=https' -sSf1 | sh
  • Windows (PS)
PS> iwr https://ps1.edgedb.com -useb | iex
 
위 커맨드를 통해 다운로드하고 edgedb CLI를 설치할 수 있습니다. 설치 완료후 Terminal을 재시작하면 사용할 수 있습니다. 또는 설치 직후 나오는 명령어를 통해 사용할 수 도 있습니다.

2. project 초기화

터미널에서 새로운 디렉터리를 만들어서 거기로 들어갑니다.
mkdir quickstart
cd quickstart
 
그리고 edgedb project를 초기화 해줍니다.
edgedb proejct init
 
그러면 edgedb 인스턴스를 setting을 위한 툴이 실행되고 아래와 같은 방식으로 진행되게 됩니다.
> edgedb project init
No `edgedb.toml` found in `/edgedb/quickstart` or above
Do you want to initialize a new project? [Y/n]
> Y
Specify the name of EdgeDB instance to use with this project [default: quickstart]:
> quickstart
Checking EdgeDB versions...
Specify the version of EdgeDB to use with this project [default: 2.3]:
> 2.3
┌──────────────┬───────────────────────┐
│ Project directory  │ /edgedb/quickstart              │
│ Project config     │ /edgedb/quickstart/edgedb.toml  │
│ Schema dir (empty) │ /edgedb/quickstart/dbschema     │
│ Installation method│ portable package                │
│ Version            │ 2.3+ab48913                     │
│ Instance name      │ quickstart                      │
└──────────────┴───────────────────────┘
Downloading package...
00:00:02 [====================] 35.27MiB/35.27MiB 15.38MiB/s | ETA: 0s
Successfully installed 2.3+ab48913
Initializing EdgeDB instance...
[systemctl] Created symlink ~/.config/systemd/user/default.target.wants/edgedb-server@quickstart.socket → ~/.config/systemd/user/edgedb-server@quickstart.socket.
[systemctl] Created symlink ~/.config/systemd/user/default.target.wants/edgedb-server@quickstart.service → ~/.config/systemd/user/edgedb-server@quickstart.service.
Applying migrations...
Everything is up to date. Revision initial
Project initialized.
To connect to quickstart, run `edgedb`
 
이 작업을 통해 크게 두가지 작업이 이루어졌습니다.
  1. edgedb.toml config파일과 schema파일, dbschema/default.esdl 파일을 만들어 프로젝트를 생성했습니다. default.esdl은 말 그대로 기본 schema를 의미합니다.
  2. QuickStart라는 edgedb 인스턴스를 연결했다. 프로젝트 디렉터리 안에 있는 인스턴스에 대해 모든 CLI명령이 실행된다. edgedb 프로젝트의 작동방식에 대한 자세한 내용은 인스턴스 가이드를 참조하시길 바랍니다. (https://www.edgedb.com/docs/intro/instances#ref-intro-instances)
동시에 여러 인스턴스를 생성할 수 있으며 각 인스턴스에는 여러 데이터가 포함될수 있다. 각 데이터베이스에는 여러 모듈이 포함될 수 있다. (일반적으로 schema는 기본 모듈 내부에서 정의 된다.)
 
이제 아래 명령어를 통해 edgedb에 연결할 수 있다.
edgedb
 
그리고 간단한 쿼리를 실행해 정상 구동여부를 확인할 수 있습니다.
edgedb> select 1 + 1;
{2}
CLI에서 나오기 위해서는  \q 명령어를 입력하면 됩니다. 
먼저 schema를 설정 해 보겠습니다.
 

3. schema 설정 하기

원하는 IDE 또는 editor 에서 해당 디렉터리를 열어 파일 구조를 확인해봅시다.
├── edgedb.toml
├── dbschema
│   ├── default.esdl
│   ├── migrations
 
edgeDB Schema는 edgedb SDL(Schema Description Language)로 정의를 합니다.
SDL은 esdl파일 내부에 있습니다. 일반적으로 전체 schema는 default.esdl이라는 파일로 선언되지만 원하는 경우 여러 esdl 파일로 schema를 분할 할 수 있습니다.
 
예제로 간단한 영화 데이터베이스를 구축해보겠습니다.
영화와 사람의 두 가지 객체 유형을 정의합니다. (SQL의 테이블 생성에 해당합니다.)
편집기에서 dbschema/default.esdl 을 열고 아래 내용을 붙여넣습니다.
module default {
  type Person {
    required property name -> str;
  }

  type Movie {
    property title -> str;
    multi link actors -> Person;
  }
};
 
여기서 주목할 부분
  • ID 값이 포함되지 않습니다. Edgedb는 자동으로 database에 삽입 된 모든 객체에 대해 자동으로 고유한 UUID를 할당 합니다.
  • Movie type에는 배우와 감독의 두 가지 링크도 포함되어 있습니다. edgedb에서는 링크는 객체 유형 간의 관계를 타나내는 데 사용합니다. 이는 foreign key를 사용할 필요가 없습니다. 그리고 추후에 join이 없이 deep query를 작성할 수 있으며 나중에는 얼마나 쉬운지 알 수 있습니다.
  • 객체 유형은 default 모듈 내에 있습니다. schema를 모듈이라고 하는 logical subunits으로 나눌 수 있지만, default라는 단일 모듈에서 전체 schema를 정의하는 것이 일반적 입니다.
이제 schema를 database에 적용하기 위해 migration을 할 준비가 되었습니다.

 

4.migration 실행하기

edgedb migration create 명령어를 통해 migration 파일을 생성합니다. 이 명령어는 *.esdl 파일을 확인해 database로 보냅니다. database는 이 파일의 구문을 분석하고 현재 schema와 비교하여 migration 계획을 생성합니다. 그런 다음에 database는 계획에 따라 CLI로 다시 보내서 migration 파일을 생성합니다.
> edgedb migration create
Created dbschema/migrations/00001.edgeql, id: m1ccbjebnaeoq2hki3ma35lw5pkf6sadomsjyuehxzgecxq2h4uwgq
 
관심이 있다면 migration파일을 열어 어떻게 구성되어 있는지 확인해보세요.
Create Type, Alter Type, Create 속성과 같은 DDL 명령으로 구성된 간단한 EdgeQL 스크립트로 구성되어 있습니다.
 
migration 파일이 생성 되었지만 이는 database에 적용되지는 않았습니다. 이제 적용을 해봅시다.
> edgedb migrate
Applied m1ccbjebnaeoq2hki3ma35lw5pkf6sadomsjyuehxzgecxq2h4uwgq (00001.edgeql)
 
edgedb list types 를 입력해서 결과를 확인 합니다. 이것은 현재 정의 된 모든 객체 유형이 포함 된 테이블을 출력합니다.
> edgedb list types
┌────────────┬─────────────────────┐
│ Name            │ Extending                     │
├────────────┼─────────────────────┤
│ default::Movie  │ std::BaseObject, std::Object  │
│ default::Person │ std::BaseObject, std::Object  │
└────────────┴─────────────────────┘
 
다음 단계로 넘어가기전에 schema를 한번 변경해보겠습니다. Movie의 title을 required 로 변경하겠습니다. 먼저 schema file을 아래 내용으로 업데이트 합니다.
type Movie {
    required property title -> str;
    multi link actors -> Person;
  }
 
그런 다음 한번 더 edgedb migration crate 를 실행합니다. 첫 migrtaion이 아니기 때문에 이전과 약간 다른 내용이 출력되는 것을 확인할 수 있습니다.
> edgedb migration create
did you make property 'title' of object type 'default::Movie' required? [y,n,l,c,b,s,q,?]
>
 
이전과 마찬가지로 edgedb는 schema 파일을 분석하고 현재 내부 schema와 비교를 합니다. 그리고 우리가 변경한것을 감지하고 그것을 확인 받는 과정을 거치게 됩니다. 이 과정은 모든 변경사항을 확인하고 migrations이 애매한 경우 (property의 값이 변경된 경우) 우리에게 가이드를 제공합니다.
현재 경우에는 y를 눌러 변경 확인을 해줍니다.
> edgedb migration create
did you make property 'title' of object type 'default::Movie' required? [y,n,l,c,b,s,q,?]
> y
Please specify an expression to populate existing objects in order to make property 'title' of object type 'default::Movie' required:
fill_expr>
 
fill_expr 이라는 새로운 prompt가 열렸습니다. 그 이유는 title이 optional에서 required로 변경되었기 때문에 edgeDB가 title에 대한 default value를 묻는 것 입니다. 여기서는 “untitled”로 진행하겠습니다.
Please specify an expression to populate existing objects in order to make property 'title' of object type 'default::Movie' required:
fill_expr> "Untitled"
Created dbschema/migrations/00002.edgeql, id: m1faattezah627k544elwato3m4dgjbyyz3nqn2huxeovh2luv4eua
 
 새롭게 생성된 migration 파일을 보면 아래 내용이 있습니다.
  ALTER TYPE default::Movie {
      ALTER PROPERTY title {
          SET REQUIRED USING ('Untitled');
      };
  };
 
이제 새로운 migration을 적용해 봅시다.
> edgedb migrate
Applied m1faattezah627k544elwato3m4dgjbyyz3nqn2huxeovh2luv4eua (00002.edgeql)
 

5. Query 작성하기

이제 Edgedb ui를 통해 간단한 쿼리를 작성해보겠습니다. 2.0+버전 부터는 관리자 대시보드를 포함하고 있습니다. 대시보드를 열기 위해 아래 명령어를 입력합니다.
> edgedb ui
Please visit URL:
http://localhost:10700/ui?authToken=<JWT TOKEN>
 
해당 페이지에 접속 하면 아래와 같은 페이지가 열립니다.
인스턴스에서 실행되는 각 database가 표시됩니다. 각 인스턴스는 여러 데이터베이스를 포함할 수 있습니다.
 
현재는 Edge하나 뿐이며 기본적으로 Edgedb로 되어있습니다. 클릭해봅시다.
 
Open REPL을 클릭합니다. 그러면 쿼리를 작성할 수 있는 창이 열립니다.
기본적인 Hello world! 를 출력해보기 위해 아래 쿼리를 입력합니다.
SELECT "Hello world!";
 
Query와 Query 결과는 우측 query notebook 에 보여집니다.
이제 실제 데이터를 Insert 해보겠습니다. 아래 코드를 입력해줍니다.
INSERT Movie {
  title := "Constantine"
};
첫 데이터가 Insert되었습니다! 업데이트 쿼리를 통해 몇명의 배우를 추가해봅시다.
UPDATE Movie
FILTER .title = "Constantine"
SET {
  actors := {
    (INSERT Person { name := "Keanu Charles Reeves" }),
    (INSERT Person { name := "Katherine Matilda Swinton" })
  }
};
 
마지막으로 SELECT 쿼리를 통해 방금 입력한 데이터를 가져올 수 있습니다.
SELECT Movie {
  title,
  actors: {
    name
  }
};
 
query notebook에서 결과에서 COPY AS JSON 을 누르면 clipboard에 아래와 같이 복사가 됩니다.
[
  {
    "title": "Constantine",
    "actors": [
      {
        "name": "Keanu Charles Reeves"
      },
      {
        "name": "Katherine Matilda Swinton"
      }
    ]
  }
]
 
edgedb UI는 유용하지만 실제 프로그램에서는 쿼리 실행을 위해 edgedb client librarie를 사용하게 될 것입니다.
JavaScript/TypeScript, Go, python, Rust 등의 공식 라이브러리를 제공하고 있으니 원하는 언어로 사용할 수 있습니다. ( https://www.edgedb.com/docs/clients/index )
 
수고하셨습니다! 
튜토리얼 진행을 통해 간단한 사용방법을 익히셨습니다. 자세한 내용은 기회가 된다면 마저 포스팅 할 수 있도록 하겠습니다.
 
 

 

+ Recent posts