Spring Boot 프로젝트와 Neo4j 연결하기

AMUD·2023년 6월 1일
0
post-custom-banner

🍑 개요

  • 이전 게시물에서 이어진다. (이전 게시물에서 DB에 추가한 데이터를 예제에 활용)
  • 버전 정보 (삽질을 정말 오래했는데 버전 관련 이슈가 많았기 때문에 버전 정보 꼭 확인하기!!!)
    • jdk : 17
    • Spring Boot : 3.0.6
    • Neo4j : 5.6.0

🐬 의존성 추가

dependencies {
	implementation 'org.neo4j.driver:neo4j-java-driver:5.6.0'
	implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'

	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

상단 2개의 의존성은 Neo4j 연결을 위한 의존성이고, 나머지는 예제 실행을 위해 이용할 예정이다. spring boot data를 사용하는 것이라 기존 JPA를 사용해봤다면 큰 어려움 없이 적용할 수 있다.

🏰 application 파일 작성하기

application.properties 예시

spring.neo4j.uri=bolt://{인스턴스 주소}:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password={비밀번호}

application.yaml 예시

spring:
  neo4j:
    authentication:
      username: neo4j
      password: {비밀번호}
    uri: bolt://{인스턴스 주소}:7687

Neo4j의 버전에 따라 작성 방법이 상이하니, 상단의 버전 정보를 확인해야 한다. 현재 5.x를 사용하고 있기 때문에 4.x 이후 버전은 위와 같이 작성하면 될 것이다. 3.x 이하는 하단의 공식 문서 링크를 참조한다.

이 부분까지 제대로 작성하고, 실행하여 오류 없이 작동하면 연결 자체는 완성되었다. 이후는 간단 예제 관련 단계이다. API 작성 관련한 자세한 설명은 생략한다.

🚛 디렉터리 구조


예제를 위해 간단하게 Web Layer으로 패키지를 구성하였다.

⛺ Developer.java (Entity 클래스) 작성하기

package wy.practice.neo4j.data.entity;

import lombok.Getter;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;

@Getter
@Node("Developer")
public class Developer {
    @Id
    private String name;
    private String country;
    private int age;

    public Developer(String name, String country, int age) {
        this.name = name;
        this.country = country;
        this.age = age;
    }
}

🩴 DeveloperController.java 작성하기

package wy.practice.neo4j.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import wy.practice.neo4j.data.entity.Developer;
import wy.practice.neo4j.service.DeveloperService;

@RestController
public class DeveloperController {

    @Autowired
    private DeveloperService developerService;

    @GetMapping("/")
    public Developer findAmud() {
        return developerService.findAmud();
    }
}

📀 DeveloperService.java 작성하기

package wy.practice.neo4j.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import wy.practice.neo4j.data.entity.Developer;
import wy.practice.neo4j.repository.DeveloperRepository;

@Service
public class DeveloperService {

    @Autowired
    private DeveloperRepository developerRepository;

    public Developer findAmud() {
        return developerRepository.findOneByName("amud").block();
    }
}

🧿 DeveloperRepository.java 작성하기

package wy.practice.neo4j.repository;

import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository;
import reactor.core.publisher.Mono;
import wy.practice.neo4j.data.entity.Developer;

public interface DeveloperRepository extends ReactiveNeo4jRepository<Developer, String> {
    Mono<Developer> findOneByName(String name);
}

🤡 테스트


현재 데이터 상태는 위와 같다. (이전 게시물 참고)


간단하게 Postman으로 요청/응답 테스트를 하였다.

요청에 알맞은 노드 값을 반환하는 것을 확인할 수 있다.

🦴 참고

https://neo4j.com/docs/getting-started/languages-guides/java/spring-data-neo4j/

https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#dependencies

profile
210's Velog :: Ambition Makes Us Diligent
post-custom-banner

0개의 댓글