DBMS/활용 사례

Graph Database와 OGM

(주)비트나인 2023. 9. 2. 17:23

 

1. 들어가기에 앞서

 

데이터베이스를 다루는 사람이라면 ORM, ODM 등에 대해서는 많이 들어봤을 겁니다. 내용도 보편화되어 있어 러닝커브가 적은데요, ‘OGM 이 무엇인가?’라는 질문을 받으면 공수를 들여 찾아보지 않은 이상 모르는 경우가 많을 겁니다.

 

이 기사에서는, ORM과 ODM에 대한 리마인드 및 OGM이 무엇인가를 알아보도록 하겠습니다.

 

2. ORM, ODM

2.1.ORM

 

ORM은 Object Relational Mapping의 약자로, ‘객체 관계 맵핑’ 을 뜻합니다. 데이터베이스와 객체 지향 프로그래밍 언어 간 호환되지 않는 데이터를 변환하는 기법이지요. 웹개발자들에게 친숙한 JDBC나 JPA, hibernate, MyBatis 등이 ORM의 종류 중 하나라고 할 수 있겠습니다.

 

OOP(Object Oriented Programming)에는 Class라는 개념이 있고, RDBMS에는 Table이라는 개념이 있음을 모두 잘 알 것입니다. 즉, Class에 DB에 대응하는 Schema를 Mapping 하고, Method를 통해 쿼리를 작성하면 객체로 이뤄진 테이블을 취할 수 있다는 이야기인데, 이것이 ORM의 개념입니다.

 

위 그림을 보시면, Class File에는 id와 foodName, foodType의 변수가 지정이 되어 있습니다. 그리고 테이블에는 id, foodname, foodtype이라는 컬럼이 지정되어 있죠. ORM을 사용하면 이 관계를 매핑하여 DB를 제어할 수 있습니다.

 

이렇듯 ORM은 제대로 설정하면 직관적이고, 비즈니스 로직 구성에 할당되는 시간을 줄일 수 있으며 재사용 및 유지보수가 편합니다. 그러나  프레임워크의 복잡도가 높아질수록 유지보수 및 구현 수준이 높아지다 보니, 결국 복잡할수록 순수 ORM으로 구현하기 어려운 단점이 존재합니다.

 

2.2. ODM

 

ODM은 Object Data Mapping의 약자로, ‘객체 데이터 매핑’ 을 뜻합니다. NoSQL에서 문서형 데이터베이스를 지원하기 위해 데이터를 변환하는 기법인데요, 일반적인 RDBMS의 SQL문과 달리 join 구절이 없기 때문에 join이 필요하지 않은 데이터 구조화에 필요한 기법입니다.

 

NoSQL의 사상인 ‘Not Only SQL’ 에 충실하여, 이 기법은 쿼리문 지원이 상당히 유연합니다. 또한 schemaless 한 DB 개발에 용이하고, 주로 빅데이터 등을 다를 때 RDBMS보다 트래픽을 더 감내할 수 있습니다. 

 

대표적인 것으로는 mongoose가 있습니다.

 

3. OGM

3.1. Object Graph Mapping

OGM은 Object Graph Mapping의 약자입니다. 즉 그래프의 노드 및 관계를 도메인 모델의 개체 및 참조를 위해 매핑하는 개념이라 볼 수 있습니다. 이 개념을 주입하면, 개체 인스턴스는 노드에 매핑되는 반면 개체 참조는 관계를 사용하여 매핑되거나 속성에 직렬화되는 구조를 띄게 됩니다.

 

또한 OGM은 DB를 추상화하고 그래프에서 도메인 모델을 유지하고 낮은 수준의 드라이버를 사용하지 않고 쿼리하는 편리한 방법을 제공한다는 이점이 있습니다.

 

OGM 사상을 띄는 기법 중 하나로는 hibernate OGM이 있습니다.

 

3.2. Neo4j OGM

 

