NOSQL/Neo4j

SpringBoot+Neo4j [Neo4jRepository에 관하여]

alska95 2021. 11. 9. 14:28

Neo4jRepository에 대해 살펴보도록 하겠다.


SpringDataJPA와 유사한 SpringDataNeo4j

Neo4jRepository는 JPARepository처럼 PagingAndSortingRepository를 상속받으며, 

JPARepository처럼 메소드명 기반 구현체를 구현하는 기능을 제공해 준다.

 

또 @Query 어노테이션을 지원한다. (@NamedQuery는 지원하지 않는 듯하다.)

@Query안에 CyperQuery를 집어넣어 사용한다.

 

아래와 같이 사용할 수 있다.

@Query로 직접 구현한 findSearchResults와

Neo4jRepository가 메소드 이름을 기준으로 구현해주는 findAllByTitleLike메소드는 동일하게 동작한다.

 

Neo4jRepository는 구현체로 아래와 같은 SimpleNeo4jRepository를 갖는다.

SimpleNeo4jRepository는 SimpleJpaRepository같이 @Repository가 선언되어 빈으로 등록된다. 때문에 우리가 구현한 Repository에 @Repository를 선언해줄 필요는 없지만, 그냥 명시적으로 적어 두었다.


SpringDataNeo4J의 Transaction

특이한 점을 발견했다. NOSQL은 Transaction을 사용하지 않는다고 알고 있었는데 아래 SimpleNeo4jRepository의 구현체를 살펴보면,

neo4j는 트랜잭션을 지원하는 것으로 보였다.

 

Neo4j의 Transaction은 RDBMS와 상당히 유사하다. 이에 관해서는 아래 링크를 참고하자.

https://neo4j.com/docs/cypher-manual/current/introduction/transactions/

 

그래서 트랜잭션도 적용 가능하고, SpringDataJPA의 많은 부분을 표방하기도 하였으니 JPA의 큰 강점인 트랜잭션 단위 PersistenceContext와 유사한 기능을 제공하지는 않을까 싶어서 찾아본 결과,

JPA가 지원하는 EntityManager과 비슷한 기능을 SessionFactory가 해준다고 한다. 그렇다면 영속성 컨텍스트와 프록시 기능 등 EntityManager이 제공하는 기능을 모두 사용할 수 있는 것 일까? 이는 나중에 알아보도록 하겠다.

https://docs.spring.io/spring-data/neo4j/docs/5.3.8.RELEASE/reference/html/#reference