현업에서 백엔드 개발로 가장 많이 쓰는 프로젝트는 Spring이 될 것입니다.
닷넷코어나 nestjs 가 아무리 강력하다고 해도 전자정부프레임워크를 기반으로 만들어진 국내시장의 관성은 꽤나 단단하기 때문입니다.
Spring 에서 그래프데이터베이스를 가장 쉽게 사용하는 방법은 무엇인가?
그것은 바로 Spring Data Neo4j 입니다.
하지만 이름에서도 보이듯이 Neo4j 를 전문으로 지원하며 현업에서는 Neo4j보다 Neptune을 훨씬 많이 사용합니다.
뭐 이유는 다양한데 개인적으로는 그래프데이터베이스 시장이 작다보니 인프라구축하는 사람들이 구축해본적 없는 오픈소스인 Neo4j를 구축하고 관리하는걸 부담스러워하는게 크다고 생각합니다.
Neptune은 AWS에서 전면지원하기때문에 상대적으로 신경을 덜 써도 되구요.
게다가 Neptune의 기본언어인 Gremlin은 팅커팝이라는 매우 우수한 프레임워크를 동반자로 삼고있기에 Spring 에서 굳이 Spring data Gremlin과 같은 OGM을 내줄거 같지도 않습니다.
(실제로 MS에서 시도하다가 사용률이 저조해 접은 프로젝트가 있습니다)
하지만 Neptune은 OpenCypher(그래프언어)와 Bolt (통신프로토콜)를 지원합니다.
즉 조금만 노력하면 Neptune에서 Spring Data Neo4j를 사용할 수 있다는 말입니다.
우선 접속부터 살펴보겠습니다.
@Configuration
public class Neo4jConfig {
@Bean
public Driver neo4jDriver() {
return GraphDatabase.driver("bolt://넵튠주소~:8182",
AuthTokens.none(),
Config.builder().withEncryption()
.withTrustStrategy(Config.TrustStrategy.trustSystemCertificates())
.build());
}
}
Neptune에 접속하려면 AWS의 인증정책을 거쳐야되기때문에 위와같은 설정이 필수입니다.
그리고 접속에 성공한뒤 findById를 치는 순간 떡하니 에러가 발생합니다.
에러내용을 보면 문법이 이상하다는 내용일 것입니다.
이는 Cypher와 OpenCypher간의 문법차이로 발생하는데요
좀더 정확하게 말하면 Spring data neo4j의 버전이 구시대적인 Cypher 문법을 사용하기때문이고
그런 과거의 문법이 배제된 상태로 나온 OpenCypher 같은 경우에는 CALL이나 UNION 같은 문법을 사용할 수 없습니다.
하지만 우리는 커스텀된 문법을 사용할 수 있습니다.
public interface PlayerRepository extends Neo4jRepository<Player,Long> {
@Query("CREATE (n:Player {playerId:$playerId, name:$name, age:$age, positionType:$positionType, teacherId:$teacherId}) RETURN n")
Player save(Long playerId, String name, Long age, PositionType positionType, Long teacherId);
@Query("MATCH (u:Player {name:$name}) -[r:teamMate*]-> (m:Player) RETURN u, collect(r), collect(m)")
List<Player> findAllByName(String name);
@Query("MATCH (a:Player), (b:Player) WHERE a.teacherId = b.playerId\n" +
"CREATE (a)-[r:teamMate]->(b)")
void createRelationShip();
}
위와같이 OGM이 자동으로 만들어주는 문법을 배제한다면 충분히 Cypher 문법으로 Neptune 접근이 가능합니다.
AWS 문서에는 아래와 같이 적혀있습니다
Spring Data Neo4j – This is not currently compatible with Neptune.
하지만 이론상 사용하는게 불가능 하지는 않습니다.
개인적으로는 Spring을 사용한다고 하더라도 굳이 Spring Data Neo4j에 집착할 필요는 없습니다.
팅커팝은 매우 잘만들어진 프레임워크니까요
물론 Spring Data 시리즈가 제공해주는 우수한 도메인 활용력이 탐나신다면 도전해볼만한 과제라고 생각합니다.
'개발 > GraphDatabase' 카테고리의 다른 글
5. 세상을 녹이는 TinkerPop (0) | 2023.06.13 |
---|---|
4. Repeat 과 Emit (0) | 2023.06.12 |
3. 서울에서 Vertex 서방 찾기 (0) | 2023.06.10 |
2. Vertex와 Edge (0) | 2023.06.10 |
1. Gremlin과 Cypher (1) | 2023.05.20 |