기술

Neo4j를 깔았는데 DB를 하나밖에 못 만든다고요?

2026.03.227분 읽기

RAG 프로젝트에서 이메일 데이터 간의 관계를 저장할 그래프 데이터베이스가 필요했습니다. 여러 선택지 중에서 Neo4j를 골랐고, Neo4j Desktop을 설치해서 개발을 시작했습니다. 처음엔 별 문제가 없었습니다.

DB를 하나 더 만들고 싶었을 뿐인데

문제는 프로젝트가 하나 더 생기면서 시작됐습니다. 기존 프로젝트 데이터와 섞이지 않게 DB를 분리하고 싶었거든요. "그냥 데이터베이스 하나 더 만들면 되는 거 아닌가?" 싶었는데, 막상 해보니까 안 됩니다. Neo4j Community Edition은 활성 데이터베이스를 하나만 허용하더라고요. 기본으로 만들어지는 neo4j 데이터베이스 하나가 전부입니다. 이게 무료 버전의 한계라는 걸 이때 처음 알았습니다.


Community와 Enterprise는 뭐가 다른가

그래서 Community Edition과 Enterprise Edition의 차이를 찾아봤습니다. 핵심만 정리하면 이렇습니다.

아파트를 생각하면 이해가 쉽습니다. Community Edition은 원룸입니다. 방이 하나라서 살림을 전부 한 공간에 넣어야 합니다. Enterprise Edition은 방이 여러 개인 아파트입니다. 프로젝트별로 방을 나눠 쓸 수 있고, 방마다 잠금장치도 다르게 걸 수 있습니다. 다만 이 아파트는 월세가 상당합니다.

실제로 차이가 나는 부분을 정리하면 크게 세 가지입니다. 첫째, 멀티 데이터베이스 지원. Community는 안 되고 Enterprise는 됩니다. 이게 가장 큰 차이입니다. 둘째, 역할 기반 접근 제어. Enterprise는 사용자별로 권한을 다르게 줄 수 있는데, Community는 기본적인 인증만 지원합니다. 셋째, 클러스터링. 대규모 서비스에서 여러 서버로 분산 운영하려면 Enterprise가 필요합니다. 하지만 솔직히 개인 개발자나 소규모 프로젝트에서 Enterprise 라이선스를 쓰기엔 부담스럽습니다. 그렇다고 데이터를 한 DB에 다 섞을 수도 없고요.

gdh-2026-03-22T05-35-36.png

Docker가 답이었다

결론부터 말하면, Docker로 Neo4j를 띄우는 게 현실적인 해법이었습니다.

비유를 이어가면 이렇습니다. Enterprise라는 비싼 아파트를 빌리는 대신, 원룸을 여러 채 빌리는 겁니다. Docker 컨테이너 하나가 독립된 Neo4j 인스턴스 하나입니다. 프로젝트 A용 컨테이너, 프로젝트 B용 컨테이너를 따로 띄우면 각각 완전히 분리된 환경이 됩니다. 포트도 다르고, 데이터도 섞이지 않습니다.

Neo4j Desktop과 비교하면 장점이 명확합니다. 환경을 그대로 재현할 수 있고, 팀원에게 설정 파일 하나만 공유하면 똑같은 환경을 띄울 수 있습니다. 나중에 서버에 배포할 때도 Docker 기반이면 전환이 훨씬 수월하고요.

gdh-2026-03-22T06-09-02.png


컨테이너는 휘발된다 — 볼륨을 반드시 연결해야 하는 이유

Docker로 전환하고 나서 한 가지 더 알게 된 게 있습니다. 컨테이너는 기본적으로 휘발성이라는 겁니다.

칠판을 생각하면 됩니다. 컨테이너 안에 저장된 데이터는 칠판에 적은 것과 같습니다. 컨테이너를 삭제하거나 다시 만들면, 칠판을 지우는 것처럼 데이터가 전부 사라집니다. 반면에 볼륨은 노트북입니다. 칠판에 적은 내용을 노트북에도 같이 적어두는 거죠. 칠판을 아무리 지워도 노트북에는 그대로 남아 있습니다.

사실 이걸 모르고 컨테이너를 재생성했다가 데이터를 날릴 뻔한 적이 있습니다. 다행히 테스트 데이터였지만, 운영 데이터였으면 큰일 날 뻔했습니다. Docker로 데이터베이스를 띄울 때는 볼륨 마운트가 선택이 아니라 필수입니다. 호스트 디렉토리에 볼륨을 연결해두면 컨테이너를 날려도 데이터는 로컬 폴더에 그대로 남아 있고, 백업도 그 폴더를 복사하면 끝입니다. 별도의 export 과정이 필요 없습니다.

gdh-2026-03-22T06-11-59.png


실제 Docker 구성

실제로 프로젝트 두 개를 분리해서 띄운 docker-compose.yml 구성은 이렇습니다.

services:
  neo4j-project-a:
    image: neo4j:5-community
    ports:
      - "7474:7474"
      - "7687:7687"
    volumes:
      - ./neo4j-data/project-a:/data
    environment:
      - NEO4J_AUTH=neo4j/password-a

  neo4j-project-b:
    image: neo4j:5-community
    ports:
      - "7475:7474"
      - "7688:7687"
    volumes:
      - ./neo4j-data/project-b:/data
    environment:
      - NEO4J_AUTH=neo4j/password-b

포인트는 세 가지입니다. 포트를 프로젝트별로 다르게 매핑하고(7474/7687 vs 7475/7688), 볼륨도 각각 다른 폴더에 연결하고(project-a, project-b), 인증 정보도 분리합니다. 이러면 하나의 컴퓨터에서 완전히 독립된 Neo4j 두 대가 돌아가는 셈입니다.


그래서 뭘 바꿨나

현재 RAG 프로젝트의 Neo4j를 전부 Docker 기반으로 전환했습니다. 볼륨은 프로젝트별 폴더로 나눠서, 백업이 필요하면 해당 폴더를 통째로 복사하면 됩니다. 마침 Qdrant(벡터 DB)도 Docker로 띄우고 있었기 때문에 docker-compose.yml 하나에 Neo4j와 Qdrant를 같이 정의했습니다. 이제 개발 환경 전체를 docker-compose up 한 줄로 띄울 수 있습니다. 새 프로젝트가 생기면 서비스 블록 하나만 추가하면 되고요.


마무리

Neo4j를 처음 쓸 때는 그냥 설치하면 끝이라고 생각했습니다. 막상 프로젝트가 늘어나니까 Community Edition의 단일 DB 제한에 막혔고, 그제서야 에디션 차이를 들여다보게 됐습니다. Enterprise로 가면 해결되지만 비용이 부담스럽고, Docker로 인스턴스를 분리하면 무료로 같은 효과를 낼 수 있었습니다.

다만 하나 더 — Docker 컨테이너는 휘발성이라, 볼륨을 안 걸어두면 데이터가 통째로 날아갑니다. 이것까지 세팅해야 비로소 "운영 가능한 상태"가 되는 거였습니다. Neo4j 설치하고 끝인 줄 알았는데, 결국 에디션 차이 → Docker 전환 → 볼륨 백업까지 와야 진짜 쓸 수 있는 환경이 되더라고요.

#Neo4j#Docker#Neo4jCommunityEdition#Neo4jEnterprise#그래프데이터베이스#docker-compose#Docker볼륨#데이터백업#AI전환기#프로젝트연대기