개발강의정리/Spring

[스프링 부트 개념과 활용] 4-10. 스프링 데이터 11부: Neo4j

nineDeveloper 2019. 11. 26.
728x90

스프링 부트 개념과 활용

4. 스프링 부트 활용

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/springboot-concept-uses/tree/chap04-10-11-data-neo4j

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급 프레임워크 및 라이브러리 Spring Spring Boot 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

10. 스프링 데이터 11부: Neo4j

  • Neo4j​는 노드간의 연관 관계를 영속화하는데 유리한 그래프 데이터베이스
  • 릴레이션 데이터베이스 보다 빠름
  • GraphQL을 사용

의존성 추가

버전 마다 하위호환성이 좋지 않음

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

Neo4j 설치 및 실행 (도커)

최신버전에서는 PORT 맵핑을 두개 해줘야함 HTTP용과 Bolt라는 프로토콜용

 docker run -p 7474:7474 -p 7687:7687 -d --name noe4j_boot neo4j

UI 브라우저 환경을 제공

http://localhost:7474/browser

기본 password는 neo4j

Properties 설정

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

스프링 데이터 Neo4J

최신버전에서 사용할 수 있는 것은 SessionFactory 밖에 없음

  • Neo4jTemplate (Deprecated)
  • SessionFactory
  • Neo4jRepository

스프링 데이터 Neo4J 테스트 실습1

Account 클래스 생성

@NodeEntity
public class Account {

    @Id @GeneratedValue
    private Long id;
    private String username;
    private String email;

    @Relationship(type = "has")
    private Set<Role> roles = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

Role 클래스 생성

유저에게 권한을 부여하는 클래스

@NodeEntity
public class Role {

    @Id @GeneratedValue
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Neo4jRunner 클래스를 생성해서 테스트 코드 작성

@Component
public class Neo4jRunner implements ApplicationRunner {

    @Autowired
    SessionFactory sessionFactory;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Account account = new Account();
//        account.setEmail("freejava1191@gmail.com");
//        account.setUsername("freelife");
        account.setEmail("flash@gmail.com");
        account.setUsername("flash");

        Role role = new Role();
        role.setName("admin"); //admin 권한 생성

        account.getRoles().add(role); //생성된 유저에 admin 권한 부여

        Session session = sessionFactory.openSession();
        session.save(account); // 저장
//        session.clear(); // 캐싱을 비워줌
        sessionFactory.close();

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

스프링 데이터 Neo4J 테스트 실습2 Repository 사용

AccountRepository 생성

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

Repository를 사용하는 테스트 코드 작성

@Component
public class Neo4jRunner implements ApplicationRunner {

    @Autowired
    AccountRepository accountRepository;

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

        Role role = new Role();
        role.setName("user"); //user 권한 생성

        account.getRoles().add(role); //생성된 유저에 권한 부여

        accountRepository.save(account);

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

댓글

💲 추천 글