SNS를 쓰다 보면 “아는 사람일 수도 있는 친구” 추천을 받으신 적 있으시죠? 온라인 쇼핑할 때 “이 상품을 본 고객이 함께 본 상품” 목록도 익숙하실 겁니다. 이런 똑똑한 기능들이 어떻게 작동하는지 궁금하셨나요? 비밀은 데이터베이스에 있습니다. 그런데 여러분이 아시는 일반적인 데이터베이스와는 조금 다릅니다. 바로 그래프 데이터베이스라는 것인데요, 그 중에서도 가장 널리 쓰이는 게 오늘 소개할 Neo4j입니다.

1. 그래프 데이터베이스는 왜 필요할까요?
우리가 아는 데이터베이스의 한계
엑셀을 떠올려보세요. 데이터를 표로 정리하죠. 대부분의 데이터베이스도 비슷합니다. MySQL이나 PostgreSQL 같은 데이터베이스는 데이터를 표(Table)에 저장합니다.
예를 들어 SNS 사용자 정보를 저장한다면 이렇게 됩니다:
[사용자 테이블]
ID | 이름 | 나이
1 | Alice | 28
2 | Bob | 32
3 | Carol | 25
[친구관계 테이블]
사용자1 | 사용자2
1 | 2 (Alice와 Bob)
2 | 3 (Bob과 Carol)
여기까지는 괜찮습니다. 그런데 “Alice의 친구의 친구는 누구지?”라는 질문을 하려면 어떻게 될까요? 두 표를 여러 번 연결(JOIN)해야 합니다. 단계가 깊어질수록 점점 복잡해지고 느려집니다.
실생활에서 생각해보기
지하철 노선도를 상상해보세요. 강남역에서 홍대입구역까지 가는 최단 경로를 찾으려면 어떻게 하시나요?
역들이 선으로 연결된 지도를 보고 경로를 따라가시죠. 만약 이걸 표로 표현하려고 한다면 굉장히 복잡할 겁니다. 하지만 노선도처럼 “점과 선”으로 그려놓으면 한눈에 보입니다.
그래프 데이터베이스도 똑같은 원리입니다. 데이터를 점(노드)으로, 연결을 선(관계)으로 저장하면 복잡한 관계도 쉽게 파악할 수 있습니다.
2. Neo4j의 세 가지 기본 재료
Neo4j를 이해하려면 딱 세 가지만 알면 됩니다. 어려운 개념이 아니라 우리가 일상에서 쓰는 방식 그대로입니다.
노드(Node) – 대상을 나타내는 점
노드는 하나의 대상입니다. 사람일 수도 있고, 상품일 수도 있고, 회사나 도시일 수도 있습니다.
예를 들어 Alice라는 사람을 표현한다면:
(alice:Person {
name: "Alice",
age: 28,
city: "서울"
})
여기서:
alice는 이 노드를 부르는 이름입니다 (변수명):Person은 이게 “사람”이라는 표시입니다 (레이블){...}안의 내용은 이 사람의 상세 정보입니다 (속성)
레이블은 일종의 태그라고 생각하시면 됩니다. 한 사람이 여러 역할을 할 수 있듯이, 노드도 여러 레이블을 가질 수 있습니다.
(bob:Person:Employee:Manager {name: "Bob"})
Bob은 사람이면서, 직원이면서, 동시에 관리자입니다.
관계(Relationship) – 연결을 나타내는 선
관계는 노드와 노드 사이의 연결입니다.
(alice)-[:FRIENDS_WITH {since: 2020}]->(bob)
Alice와 Bob이 친구라는 걸 나타냅니다. 화살표(->)가 보이시죠? 관계에는 방향이 있습니다.
“왜 방향이 필요한가요?” 생각하실 수 있는데, 어떤 관계는 방향이 중요합니다:
- (직원)-[:WORKS_FOR]->(회사) – 직원이 회사에서 일함
- (고객)-[:PURCHASED]->(상품) – 고객이 상품을 구매함
반면 친구 관계처럼 방향이 덜 중요한 경우도 있습니다. 그럴 땐 화살표 없이 -[:FRIENDS_WITH]- 이렇게 쓰면 양방향으로 찾을 수 있습니다.
관계에도 정보를 담을 수 있습니다. 위 예시에서 since: 2020은 “2020년부터 친구”라는 뜻입니다.
속성(Property) – 상세 정보
노드와 관계 모두 속성을 가질 수 있습니다. 속성은 그냥 추가 정보입니다.
// 사람 노드의 속성
(person:Person {
name: "Alice",
email: "alice@example.com",
interests: ["독서", "등산"]
})
// 관계의 속성
-[:ACTED_IN {
roles: ["Neo"],
salary: 10000000
}]->
날짜, 숫자, 문자, 리스트 등 다양한 타입을 저장할 수 있습니다.
3. Neo4j가 빠른 진짜 이유
“그래서 뭐가 좋은데요?”라고 물으실 수 있습니다. 핵심은 속도입니다.
관계형 데이터베이스의 방식
일반 데이터베이스는 관계를 찾을 때마다 계산을 새로 합니다. “Alice의 친구의 친구”를 찾는다면:
- Alice를 찾기 위해 사용자 테이블 검색
- Alice의 친구를 찾기 위해 친구관계 테이블 검색
- 그 친구들의 정보를 위해 다시 사용자 테이블 검색
- 그 친구들의 친구를 위해 또 친구관계 테이블 검색
- 최종 정보를 위해 또다시 사용자 테이블 검색
단계마다 큰 표 전체를 뒤져야 하니 느릴 수밖에 없습니다.
Neo4j의 방식
Neo4j는 관계가 이미 연결되어 저장되어 있습니다. 포인터를 따라가기만 하면 됩니다.
- Alice 노드 찾기 (인덱스로 빠르게)
- 연결된 친구 노드로 바로 이동 (포인터 따라감)
- 거기서 또 연결된 친구로 이동
마치 실로 연결된 구슬을 따라가듯이 바로바로 찾아갑니다.
실제로 얼마나 빠를까요?
100만 명의 사용자 데이터로 테스트한 결과입니다:
직접 친구 찾기
- MySQL: 100ms
- Neo4j: 60ms
- 차이: 그렇게 크지 않음
친구의 친구 찾기
- MySQL: 500ms
- Neo4j: 100ms
- 차이: Neo4j가 5배 빠름
3단계 관계
- MySQL: 1,800ms (거의 2초)
- Neo4j: 10ms
- 차이: Neo4j가 180배 빠름
4단계 관계
- MySQL: 11,350ms (11초 이상!)
- Neo4j: 10ms
- 차이: Neo4j가 1,135배 빠름
관계가 깊어질수록 차이가 극적으로 벌어집니다. 이게 Neo4j의 진짜 힘입니다.
4. Cypher – 그림 그리듯 쿼리 작성하기
Neo4j는 Cypher라는 자체 언어를 사용합니다. “왜 SQL을 안 쓰고 새로운 걸 배워야 하나요?”라고 생각하실 수 있는데요, Cypher를 보시면 이해가 되실 겁니다.
직관적인 문법
Cypher는 데이터의 모양을 그대로 코드로 옮겼습니다.
// 이런 그림을 상상해보세요:
// (Alice)--친구-->(Bob)--친구-->(Carol)
// Cypher로는 이렇게 씁니다:
(alice)-[:FRIENDS_WITH]->(bob)-[:FRIENDS_WITH]->(carol)
코드만 봐도 데이터 구조가 머릿속에 그려집니다. ASCII 아트 같죠?
기본 사용법
데이터 만들기:
// Keanu Reeves와 The Matrix 만들기
CREATE (keanu:Person {name: "Keanu Reeves", born: 1964})
CREATE (matrix:Movie {title: "The Matrix", released: 1999})
CREATE (keanu)-[:ACTED_IN {roles: ["Neo"]}]->(matrix)
한 번에 노드와 관계를 만들 수도 있습니다.
데이터 찾기:
// 2010년 이후 영화에 출연한 배우 찾기
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)
WHERE movie.released > 2010
RETURN actor.name, movie.title
MATCH는 패턴을 찾는 명령어입니다. “이런 모양의 데이터를 찾아줘”라고 말하는 거죠.
SQL과 비교해볼까요?
같은 작업을 SQL과 Cypher로 해보겠습니다. “The Matrix에 출연한 배우들의 다른 영화”를 찾는다면:
SQL:
SELECT DISTINCT m2.title
FROM actors a
JOIN acted_in ai1 ON a.id = ai1.actor_id
JOIN movies m1 ON m1.id = ai1.movie_id
JOIN acted_in ai2 ON ai2.actor_id = a.id
JOIN movies m2 ON m2.id = ai2.movie_id
WHERE m1.title = 'The Matrix'
AND m2.title != 'The Matrix'
JOIN을 여러 번 써야 하고, 읽기가 어렵습니다.
Cypher:
MATCH (matrix:Movie {title: "The Matrix"})
<-[:ACTED_IN]-(actor)-[:ACTED_IN]->(otherMovie)
WHERE otherMovie <> matrix
RETURN otherMovie.title
훨씬 읽기 쉽고, 데이터의 연결 구조가 그대로 보입니다.
5. Neo4j는 언제 사용하면 좋을까요?
모든 문제에 Neo4j가 정답은 아닙니다. 적재적소에 사용하는 게 중요합니다.
이럴 때 Neo4j가 빛을 발합니다
관계가 핵심인 경우
SNS를 만든다면 친구 관계, 팔로우 관계가 핵심이죠. 추천 시스템도 “이 상품을 본 사람들이 함께 본 상품”처럼 연결이 중요합니다. 이럴 때 Neo4j가 제격입니다.
여러 단계를 탐색해야 할 때
“친구의 친구의 친구”, “이 부품을 쓰는 모든 제품”, “영향력이 큰 사람” 같은 질문에 답해야 한다면 Neo4j가 훨씬 효율적입니다.
실시간 응답이 필요할 때
사기 탐지는 빠르게 의심스러운 패턴을 찾아야 합니다. 실시간 추천도 사용자가 기다리게 할 수 없죠. Neo4j의 빠른 속도가 여기서 빛납니다.
데이터 구조가 자주 바뀔 때
스타트업처럼 요구사항이 계속 바뀐다면, 엄격한 표 구조보다 유연한 그래프 구조가 편합니다.
이럴 땐 일반 데이터베이스가 나을 수 있습니다
단순한 저장/조회만 필요할 때
블로그 글을 저장하고 불러오는 것처럼 관계가 거의 없다면 굳이 Neo4j를 쓸 필요가 없습니다.
복잡한 계산과 집계가 많을 때
“전체 매출 합계”, “부서별 평균 급여” 같은 집계 연산은 일반 데이터베이스가 더 잘 합니다.
시간 순서가 중요한 로그 데이터
서버 로그, IoT 센서 데이터처럼 시간 순서로 쌓이는 데이터는 시계열 데이터베이스가 더 적합합니다.
6. 실제로 어떻게 쓰이고 있을까요?
이론만 들으면 와닿지 않으시죠? 실제 사례를 몇 가지 볼까요?
Europol – 금융 사기 추적
유럽 사법기구 Europol은 Neo4j로 복잡한 자금세탁 네트워크를 추적합니다.
사기꾼들은 돈의 흐름을 복잡하게 만들어 추적을 어렵게 합니다. A 계좌에서 B로, B에서 C로, C에서 D로… 이런 식으로 여러 계좌를 거쳐가죠.
그래프로 표현하면 이런 순환 거래 패턴이 한눈에 보입니다:
// 돈이 원형으로 도는 계좌 찾기
MATCH (account)-[:TRANSFERRED*4..8]->(account)
WHERE ALL(거래 IN 경로 WHERE 거래.금액 > 10000)
RETURN account
복잡한 연결고리도 빠르게 찾아낼 수 있어서 사기 적발률이 크게 높아졌습니다.
Walmart – 똑똑한 상품 추천
Walmart는 Neo4j로 실시간 상품 추천을 제공합니다.
개발자 Marcos Wada의 말을 빌리면: “고객 행동과 상품 간의 관계를 이해하는 데 완벽한 도구입니다.”
로직은 간단합니다. 내가 본 상품을 다른 사람들도 봤다면, 그 사람들이 구매한 다른 상품을 추천하는 거죠:
MATCH (나)-[:VIEWED]->(상품)<-[:VIEWED]-(다른사람)
-[:PURCHASED]->(추천상품)
WHERE NOT (나)-[:PURCHASED]->(추천상품)
RETURN 추천상품
ORDER BY count(다른사람) DESC
이전 시스템보다 수천 배 빠른 응답 속도로 사용자 경험이 크게 개선되었습니다.
Novartis – 신약 개발
제약회사 Novartis는 유전자, 질병, 화합물 간의 복잡한 관계를 Neo4j로 분석합니다.
“이 질병과 연관된 유전자는?” “이 유전자와 상호작용하는 다른 유전자는?” “기존 약물을 다른 질병에도 쓸 수 있을까?” 같은 질문에 답하며 신약 개발 속도를 높이고 있습니다.
7. 시작하기 – 가장 쉬운 방법
“한번 써보고 싶은데, 어떻게 시작하죠?”
Neo4j Aura Free – 1분 만에 시작하기
가장 쉬운 방법은 Neo4j Aura Free입니다. 클라우드 서비스라 설치할 필요도 없고, 완전 무료입니다.
특징:
- 신용카드 필요 없음
- 기간 제한 없음 (영구 무료)
- 5만 개 노드, 17만 개 관계까지 지원
- 24시간 자동 운영
시작 방법:
- neo4j.com/cloud/aura 접속
- “Start Free” 클릭
- 이메일로 가입 (1분)
- “Create instance” 클릭
- 비밀번호 설정 (꼭 기억하세요!)
- 30초 기다리면 준비 완료
“Open” 버튼을 누르면 Neo4j Browser가 열립니다. 여기서 바로 쿼리를 실행할 수 있습니다.
첫 쿼리 실행해보기
입력창에 이렇게 쳐보세요:
// 나 자신을 노드로 만들기
CREATE (me:Person {
name: "홍길동",
hobby: "그래프 데이터베이스 배우기"
})
RETURN me
실행 버튼(또는 Ctrl+Enter)을 누르면… 짜잔! 첫 노드가 화면에 나타납니다.
샘플 데이터로 연습하기
Neo4j Browser 왼쪽 위에 :play movie-graph라고 치면 영화 데이터베이스 튜토리얼이 나옵니다. 단계별로 따라하면서 Cypher를 배울 수 있습니다.
8. 더 배우고 싶다면
공식 학습 자료
GraphAcademy (graphacademy.neo4j.com)
- 완전 무료 온라인 강좌
- “Neo4j Fundamentals”는 60분이면 기초를 마스터할 수 있습니다
- 수료증도 발급됩니다
Cypher 매뉴얼 (neo4j.com/docs/cypher-manual)
- 궁금한 게 있을 때 찾아보는 레퍼런스
커뮤니티
- Community Forum: 질문하고 답변받기
- Discord: 실시간 대화
- Stack Overflow: 기술적 질문
혼자 공부하다 막히면 물어보세요. 커뮤니티가 활발해서 답변을 빨리 받을 수 있습니다.
마치며…
Neo4j는 데이터 간의 연결을 다루는 데 특화된 데이터베이스입니다.
엑셀처럼 표로 생각하는 게 익숙하시다면 처음엔 조금 낯설 수 있습니다. 하지만 지하철 노선도나 인간관계도를 떠올리면 오히려 더 자연스럽게 느껴질 거예요.
“친구 추천”, “상품 추천”, “사기 탐지”처럼 관계가 중요한 문제를 푼다면, Neo4j가 큰 도움이 될 겁니다. 무료로 제공되는 Aura Free로 부담 없이 시작해보세요.
복잡하게 얽힌 데이터 속에서 숨겨진 패턴을 발견하는 재미, 한번 느껴보시길 바랍니다. 🙂
참고 링크: