SpringBoot+Neo4j [1. 하나의 노드 엔티티만을 가지는 GraphDB프로젝트]
목차
graphDB neo4j를 이해하기 위해 SpringBoot를 이용하여 기본적인 프로젝트부터 진행하기로 했다. graphDB를 이해하기 위한 이론적 요소는 개발을 진행하며 하나하나 다루도록 하겠다.
첫번째 프로젝트가 가질 데이터 구조는 다음과 같다.
해당 노드 엔티티에 대하여 CRUD를 수행할 것이다.
CRUD를 수행하기 위해 기존에 사용하던 RDBMS의 쿼리와는 다른,
CyperQuery를 사용하게 된다.
우선 노드와 CyperQuery가 무엇인지부터 알아보자.
노드란?
노드는 라벨과 속성(properties)으로 이루어져있다.
라벨은 테이블 이름에 대응되고,
속성은 칼럼명에 대응된다고 이해하면 편하다.
위 노드를 RDBMS모델로 표현하자면 다음과 같이 표현될 수 있을 것이다.
이외에도 노드에는 다른 노드와 관계를 정의해주는 RelationShip이라는 매우 중요한 개념이 있으나, 이는 다음 프로젝트에서 다시 다루도록 하겠다.
CyperQuery란?
그래프 db 질의에 특화된 언어이다. match, create, return 그리고 관계를 나타내는 -> 등을 이용하여 구성된다.
아래 링크를 참고해주길 바란다.
https://neo4j.com/docs/cypher-manual/current/clauses/match/
0. 프로젝트 구조
https://github.com/alska95/Spring_Neo4j_Project
위 링크의 프로젝트를 기반으로 설명을 이어 나갈 예정이다.
반드시 참고해주길 바란다.
단계별로 따라가면서 설명이 부족한 부분은 작성된 코드를 보면 이해가 좀 더 수월할 것이다.
1. 스프링 부트 프로젝트 설정
필자는 Maven, Java, Jar을 사용한 프로젝트를 구성하였다.
Dependency로
Lombok, Spring Web, Spring Data Neo4j를 추가해 주었다.
*참고한 예제는 Reactive Web을 사용하여 구성되었으나, 본 프로젝트는 우선 기본적인 개념만 깨우치고자 진행하는 프로젝트기 때문에, 동기적인 Web을 사용하여 진행하고 추후에 Reactive Web을 사용하는 프로젝트에 대해서 다시 다루도록 하겠다.
*본 프로젝트는
https://github.com/neo4j-examples/movies-java-spring-data-neo4j를 참고하여 진행되었습니다.
필자는 IntelliJ를 이용하여 진행했으나 Spring.io 사이트에서 진행하는 경우도 똑같은 설정을 해 주면 될 것이다.
또 테스트 환경을 위해 추가적인 dependency를 추가해 주어야 하는데,
이는 아래 링크를 참고하여 추가해 주길 바란다.
https://github.com/alska95/Spring_Neo4j_Project/blob/f01a80ec6c97cbba40decc0f6e00fccec6b3774c/pom.xml
테스트 환경을 위해 필요한 dependency이니 꼭 추가해주길 바란다.
2. application.yml 설정
yml파일을 사용했다.
본 프로젝트는 로컬 환경 neo4j에서 진행하기로 했다.
때문에 데스크톱에 neo4j를 설치하고 진행하도록 하자.
설치 방법은 아래 링크의 Prepare the database 항목을 참고하길 바란다.
아래 링크에 .properties파일로 설정하는 법이 나와있으니 이 또한 참고하면 좋을 것 같다.
https://neo4j.com/developer/spring-data-neo4j/
*참고 : 해당 application 설정이 잘못되어 데이터베이스 connection을 얻지 못하는 경우, neo4jTemplate의 빈 설정을 하지 못했다는 에러가 뜬다. 해당 에러가 표출될 경우 yml파일 설정이 잘못된 건 아닌지 살펴보자.
3. DatabaseConfig
필수적인 프로젝트 클래스 하나하나에 대해서 다루도록 하겠다.
DatabaseConfig는 우리가 설정했던 yml파일에서 설정을 가져와서 db정보를 넣어준다.
4. Entity
생소한 어노테이션이 몇 개 보인다.
@Node, @Property, @Relationship이 그것이다.
@Node는 JPA의 @Entity와 같다고 생각하면 편하다.
@Property는 해당 노드의 속성 값임을 명시하는 어노테이션이다.
@Relationship 어노테이션은 다음 게시물에서 다루도록 하겠다.
@Id는 pk를 정의해준다.
5. Repository
공식 홈페이지 예제는 ReactiveNeo4jRepository를 사용하였으나, 본 예제는 동기 멀티스레드 기반 Neo4jRepository를 사용한다. JPARepository와 상당히 유사한 것을 알 수 있다. 자세한 동작 방식과 사용법은 아래 링크를 참고하자.
Neo4jRepository를 모르고 프로젝트를 수행하기는 상당히 힘드니 꼭 참고하길 바란다.
SpringBoot+Neo4j [Neo4jRepository에 관하여]
SpringBoot+Neo4j [Neo4jRepository에 관하여]
Neo4jRepository에 대해 살펴보도록 하겠다. SpringDataJPA와 유사한 SpringDataNeo4j Neo4jRepository는 JPARepository처럼 PagingAndSortingRepository를 상속받으며, JPARepository처럼 메소드명 기반 구현체를..
rhsalska55.tistory.com
6. Service (CRUD)
MovieService에 대해 살펴보도록 하겠다.
생성자 주입을 통해 위 4가지에 의존성을 주입해준다.
MovieRepository는 위 4번에서 구현한 repository로 상속받는 인터페이스의 구현체인 simpleNeo4jRepository에서 빈으로 등록되어있다.
DatabaseSelectionProvider은 위 3번에서 @Configuration 클래스에서 빈으로 등록해 준 yml설정에 따라 데이터베이스를 골라주는 클래스이다.
Neo4jClient는 cyper쿼리를 C#기반의 코드로 바꾸어 database에 접근할 수 있도록 도와준다. 기본적인 CRUD기능을 제공한다고 한다.
Neo4jClient를 이용해서 여러 Cyper쿼리를 작성해볼 것이다.
Neo4jClient에 대한 자세한 것은 아래 링크를 참고하자.
https://github.com/DotNet4Neo4j/Neo4jClient/wiki
Neo4j는 3개의 추상화 계층 단계에서 CRUD기능을 제공한다.
1.Neo4jClient
2.Neo4jTemplate
3.Neo4jRepository
이에 관해서는 아래 링크를 참고하자.
Driver는 DB에 직접 접근하고 싶을 때 사용하는 방법이다.
이것들을 이용해서 어떻게 CRUD가 이루어지는지 코드를 자세히 살펴보려면 아래 링크를 참고하자.
이것이 가장 중요한 부분이라 꼭 참고하길 바란다.
SpringBoot+Neo4j [CRUD 기능 구현]
Spring을 이용한 Neo4j의 CRUD Method들을 살펴보겠다. 아래 코드를 참고하며 보는 것을 추천합니다. https://github.com/alska95/NOSQL_Neo4j_Practice 앞서 언급한 것처럼 SpringDataNeo4j가 제공하는 3가지 방..
rhsalska55.tistory.com