본문 바로가기
Dev/Spring Boot

[스프링 부트 개념과 활용] 스프링 데이터 11부

by dev_jsk 2020. 8. 28.
728x90
반응형

Neo4j

노드간의 연관관계를 영속화 하는데 유리한 그래프 데이터베이스

특징

  • 노드들과 연관관계를 표현하는데 있어 풍부한 기능을 제공
  • 릴레이셔널 DB보다 좀 더 빠르다는 장점을 가진 그래프 DB
  • 버전마다 하위호환성이 좋지 않다.
  • 하위호환성이 없어 최신버전에서는 Neo4jTemplate, Neo4jOperation이 Bean으로 등록되지 않는다.
  • Neo4j 자체로도 하위호환성이 좋지 않아 최신버전에서는 포트 매핑 2개 해야함 앞 Http용, 뒤 Bolt라는 Protocol
  • UI가 예쁜 Client Browser제공 http://localhost:7474/

예제

SessionFactory 이용

1. 의존성 추가

// pom.xml

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

// spring-boot-starter-parent 버전 관련
// 2.0.3.RELEASE -> 2.3.3.RELEASE 로 변경해야 Neo4j 정상 사용가능(2020.08.31)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
</parent>

2. Docker 이용 Neo4j 저장소 생성

// Terminal

// 저장소 생성
// 앞 포트는 Http용
// 뒤 포트는 Bolt Protocol용
docker run -p 7474:7474 -p 7687:7687 --name neo4j_boot -d neo4j

3. Neo4j 접속 확인

(1) http://localhost:7474 접속

(2) 최초 로그인 시 비밀번호 변경 필요

(3) application.propertiesusername 및 변경한 password 설정

// application.properties

spring.data.neo4j.password=1111
spring.data.neo4j.username=neo4j

(4) 접속 확인

5. Account 객체 및 Neo4jRunner 생성

// Account.java

@NodeEntity
public class Account {
    @Id @GeneratedValue
    private Long id;
    private String username;
    private String email;
    
    getter/setter
}

// Neo4jRunner.java

@Component
public class Neo4jRunner implements ApplicationRunner {
    @Autowired
    SessionFactory sessionFactory;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setEmail("sun7190@naver.com");
        account.setUsername("Jinseo");

        Session session = sessionFactory.openSession();
        session.save(account);
        sessionFactory.close();

        System.out.println("finished");
    }
}

결과 확인

 

관계 추가

1. Role 클래스 생성

// Role.java

@NodeEntity
public class Role {
    @Id @GeneratedValue
    private Long id;
    private String name;
    
    getter/setter
}

2. Account 객체에 Role 관계 추가

// Account.java

@NodeEntity
public class Account {
    ...
    @Relationship(type = "has")
    private Set<Role> role = new HashSet<>();
    
    getter/setter
}

3. Neo4jRunner 에 Role 정보 설정 및 Account 객체에 추가

// Neo4jRunner.java

@Component
public class Neo4jRunner implements ApplicationRunner {
    @Autowired
    SessionFactory sessionFactory;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setEmail("sun7190@naver.com");
        account.setUsername("Jinseo");

        Role role = new Role();
        role.setName("admin");

        account.getRole().add(role);

        Session session = sessionFactory.openSession();
        session.save(account);
        sessionFactory.close();

        System.out.println("finished");
    }
}

결과 확인

 

Repository 이용

1. AccountRepository 생성

// AccountRepository.java

public interface AccountRepository extends Neo4jRepository<Account, Long> {}

2. Neo4jRunner 에서 SessionFactory 대신 AccountRepository 사용

// Neo4jRunner.java

@Component
public class Neo4jRunner implements ApplicationRunner {
    @Autowired
    AccountRepository accountRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
        account.setEmail("sun7190@naver.com");
        account.setUsername("Jinseo");

        Role role = new Role();
        role.setName("admin");

        account.getRole().add(role);

        accountRepository.save(account);

        System.out.println("finished");
    }
}

결과 확인

 

728x90
반응형

댓글