JanusGraph/JanusGraph 이론

JanusGraph의 핵심 이점 ① / 트랜잭션 처리 중심으로

Severus Moriarty 2025. 4. 15. 12:43

JanusGraph의 핵심 이점 ①

대규모 그래프와 동시 트랜잭션 처리

JanusGraph는 오픈소스 분산 그래프 데이터베이스로, 복잡한 데이터 관계를 효과적으로 저장하고 분석할 수 있는 강력한 기능들을 제공합니다. 이번 글에서는 JanusGraph의 대표적인 장점들을 하나씩 살펴봅니다.


✅ 1. 매우 큰 그래프를 지원하는 확장성

JanusGraph는 클러스터 기반으로 운영되며, 클러스터에 포함된 머신 수에 따라 처리할 수 있는 그래프의 크기 역시 확장됩니다.

  • 정점(Vertex)과 간선(Edge)의 수가 수천만 개에 이르는 초대형 그래프도 무리 없이 지원
  • 예를 들어, 정점이 60개, 간선이 60개 이상인 복잡한 그래프도 분산 구조를 통해 안정적으로 저장 및 처리 가능

💡 큰 그래프는 하나의 서버에서는 처리하기 어렵기 때문에, 여러 머신이 협력하는 클러스터 환경이 중요합니다.


✅ 2. 수많은 동시 트랜잭션을 처리 가능

또한 JanusGraph는 동시성 측면에서도 뛰어난 성능을 보여줍니다.

  • 동시에 여러 사용자가 데이터 삽입, 수정, 삭제 등을 요청하더라도 병렬로 트랜잭션이 처리됨
  • 머신 수가 늘어날수록 동시에 처리 가능한 트랜잭션 수 역시 증가

💬 트랜잭션이란?

트랜잭션은 "완전히 성공하거나, 전혀 적용되지 않아야 하는" 작업의 논리 단위입니다.
예: 은행 이체 → A 계좌에서 출금되고 B 계좌에 입금되어야 완전한 성공. 둘 중 하나라도 실패하면 전체 취소(rollback)

 

commit or rollback

 

💬 동시 트랜잭션이란?

여러 개의 트랜잭션이 동시에 실행되는 것을 의미합니다.
JanusGraph는 이를 무리 없이 처리할 수 있도록 설계되어 있어 높은 실시간성이 요구되는 환경에도 적합합니다.

데이터베이스 동시성 제어

------------------------------------------------------------------------------------------------------------------------------------------------------

++ 트랜잭션 설명

① 트랜잭션 분기 흐름 (commit / rollback)

commit or rollback

💡 개념 요약:
활동(작업) 수행 후, 일부 성공 또는 실패 여부에 따라 커밋 또는 롤백 결정

✅ JanusGraph와의 관계:

  • JanusGraph는 기본적으로 트랜잭션 범위 내에서 여러 작업을 모아서 실행한 뒤에,
    • 성공: tx().commit()
    • 실패: tx().rollback()
  • 이는 사용자 코드에서 선택적으로 적용할 수 있습니다.

예시 (Java):

JanusGraphTransaction tx = graph.newTransaction();
try {
      Vertex v = tx.addVertex("person");
       v.property("name", "Alice");
       tx.commit();
} catch(Exception e) {
   tx.rollback(); // 오류 발생 시 전체 취소 }

Gremlin 콘솔에서도 같은 구조로 동작:

  • 자동 커밋 설정 여부에 따라 달라지며, 명시적 g.tx().rollback() 또는 .commit()도 가능

📌 부분 성공 상태는 최종 커밋이 이루어지기 전까지는 "비영속 상태"로 처리됩니다.

② 트랜잭션의 원자성 + 롤백 처리

💡 개념 요약:
하나의 트랜잭션이 여러 단계로 구성되어 있고, 하나라도 실패하면 전체가 롤백됨

✅ JanusGraph와의 관계:

  • JanusGraph는 Gremlin 쿼리 단위로 트랜잭션을 구성합니다. (예: g.addV().property(...))
  • 각 쿼리는 내부적으로 여러 단계를 포함하고 있으며, 이 중 하나라도 실패하면 전체 작업이 롤백됨.
  • 예를 들어 정점 추가 → 간선 연결 → 속성 추가 중 하나가 실패하면 전체 작업은 무효화됩니다.

기술적으로:

  • JanusGraph는 자체적으로 트랜잭션 객체 (JanusGraphTransaction)를 관리하며,
  • 커밋(commit) 또는 롤백(rollback)은 다음과 같이 명시함:
  •  
    graph.tx().commit(); // 성공 시
  • graph.tx().rollback(); // 실패 또는 예외 시

📌 데이터 일관성을 보장하며, 복잡한 Gremlin 쿼리를 안전하게 실행할 수 있는 기반입니다.

트랜잭션 직렬화 처리

데이터베이스 동시성 제어

💡 개념 요약:
여러 트랜잭션이 동시에 들어오더라도 내부에서는 직렬화하여 하나씩 처리됨 (2번, 3번, 1번 순 등)

✅ JanusGraph와의 관계:

  • JanusGraph는 멀티 유저 환경에서 트랜잭션을 처리할 수 있도록 설계되어 있음.
  • OLTP 쿼리(Gremlin) 실행 시, 그래프의 정점/간선에 대한 쓰기 연산은 직렬화(Serialize) 되어야 함.
  • 내부적으로는 락(lock) 기반 혹은 버저닝 기반의 직렬화 전략을 통해 일관성을 유지.
  • BerkeleyDB, Cassandra, HBase와 같은 백엔드가 병렬성을 제공하지만, JanusGraph는 그 위에서 직렬성 보장 메커니즘을 구현함.

📌 동시에 여러 사용자가 Gremlin 쿼리를 실행해도 정합성 있는 결과를 보장하는 핵심이 이 구조입니다.

✅ 보너스 팁: OLTP와 OLAP의 트랜잭션 처리 차이

  • OLTP (Gremlin 실시간 쿼리):
    • 위의 트랜잭션 구조와 동일하게 적용됨 (ACID 보장)
  • OLAP (Spark/Hadoop 기반 분석):
    • 트랜잭션이 아니라 일괄 처리(batch processing) 기반 → 롤백 불가
    • 대신 읽기 일관성과 분석 정확성에 중점