Fastapi

Chapter 4-1 📌 EdgeDB 소개 및 설치 가이드

Chansman 2025. 5. 28. 10:17

📌 EdgeDB 소개 및 설치 가이드

1. EdgeDB란 무엇인가요?

💡 EdgeDB는 PostgreSQL 기반의 차세대 객체지향 데이터베이스입니다.

  • 유명한 Python 핵심 컨트리뷰터들이 만든 MagicStack에서 개발
  • ORM 없이도 객체 지향 방식으로 데이터 처리 가능
  • SQL을 대체하는 EdgeQL이라는 강력하고 유연한 쿼리 언어 제공
  • 성능 면에서도 뛰어나며, 코드 자동 생성, 공식 유튜브와 오픈 채팅 등 지원 커뮤니티도 활발

👉 실무에선 아직 흔하진 않지만, 다양한 데이터베이스 기술을 접하고 싶은 분들에게 강력 추천됩니다.

2. EdgeDB CLI 설치 방법

💡 버전 명시 설치는 권장되지 않으며, 공식 방법 사용을 권장합니다.

특정 버전 설치 (예: 6.1.0)

  1. 내 시스템 정보 확인: uname -sm ( windows wsl : Linux x86_64)
  2. https://packages.edgedb.com/archive/ 에서 내 시스템에 맞는 CLI 파일 다운로드
  3. x86_64-unknown-linux-gnu/ 선택 / 현재없음 
  4. 설치 명령 실행
chmod +x edgedb-cli-6.1.0+...
./edgedb-cli-6.1.0+... self-install
  1. 보안 경고 시: "Allow Anyway" 클릭 후 재실행
  2. edgedb --version 으로 설치 확인

3. VSCode + EdgeQL 플러그인 설치

4. 프로젝트 초기화 및 마이그레이션

edgedb project init

타입 정의 (dbschema/default.esdl)

module default {
    type Person {
        required name: str;
    }
    type Movie {
        title: str;
        multi actors: Person;
    }
}
  • type = MySQL의 table
  • required = NOT NULL
  • 관계 설정: multi 또는 single로 다대다/일대다 정의 가능

마이그레이션 실행

edgedb migration create
edgedb migrate

5. EdgeDB UI로 CRUD 실습

# insert
insert Movie { title := "Dune" };

# update
update Movie
filter .title = "Dune"
set {
  actors := {
    (insert Person { name := "Timothee Chalamet" }),
    (insert Person { name := "Zendaya" })
  }
};

# select
select Movie {
  title,
  actors: { name }
};

# delete
DELETE Movie filter .title = "Dune";

실습 예제: insert → 곧바로 select

SELECT (
  INSERT Movie {
    title := "Incredible"
  }
) {id, title};

select 결과 기반 insert

INSERT Person {
  name := "황정민"
};

INSERT Person {
  name := "이정재"
};

INSERT Movie {
  title := "국제시장",
  actors := (
    SELECT Person
    FILTER .name = "황정민"
  )
};

6. 인덱스 추가 및 쿼리 성능 분석

인덱스 정의

type Movie {
  title: str;
  multi actors: Person;
  index on (.title);
}
edgedb migration create
edgedb migrate

쿼리 성능 측정

edgedb analyze 'select Movie {id, title} filter .title = "a"' --expand

더미 데이터 대량 생성

FOR x IN range_unpack(range(1, 100000)) UNION (
    INSERT Movie {
        title := "Movie " ++ <str>x
    }
);
  • 작은 데이터셋: SeqScan
  • 큰 데이터셋: BitmapIndexScan으로 인덱스 사용 확인 가능

🎯 인덱스 정리:

  • 데이터 적으면 인덱스 안 쓰고 테이블 스캔할 수 있음
  • 인덱스가 있다고 항상 사용되는 건 아님 (쿼리 플래너가 판단)
  • 대규모 트래픽 시스템에서는 인덱스 필수!

7. 스키마 초기화 및 정리

  • default.esdl 파일 비우고 다시 마이그레이션
edgedb migration create
edgedb migrate

8. 철학: Everything is a Set

EdgeDB에서는 모든 쿼리 결과는 Set으로 반환됩니다.

  • NULL이 없고, 존재하지 않는 값을 의미하는 값이 없음
  • 더 명확하고 예측 가능한 데이터 처리 가능

🧠 참고: NULL 개념을 만든 토니 호어도 이를 "Billion Dollar Mistake"라 평가했음


이제 EdgeDB의 기본 구조와 실습 방법을 익혔다면, 실무 프로젝트에 응용할 차례입니다! 🚀