Undergoing

OGM(Object Gpath Mapper) 본문

개발/DB

OGM(Object Gpath Mapper)

Halkrine 2021. 8. 30. 15:48

ORM이나 ODM은 보편화되어 찾으면 잘 나오는데, OGM에 대한 개념은 2021년 8월 현재 Neo4j 외에는 찾아볼 수가 없었다. 그 외에는 hibernate-OGM(NoSQL based) 정도고..

 

결국 작성함에 있어 Neo4j-OGM의 내용을 의역할 수밖에 없었는데, Neo4j 외의 GDBMS 시장이 커지면 보편화 될지도..?

 

그러다가 ORM 및 ODM에 대해서도 재확인이 필요했고, 세 가지 기법에 대해(주로 Neo4j OGM) 간단하게 정리해보았다.

 

● ORM(Object Relational Mapping)

- Object와 RDBMS간의 Mapping

- DB와 객체지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 기법

- JDBC, JPA, hibernate, MyBatis가 ORM의 한 종류

- Object oriented code이다 보니 제대로 설정하면 직관적이고 business logic에 더 시간을 할애할 수 있음

- 재사용 및 유지보수가 편함

- 프레임워크의 복잡도가 높아질수록(프로시저가 많은 시스템일수록) 유지보수 및 구현 수준이 높아짐. 순수 ORM으로 구현하기 어려움

 

● ODM(Object Data Mapping)

- NoSQL에서 Document Database를 지원하기 위해 데이터를 변환하는 기법

- join이 없기 때문에 join이 필요없는 데이터 구조화 필요

- 쿼리문 지원의 유연성

- shcemaless한 db 개발에 용이

- mongoose가 ODM의 한 종류

* ODM, ORM

 

● OGM(Object Graph Mapping)

- 그래프의 노드 및 관계를 도메인 모델의 개체 및 참조를 위해 매핑

- 개체 인스턴스는 노드에 매핑되는 반면 개체 참조는 관계를 사용하여 매핑되거나 속성에 직렬화됨

- JVM 기본 요소는 노드 또는 관계 속성에 매핑

- OGM은 데이터베이스를 추상화하고 그래프에서 도메인 모델을 유지하고 낮은 수준의 드라이버를 사용하지 않고 쿼리하는 편리한 방법을 제공

* hibernate OGM

 

Neo4j OGM

- 개발자에게 Neo4j-OGM에서 생성된 쿼리가 불충분할 경우 제대로 구성된 커스텀 쿼리를 제공할 수 있는 유연성을 제공함

- Neo4j OGM은 Spring Data Neo4j의 기반 역할도 하는 Java전용 독립 실행이 가능한 simple 그래프 매퍼로 개발됨

- 내부적으로 일관된 방식으로 cypher를 사용, 볼트, http 및 임베디드와 같은 여러 전송 프로토콜을 통해 통신할 수 있음

 

● 이점

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

 

코드 예시

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

   @GraphId Long id;

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

@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;

}

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

'개발 > DB' 카테고리의 다른 글

PostgreSQL - GiST  (0) 2021.12.08
PostgreSQL - GIN  (0) 2021.12.06
PostgreSQL - BRIN  (0) 2021.11.30
springboot에 slf4j 설정 시 느릴 경우  (0) 2018.02.20
[MariaDB] CSV 파일 import  (0) 2017.09.08