PostgreSQL을 Git 저장소로? gitgres 프로젝트의 등장!
gitgres는 PostgreSQL을 Git의 저장소로 활용하여, Git의 핵심 기능을 데이터베이스 내에서 구현하는 프로젝트임.
Forgejo와 같은 Git 호스팅 플랫폼에서 파일 시스템 기반의 Git 저장소 관리 문제를 해결하고, 데이터베이스 통합을 통해 단일 인스턴스 배포(Single Instance Deployment)를 가능하게 함.
성능 및 저장 공간 효율성(Storage Efficiency) 측면에서 Git packfile 방식에 비해 불리하나, 운영 단순성(Operational Simplicity)을 강조하며 소규모 Git 호스팅 환경에 적합함을 시사함.
커뮤니티에서는 창의적인 시도에 대한 긍정적 평가와 함께, 벤치마크 부재에 대한 아쉬움을 표명함.
gitgres 아키텍처 및 구현 상세
gitgres는 libgit2(libgit2)의 ODB(Object Database) 및 RefDB 백엔드를 PostgreSQL에 연결하여 구현되었다. 핵심은 Git 객체(objects)와 참조(refs)를 PostgreSQL 테이블에 저장하는 것이다. 객체(objects) 테이블은 Git 객체의 내용을, 참조(refs) 테이블은 브랜치, 태그 등의 참조 정보를 관리한다. libgit2는 팩 파일(packfile) 협상, 델타(delta) 압축, 참조 광고(ref advertisement) 등의 기능을 담당하며, gitgres는 이러한 기능을 PostgreSQL 테이블에 매핑하여 Git의 핵심 기능을 구현한다.
Forgejo 통합 및 단일 인스턴스 배포
gitgres는 Forgejo와 같은 Git 호스팅 플랫폼에서 파일 시스템 기반의 Git 저장소 관리 문제를 해결한다. 기존 Forgejo는 Git 데이터를 파일 시스템에, 다른 메타데이터는 PostgreSQL에 저장하여 데이터 격리 아키텍처(Data Isolation Architecture)를 가지고 있었다. gitgres를 사용하면 모든 데이터가 PostgreSQL에 저장되어 단일 인스턴스 배포(Single Instance Deployment)가 가능해진다. 이는 백업, 복제, 모니터링을 단순화하고, 배포 및 운영 효율성을 향상시킨다.
성능 및 저장 공간 트레이드오프
gitgres는 Git packfile 방식에 비해 저장 공간 효율성 측면에서 불리하다. Git packfile은 델타 압축을 사용하여 변경된 부분만 저장하지만, gitgres는 각 객체의 전체 버전을 저장한다. PostgreSQL의 TOAST 기능을 통해 대용량 객체를 압축할 수 있지만, packfile 방식만큼 효율적이지 않다. 하지만, 소규모 Git 호스팅 환경에서는 운영 단순성(Operational Simplicity)이 저장 공간 효율성보다 더 중요할 수 있다.
커뮤니티 반응 및 벤치마크 부재
커뮤니티에서는 gitgres의 창의적인 시도에 대해 긍정적인 평가를 내리고 있다. 특히, PostgreSQL을 Git 저장소로 활용하는 아이디어에 대한 관심이 높다. 하지만, 벤치마크(Benchmarks) 부재에 대한 아쉬움도 제기되었다. 성능 비교 데이터가 없어 실제 사용 환경에서의 성능을 가늠하기 어렵다는 지적이다. 또한, libgit2의 C 바인딩(binding) 사용에 따른 잠재적인 성능 저하에 대한 우려도 존재한다.