본문 바로가기
Java, Kotlin, Spring/Spring, Spring Boot

Spring Data - Neo4j 사용

by Wordbe 2021. 1. 20.
728x90

 

Springboot Spring Data - Neo4j

 

Neo4j는 노드와 연관관계를 영속화하는데에 RDB 보다 다양한 장점이 있는 데이터베이스이다.

의존성추가

pom.xml

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

 

Docker로 Neo4j 설치, 실행

$ docker run -p 7474:7474 -p 7687:7687 --name springboot-neo4j -d neo4j

http 프로토콜용 포트(7474), 볼트(bolt) 프로토콜용 포트(7687)를 각각 매핑해주어야 한다. 7474 포트에서 동작하는 브라우저가 서버에 매핑 될 수 있다.

-d 데몬 옵션으로 neo4j 이미지를 실행한다. (이미지가 없으면 자동으로 docker hub에서 다운받아진다.)

그리고 neo4j는 도커 컨테이너에서 CLI를 실행시키는 것 외에 브라우저에서 인터렉티브한 그래픽환경을 제공해주기 때문에 이것을 이용하면 편하다.

http://localhost:7474/browser 로 접속하면 된다.

 

user 설정

Neo4j 접속

neo4j 아이디로 접속을 하기 위해, 초기 비밀번호는 neo4j 이다.

접속을하면 반드시 비밀번호를 바꿔주라고 한다. 편의상 1234로 바꿀 것이다. 이렇게 되면 기본 접속 정보가 달라지므로, springboot 에도 이 속성을 적용시켜주어야 접속이 가능하다.

아래 프로퍼티 파일을 수정하자.

application.properties

spring.data.neo4j.username=neo4j
spring.data.neo4j.password=1234

Neo4j 접속성공화면



SessionFactory 사용

Spring 에서 neo4j를 제어하기 위한 방법으로 SessionFactory 빈을 제공한다.

Food 노트엔터티를 하나 만들어보자.

@Getter @Setter
@NodeEntity
public class Food {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private String color;
}

@NodeEntity 어노테이션을 붙인다.

 

SessionFactory 이용

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    SessionFactory sessionFactory;

    @Override
    public void run(ApplicationArguments args) throws Exception {

          // Food 노트 엔터티의 노드 데이터 생성
          Food food = new Food();
        food.setName("apple");
        food.setColor("red");

          // 세션 열고, Food 노트 엔터티에 저장, 종료
        Session session = sessionFactory.openSession();
        session.save(food);
        sessionFactory.close();

        System.out.println(food);
    }
}

node entity (Food) 와 node (apple)

 

Neo4jRepostiory 사용

Spring 에서 neo4j를 제어하기 위한 방법으로 Repository 를 제공하기도 한다.

Neo4jRepostiory 이용

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    FoodRepository foodRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {

          Food food = new Food();
        food.setName("apple");
        food.setColor("red");

        foodRepository.save(food);
    }
}

이렇게 하면 위에서 SessionFactory 를 사용할 때와 같은 결과를 낼 수 있다.

 

추가로 노드엔터티간 관계를 엮어보자.

Store 이라는 노드엔터티를 만들자.

@Getter @Setter
@NodeEntity
public class Store {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Relationship(type = "has")
    private Set<Food> foods = new HashSet<>();
}

StoreRepository도 만든다.

public interface StoreRepository extends Neo4jRepository<Store, Long> {
}
@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    StoreRepository storeRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        Store store = new Store();
        store.setName("ABC mart");

        Food food = new Food();
        food.setName("strawberry");
        food.setColor("red");

        store.getFoods().add(food);

        storeRepository.save(store);
    }
}

Store 노드엔터티가 Food 노트엔터티를 가지고 있다고 관계를 맺었었다.

Store 객체과 Food 객체를 만들고 store에 food를 추가하여 store 레포지토리에 store를 추가하자.

 

Relationship "has" 로 연관된 Store 과 Food

 

 

 

 

 

 

728x90

'Java, Kotlin, Spring > Spring, Spring Boot' 카테고리의 다른 글

Spring Data - MongoDB  (0) 2021.01.21
Spring Data - Redis  (0) 2021.01.21
Spinrg data 초기화, migration  (0) 2021.01.20
Springboot - Spring Data JPA  (0) 2021.01.20
Spring Data - PostgreSQL  (0) 2021.01.20

댓글