fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agent 페이지로 이동
    • langgraph 페이지로 이동
    • 사람용 CLI와 AI 에이전트용 CLI는 설계가 다르다
    • agents.md
    • Claude Code 메모리: CLAUDE.md와 .claude/rules를 규칙으로 쓰는 법
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    • Claude Code를 11일 동안 쓴 결과 — 데이터로 본 나의 사용 패턴
    • Claude Code 멀티 에이전트 — Teams
    • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    • Docling — IBM Research 의 문서 파싱 toolkit 상세 정리
    • 하네스 엔지니어링 실전 — 4인 에이전트 팀으로 코딩 파이프라인 구축하기
    • 하네스 엔지니어링 — 오래 실행되는 AI 에이전트를 위한 설계
    • 멀티모달 LLM (Multimodal Large Language Model)
    • AI 에이전트와 함께 MVP 만들기 — dooray-cli 사례
    • 온톨로지에서 코딩 에이전트 컨텍스트까지 — 클래스·관계 설계와 그래프 평가
    • OpenClaw는 context와 memory를 어떻게 관리하나 — 나만의 에이전트를 구성하는 법
    • OpenClaw vs Hermes Agent — 갈아탈까 고민하며 정리한 비교
  • ai 페이지로 이동
    • agent 페이지로 이동
    • [초안] AI 제품 백엔드 안정성 — 지연·비용·권한·관측·도구 실패·폴백/재시도/사람 에스컬레이션
    • [초안] LLM 평가 프레임워크: 골든셋, 회귀 테스트, LLM-as-a-judge, 사람 피드백 루프
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • architecture 페이지로 이동
    • 시니어 백엔드를 위한 API 설계 실전 스터디 팩
    • API 버저닝과 하위 호환성: 모바일·외부 컨슈머까지 안전하게 진화시키기
    • 캐시 설계 전략 총정리
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 도메인 모델링: 주문·재고·노출의 세 축을 분리해서 설계하기
    • 커머스 주문 상태와 데이터 정합성 기본기
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] Event Sourcing과 CQRS — 상태가 아니라 변화를 저장한다는 발상
    • [학습중] 금융 거래 취소·정정·대사·일마감 운영
    • [학습중] 금융 거래 상태와 원장 설계
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리
    • [초안] F&B 주문/매장/픽업 상태머신 설계
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 대규모 회원과 메가 프로모션을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [학습중] 모듈러 모놀리스에서 MSA로 점진 전환하는 실습
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] Spring Batch vs Event-Driven — 같은 비동기처럼 보이지만 전혀 다른 두 패러다임
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • milvus 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • qdrant 페이지로 이동
    • redis 페이지로 이동
    • vespa 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • [초안] DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 한국어 형태소 분석기 Nori vs Lindera — OpenSearch에서 Milvus로 갈 때 어휘 검색은 유지되나
    • 벡터 DB 5종, 아키텍처는 어떻게 다른가
    • 벡터 DB 5종을 실제로 벤치마크했다 — 같은 recall에서 QPS는 얼마나 갈리나
    • 벡터 DB 어떻게 고를까 — OpenSearch · Milvus · Qdrant · Vespa · pgvector 비교
    • 벡터 DB를 실제로 도입한 사례 — 빅테크 프로덕션
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • [초안] 운영 데이터 정합성 장애 대응 — 결제 취소 누락과 중복 적재 런북
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
    • [초안] 시니어 백엔드를 위한 SLO와 Error Budget 기반 장애 대응
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS는 어떻게 안전한가 — TLS, 인증서, 그리고 termination
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 캐시 정합성 / 12일 AI 웹툰 MVP
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • testing 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • [초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • npm vs pnpm — 어떤 기준으로 선택했나
    • `setImmediate()`
  • kafka 페이지로 이동
    • [초안] Kafka 기본 개념 — 토픽, 파티션, 오프셋, 복제
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • [초안] Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • [학습중] Kafka 파티션·리밸런스·컨슈머 지연 운영
    • 메시지 전송 신뢰성
    • [초안] Spring Kafka 컨슈머 오프셋 커밋과 트랜잭션 정렬: AckMode, manual ack, 멱등 처리
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • mlops 페이지로 이동
    • llm-serving 페이지로 이동
    • serving-frameworks 페이지로 이동
    • Python CUDA 버전 생태계 — nvidia-smi, nvcc, pip, conda가 다 다른 버전을 말하는 이유
    • GPU 컨테이너의 CUDA 버전 호환성 — nvidia-smi부터 이미지 다이어트까지
    • Kubernetes GPU 노드에서 /run tmpfs가 꽉 차서 Pod가 안 뜰 때
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • 한 GPU 를 여러 프로세스가 나눠 쓰기 — Time-Slicing 과 MPS
  • network 페이지로 이동
    • Connection reset by peer는 누가 보낸 걸까 — 리버스 프록시 홉마다 TCP 연결은 따로 논다
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ThreadLocal 에서 contextvars 로 — Python 의 요청 컨텍스트 전파
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • resume 페이지로 이동
    • [초안] 김병태 경력기술서
    • [초안] 김병태 포트폴리오
  • security 페이지로 이동
    • [초안] 시니어 백엔드를 위한 보안 / 인증 스터디 팩 — Spring Security, JWT, OAuth2, OWASP Top 10
    • [초안] Spring Security 6.x OAuth2 + JWT 상용 인증 설계 — Grant 선택, Resource Server, Refresh Rotation, 로그아웃
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • testing 페이지로 이동
    • [초안] 시니어 Java 백엔드를 위한 테스트 전략 완전 정리 — 피라미드부터 TestContainers, 마이크로벤치, Contract까지
  • thinking 페이지로 이동
    • 좋은 일을 넘어 중요한 일을 하는 법
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • Glossary↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/AI/권한·최신성·성능을 포함한 Neo4j 운영 …
aidb

권한·최신성·성능을 포함한 Neo4j 운영 설계

운영 설계의 결론은 학습 환경과 제품 환경을 분리하는 것이다. Neo4j Community Edition은 로컬 학습과 단일 인스턴스 실습에 충분할 수 있지만, 사내 컨텍스트 제공자가 권한, 가용성, 백업, 운영 보안을 요구하면 Enterprise 또는 Aura 기능 범위를 따로 검토해야 한다. Text2Cypher는 특히 조심해야 한다. 읽기 전용 권한,...

2026.07.30·9 min read·9 views

운영 설계의 결론은 학습 환경과 제품 환경을 분리하는 것이다. Neo4j Community Edition은 로컬 학습과 단일 인스턴스 실습에 충분할 수 있지만, 사내 컨텍스트 제공자가 권한, 가용성, 백업, 운영 보안을 요구하면 Enterprise 또는 Aura 기능 범위를 따로 검토해야 한다.

Text2Cypher는 특히 조심해야 한다. 읽기 전용 권한, 허용 쿼리, 시간 제한 없이 자연어를 Cypher로 바꾸는 기능을 운영 도구로 노출하면 안 된다.

이 글은 세 질문을 따라간다.

  • Community 학습 환경과 Enterprise 또는 Aura 운영 환경은 무엇이 다른가?
  • 권한, 최신성, 성능, 백업은 컨텍스트 제공자에서 어떤 실패를 막는가?
  • APOC, GDS, n10s는 언제 선택 사항으로 붙이고 언제 미뤄야 하는가?

가져갈 판단 기준은 세 가지다.

  • 운영 요구가 권한 분리, 고가용성, 백업, LDAP 같은 기능을 요구하면 에디션과 배포 방식을 먼저 확인한다.
  • Text2Cypher는 읽기 전용, 허용 목록, 시간 제한, 결과 제한, 감사 로그가 없으면 운영 경로에서 제외한다.
  • APOC, GDS, n10s는 기본 구성요소가 아니라 필요한 실패를 해결할 때만 선택한다.

이전 글: GraphRAG 평가와 벡터 RAG 제거 실험

학습 환경과 운영 환경을 나눈다

로컬 학습에서는 Neo4j Community Edition이나 임시 Aura 인스턴스로 시작할 수 있다. 목표는 모델링, 인덱스, Cypher, 검색기 경계를 손으로 확인하는 것이다.

운영 환경은 목표가 다르다. 사내 문서 권한, 감사 가능성, 장애 복구, 백업, 쿼리 제한, 모니터링을 다뤄야 한다.

구분학습 환경운영 환경
배포로컬 단일 인스턴스, 임시 AuraEnterprise 또는 운영용 Aura tier 검토
권한애플리케이션 선필터 중심DB 권한과 애플리케이션 ACL을 함께 검토
가용성재시작 허용백업, 복구, 장애 대응 필요
데이터샘플 문서실제 권한과 최신성 메타데이터
튜닝EXPLAIN, 제한된 PROFILE쿼리 계획, 지연, 비용, 장애율 추적

Neo4j 공식 Operations Manual은 Community Edition을 단일 인스턴스에 적합한 학습·소규모 용도로 설명하고, Enterprise Edition은 백업, 클러스터링, 장애 조치, 역할 기반 접근 제어 같은 운영 요구를 포함한다고 설명한다. Aura는 관리형 배포 선택지지만 tier별 기능 범위를 확인해야 한다.

운영 실패는 검색 품질 밖에서 터진다

GraphRAG 품질이 좋아도 운영 실패가 있으면 사내 도구로 쓸 수 없다.

운영 축막으려는 실패
인증과 권한권한 밖 문서, 저장소, 장애 정보 노출
최신성폐기된 ADR이나 오래된 runbook 사용
쿼리 제한관계 확장 폭발, 장시간 쿼리
출처 보존답변은 맞지만 원문 근거를 찾을 수 없음
백업과 복구재적재 불가, 인덱스 손상, 삭제 사고
관측품질 저하 원인과 지연 병목을 찾지 못함

운영 설계는 검색 알고리즘을 고르는 일이 아니다. 컨텍스트 제공자가 실패할 때 어떤 피해가 생기는지 먼저 정하는 일이다.

읽기 계정과 쓰기 계정을 분리하면 사고 범위가 줄어든다. 컨텍스트 제공자는 검색 요청 중 그래프를 바꾸지 않는다. 적재와 정규화는 별도 파이프라인에서 실행한다.

권한 설계

운영 권한은 두 층으로 나눈다.

먼저 애플리케이션에서 사용자 권한을 allowed_source_uris, allowed_service_ids, allowed_repository_ids 같은 범위로 계산한다. 그다음 Neo4j 계정은 읽기 전용 최소 권한으로 제한한다.

현재 공식 neo4j-graphrag의 하이브리드 검색기는 사전 필터를 지원하지 않는다. 따라서 애플리케이션이 권한 목록을 계산했다는 사실만으로 후보 단계의 ACL이 보장되지는 않는다. 접근 범위별 검색 공간, Neo4j 하위 그래프 권한, 사용자 정의 검색기 중 하나가 후보 생성 전에 적용되어야 한다.

Neo4j Enterprise와 Aura의 역할 기반 접근 제어는 역할과 권한으로 데이터베이스 작업 범위를 제어한다. 공식 문서는 최소 권한 원칙을 강조하고, GRANT, DENY, REVOKE로 권한을 관리한다고 설명한다.

학습용 Community 환경에서는 운영 수준의 RBAC를 전제로 하지 않는다. 대신 다음을 실습한다.

  • 필터 가능한 단일 범위 속성으로 VectorCypherRetriever 후보를 제한한다.
  • 하이브리드 검색은 접근 가능한 문서만 포함한 별도 검색 공간에서만 실행한다.
  • 최종 출력 직전에 source_uri를 다시 검사한다.
  • 권한 밖 후보가 얼마나 제거됐는지 추적 로그에 남긴다.
  • 권한 때문에 답할 수 없는 경우 answerable=false로 반환한다.

운영 환경에서는 DB 계정의 권한, 애플리케이션 ACL, 문서 원천 시스템의 권한 동기화가 서로 어긋나지 않는지 별도로 테스트한다.

Text2Cypher 운영 제한

공식 Text2CypherRetriever는 자연어를 Cypher로 바꿔 실행한다. 이 기능은 구조화된 질문에 유용할 수 있지만, 운영 기본 경로로 두기에는 위험하다.

최소 제한은 다음과 같다.

제한이유
읽기 전용 DB 계정생성 쿼리가 쓰기 작업을 해도 실행되지 않아야 한다
쿼리 검증허용한 읽기 패턴과 프로시저만 통과시킨다
데이터베이스 권한문자열 우회를 막는 최종 방어선으로 읽기 권한만 부여한다
시간 제한장시간 탐색과 카티전 곱을 막는다
결과 제한거대한 결과가 LLM 입력과 네트워크를 채우지 않게 한다
감사 로그생성된 Cypher, principal, source scope, 실행 시간을 추적한다

이 제한이 없다면 Text2Cypher는 운영 경로가 아니라 실험 경로다. 키워드 블랙리스트만으로는 주석이나 표현 변형을 포함한 모든 우회를 막을 수 없다. 관계형 질문의 기본 경로는 사람이 작성한 제한된 검색 쿼리로 시작한다. HybridCypherRetriever는 접근 범위가 이미 분리된 검색 공간에서만 사용한다.

최신성 운영

최신성은 ingestion 파이프라인과 컨텍스트 제공자가 같이 책임진다.

문서에는 최소한 다음 메타데이터가 필요하다.

  • source_uri
  • source_version
  • updated_at
  • ingested_at
  • valid_from
  • valid_to
  • superseded_by
  • acl_version

컨텍스트 제공자는 검색 점수와 별도로 최신성 상태를 계산한다.

상태운영 처리
current기본 근거로 사용
stale최신 근거가 있으면 제외하거나 경고와 함께 낮춘다
unknown확정 답변이 아니라 불확실한 근거로 표시한다

문서 원천에서 삭제된 문서도 중요하다. 삭제가 색인과 그래프에 반영되지 않으면, 에이전트는 더 이상 존재하지 않는 문서를 근거로 답할 수 있다. 삭제 이벤트와 재적재 작업은 최신성 평가의 일부로 본다.

성능과 쿼리 계획

관계 탐색은 쉽게 비싸진다. 특히 후보에서 시작해 여러 관계를 선택 없이 따라가면, 컨텍스트 조립 전에 이미 결과가 폭발한다.

성능 확인은 세 단계로 한다.

  1. EXPLAIN으로 계획과 인덱스 사용 여부를 본다.
  2. 격리된 읽기 쿼리에만 PROFILE을 사용해 실제 DB hits와 rows를 본다.
  3. 애플리케이션 추적 로그에서 p50, p95, 시간 제한, 결과 수, 토큰 수를 기록한다.

PROFILE은 쿼리를 실제 실행한다. 따라서 쓰기 쿼리나 운영 데이터에 무심코 붙이지 않는다. 컨텍스트 제공자 계정이 읽기 전용이어야 하는 이유도 여기에 있다.

관계 확장 쿼리에는 기본 제한을 둔다.

  • 시작 후보 수 제한
  • 관계 타입 허용 목록
  • 최대 hop 제한
  • LIMIT과 정렬 기준
  • source scope 조건
  • 시간 제한

인덱스와 제약

운영에서 인덱스는 성능만이 아니라 실패를 빨리 드러내는 장치다.

대상권장 제약 또는 인덱스
Service.service_id유일성 제약
API.api_id유일성 제약
Repository.repository_id유일성 제약
Document.source_uri유일성 제약
Chunk.chunk_id유일성 제약
Chunk.embedding벡터 인덱스
Chunk.text전문 인덱스

Neo4j 벡터 인덱스는 Community와 Enterprise 모두에서 사용할 수 있지만, 서버 버전과 저장 형식에 따라 세부 기능이 달라진다. 예를 들어 최신 문서에서는 LIST<INTEGER | FLOAT>와 VECTOR 속성, SEARCH 절, 필터 지원의 버전 경계를 따로 설명한다.

운영 문서에는 실제 서버 버전, Cypher 버전, 인덱스 이름, 임베딩 차원, 유사도 함수, 재색인 절차를 남긴다.

APOC, GDS, n10s는 선택 사항이다

세 도구는 유용하지만 기본값으로 붙일 이유는 없다.

도구쓸 때미룰 때
APOC CoreJSON 적재, 변환, graph refactoring, 유틸리티 프로시저가 필요할 때Cypher와 애플리케이션 코드로 충분할 때
GDS커뮤니티 탐지, 중심성, 그래프 임베딩, 링크 예측이 평가 질문에 필요할 때단순 관계 탐색과 근거 회수만 필요할 때
n10sRDF, OWL, SKOS, SHACL 연동이 실제 요구일 때속성 그래프 모델과 애플리케이션 검증으로 충분할 때

공식 APOC 문서는 APOC Core가 Neo4j에서 지원되는 라이브러리이고, APOC Extended는 커뮤니티 유지보수 영역이라고 구분한다. 또한 일부 APOC 프로시저는 Neo4j 메모리 추적에 잡히지 않을 수 있으므로 주의가 필요하다고 설명한다.

GDS는 그래프 알고리즘과 머신러닝 파이프라인을 제공한다. Community Edition도 알고리즘을 포함하지만, 동시성, 카탈로그, 모델 관리 기능에는 제한이 있다. 따라서 운영 검색 경로에 GDS를 붙이기 전에 정말 평가 지표가 좋아지는지 제거 실험으로 확인한다.

n10s는 RDF와 온톨로지, SHACL, 기본 추론이 필요할 때 검토한다. 공식 안내 기준으로 n10s 플러그인은 자체 운영 Neo4j에서 사용할 수 있고 Aura에서는 사용할 수 없다. 이 시리즈의 기본 모델은 Neo4j 속성 그래프이므로, RDF 호환성이 요구되기 전에는 선택 사항으로 둔다.

장애 대응과 재적재

운영 컨텍스트 제공자에는 재적재와 롤백 계획이 필요하다.

장애 시나리오는 다음처럼 나눠둔다.

장애증상대응
인덱스 미완료검색 결과가 비거나 느리다SHOW INDEXES로 상태 확인, 준비 전 트래픽 차단
잘못된 entity merge다른 서비스의 근거가 섞인다merge 규칙 롤백, affected claim 재계산
stale 문서폐기된 ADR이 반환된다source sync 재실행, superseded_by 확인
ACL 동기화 지연권한 변경이 반영되지 않는다ACL 버전 비교, 캐시 무효화
쿼리 폭주timeout과 DB 부하 증가관계 타입과 hop 제한 강화

재적재는 전체 삭제 후 재생성만으로 설계하지 않는다. 문서 단위 재처리, claim 단위 무효화, 인덱스 재생성, 이전 버전 복구 경로를 나눠야 한다.

실습

실습 목표는 학습용 Community 환경에서 운영 요구를 흉내 내고, Enterprise 또는 Aura가 필요한 요구를 별도 표로 분리하는 것이다.

재현 가능한 단계

  1. 로컬 Neo4j에 읽기 계정과 적재 계정을 논리적으로 분리한다고 가정하고 애플리케이션 설정을 나눈다.
  2. 컨텍스트 제공자에는 읽기 전용 driver 설정만 연결한다.
  3. 사용자별 acl_partition을 다르게 적용한 벡터 후보와 접근 범위별 하이브리드 검색 공간을 비교한다.
  4. EXPLAIN으로 핵심 검색 쿼리의 계획을 확인한다.
  5. 격리된 샘플 데이터에서만 PROFILE로 DB hits와 rows를 기록한다.
  6. 오래된 ADR과 최신 ADR을 함께 넣고 freshness 판정을 확인한다.
  7. Text2Cypher 경로를 만든다면 쿼리 검증, 읽기 전용 권한, 시간 제한 테스트를 먼저 실패 사례로 작성한다.
  8. 운영 요구 표에 Community로 가능한 것과 Enterprise 또는 Aura 검토가 필요한 것을 나눈다.

확인할 결과

권한이 다른 사용자는 서로 다른 근거를 받아야 한다. 오래된 문서는 stale 또는 제외로 처리되어야 한다. 핵심 검색 쿼리는 인덱스를 사용하는 계획을 보여야 한다. Text2Cypher는 허용하지 않은 쿼리를 실행하지 않아야 한다.

실패 판정

다음 중 하나라도 나오면 실패다.

  • 컨텍스트 제공자 계정이 쓰기 권한을 가진다.
  • 권한 밖 source_uri가 출력된다.
  • 하이브리드 retrieval query의 후처리를 후보 선필터로 취급한다.
  • Text2Cypher가 금지 키워드나 제한 없는 관계 탐색을 실행할 수 있다.
  • PROFILE을 쓰기 쿼리나 운영 데이터에 무심코 적용한다.
  • Community 학습 환경에서 가능한 기능과 Enterprise 또는 Aura 운영 기능을 구분하지 않는다.
  • APOC, GDS, n10s를 필요성 평가 없이 기본 의존성으로 넣는다.

참고 링크

  • Neo4j Operations Manual - Introduction and editions: https://neo4j.com/docs/operations-manual/current/introduction/
  • Neo4j Operations Manual - Authentication and authorization: https://neo4j.com/docs/operations-manual/current/authentication-authorization/
  • Neo4j Operations Manual - Role-based access control: https://neo4j.com/docs/operations-manual/current/authentication-authorization/manage-privileges/
  • Neo4j Cypher Manual - Query plans: https://neo4j.com/docs/cypher-manual/current/planning-and-tuning/execution-plans/
  • Neo4j Cypher Manual - Vector indexes: https://neo4j.com/docs/cypher-manual/current/indexes/semantic-indexes/vector-indexes/
  • Neo4j Cypher Manual - Full-text indexes: https://neo4j.com/docs/cypher-manual/current/indexes/semantic-indexes/full-text-indexes/
  • APOC Core Documentation: https://neo4j.com/docs/apoc/current/
  • APOC Core Introduction: https://neo4j.com/docs/apoc/current/introduction/
  • Neo4j Graph Data Science Manual: https://neo4j.com/docs/graph-data-science/current/
  • Neo4j neosemantics: https://neo4j.com/labs/neosemantics/
  • Neo4j GraphRAG RAG guide: https://neo4j.com/docs/neo4j-graphrag-python/current/user_guide_rag.html

이어서 읽기

  • 이전 글: GraphRAG 평가와 벡터 RAG 제거 실험
  • 함께 읽기: RAG를 평가에서 역설계하기
  • 함께 읽기: 온톨로지에서 코딩 에이전트 컨텍스트까지
on this page
  • 01학습 환경과 운영 환경을 나눈다
  • 02운영 실패는 검색 품질 밖에서 터진다
  • 03권한 설계
  • 04Text2Cypher 운영 제한
  • 05최신성 운영
  • 06성능과 쿼리 계획
  • 07인덱스와 제약
  • 08APOC, GDS, n10s는 선택 사항이다
  • 09장애 대응과 재적재
  • 10실습
  • 재현 가능한 단계
  • 확인할 결과
  • 실패 판정
  • 11참고 링크
  • 12이어서 읽기
tags
#심화

이런 글도

  • GraphRAG 평가와 벡터 RAG 제거 실험
    GraphRAG 평가는 "답이 맞았다" 하나로 끝나면 안 된다. 이 글의 결론은, 그래프 구축 품질, 후보와 근거 회수, 최종 컨텍스트 정밀도와 재현율, 출처·최신성·권한·지연·비용을 단계별로 나누고, 반드시 벡터 전용 기준선과 제거 실험으로 비교해야 한다는 것이다. 그래프를 만들었다는 사실은 성공 기준이 아니다. 벡터 RAG가 놓친 관계형 질문에서, 권한...
    🤖 ai
    ai
    2026.07.30
  • 에이전트를 위한 Neo4j 컨텍스트 제공자 설계
    컨텍스트 제공자는 검색기를 감싼 얇은 함수가 아니다. 이 글의 결론은, 사내 에이전트에 붙이는 Neo4j 컨텍스트 제공자는 읽기 전용 도구이며 ACL 선필터, 출처, 최신성, 토큰 예산, 시간 제한, 출력 계약을 함께 보장해야 한다는 것이다. 그래프 탐색은 유용하지만 위험도 크다. 관계 경로가 답처럼 보일수록, 그 경로를 누가 볼 수 있고 어떤 원문이 지지...
    🤖 ai
    ai
    2026.07.30
  • 벡터·전문·그래프 탐색을 결합한 하이브리드 검색
    벡터 검색만으로 놓치는 질문은 대부분 "가까운 문장"이 아니라 "연결된 사실"을 요구한다. 이 글의 결론은 단순하다. Neo4j GraphRAG의 하이브리드 검색은 벡터와 전문 검색으로 후보를 넓히고, VectorCypherRetriever나 HybridCypherRetriever로 관계를 확장한 뒤, 최종 컨텍스트는 반드시 원문 Document와 Chun...
    🤖 ai
    ai
    2026.07.30
  • 문서에서 근거를 보존한 지식 그래프 구축하기
    Neo4j GraphRAG Python의 KG Builder는 문서를 그래프로 만드는 출발점이지만, 아직 실험적 기능이다. 그래서 이 글의 목표는 패키지를 믿고 맡기는 것이 아니라, 어떤 단계에서 어떤 품질 게이트를 끼워 넣을지 읽는 것이다. > 이전 글: Cypher, 제약, 쿼리 계획으로 검색 안정화하기 Neo4j GraphRAG Python 문서는 n...
    🤖 ai
    ai
    2026.07.30

댓글 (0)