현재 OGM에 대한 개념을 정립하고 선두주자에 서 있는 걸 꼽으라 하면 Neo4j의 OGM이라 볼 수 있습니다. Neo4j OGM은 Spring Data Neo4j의 기반 역할도 하는 Java전용 독립 실행이 가능한 simple 그래프 매퍼로 개발되었습니다.

 

만약, 개발자에게 Neo4j-OGM에서 생성된 쿼리가 불충분할 경우 제대로 구성된 커스텀 쿼리를 제공할 수 있는 유연성을 제공하기도 합니다.

 

내부적으로는 당연히 cypher를 사용하고, Bolt Protocol이나 http 및 임베디드와 같은 여러 전송 프로토콜을 통해 통신할 수 있습니다.

 

Neo4j OGM에서 말하는 이점은 다음과 같습니다.

 

  • 주석이 달린 노드 및 관계 엔터티의 개체 그래프 매핑
  • Neo4j와의 직접적인 상호작용을 위한 Neo4jSession
  • 빠른 클래스 메타데이터 스캔
  • 최소한의 데이터 전송을 위한 데이터 로드 및 변경 추적의 최적화된 관리
  • 다중 전송: 바이너리(볼트), HTTP 및 임베디드
  • 지속성 수명 주기 이벤트
  • DTO에 대한 쿼리 결과 프로젝션

그럼 Neo4j OGM이 적용된 코드를 보도록 합시다.

@NodeEntity(label="Film")
public class Movie {

   @GraphId Long id;

   @Property(name="title")
   private String name;
}

이 Class는 Movie라는 Node가 될 것입니다. @NodeEntity Annotation을 통해 라벨명을 Film으로 설정하고, GraphId와 Property를 Java 내부에서 설정합니다.

@NodeEntity
public class Actor extends DomainObject {

   @Id @GeneratedValue
   private Long id;

   @Property(name="name")
   private String fullName;

   @Relationship(type="ACTED_IN", direction=Relationship.OUTGOING)
   private List<Role> filmography;

}

이 Class는 Actor라는 Node가 될 것입니다. GeneratedValue Annotation을 통해 node 생성 시 id를 자동으로 생성할 것이고, Actor의 이름이 들어갈 것입니다. 

Relationship Annotation의 속성에서 direction은 관계를 맺을 시 해당 Node 출발점인지, 도착점인지를 설정할 때 사용할 수 있습니다.

@RelationshipEntity(type="ACTED_IN")
public class Role {
    @Id @GeneratedValue  private Long relationshipId;
    @Property            private String title;
    @StartNode           private Actor actor;
    @EndNode             private Movie movie;
}

이제 Actor와 Movie의 관계를 설정합니다. StartNode Annotation을 통해 Edge의 출발점을, EndNode를 통해 도착점을 설정할 수 있습니다. Edge의 property에는 title이라는 값이 들어갈 것입니다.

이렇듯, Neo4j OGM을 통해 클래스 내에서 GDB 사상을 주입하여 클래스로 Node와 Edge의 관계를 설정할 수 있습니다.

 

4. OGM을 통한 유연한 GDB 모델 개발을 기대하며

아직까지는 OGM에 대한 개념은 ORM이나 ODM에 비해 매우 생소합니다. 실제로 DB 트렌드도 RDB가 아직 강세이기도 합니다. 또한 OGM 관련 라이브러리는 Neo4j OGM, OrientDB OGM, hibernate OGM 등 아직까지는 OGM 라이브러리 춘추전국시대는 오지 않았습니다.

 

하지만 앞으로 GDB의 활용성이 높아지고, 이를 활용한 개발 수요가 늘어난다면, OGM에 대한 사상도 더욱 깊어질 것이고, 나아가 개발 파트에서도 OGM을 십분 활용하여 생산성 있고 효율적인 GDB 시스템 개발에 이바지할 수 있을 것이라는 작은 기대를 가져봅니다.

 

 

 

글 : 윤재영 팀장 ( 비트나인 R&D Lead팀 )