Clean Code that Works.

이전에 인덱스를 가지고 값을 찾을 때

findByPropertyValue()를 썼는데 이게 deprecated 됬다.


SDN 3 부터는 Scheme base 인덱스를 사용하는데.... 
findBySchemaPropertyValue() 이걸 사용하면 된다.


("파라미터로는 해당 모델(스키마)의 변수명", "찾을 값") 두개를 주면 되고 해당 변수에 @Indexed 가 붙어 있어야 된다.
@Indexed(unique=true)로 지정하게 되면 유니크 인덱스가 된다.

eBay and Wallmart Adopt Neo4j : The Graph is Transforming Retail

오늘(3월 18일) 이베이와 월마트같은 소매 유통 업체에서 Neo4j를 활용한 미션 크리티컬한 비즈니스 애플리케이션을 개발하여 큰 성공을 거두었다고 Neo4의 개발사인 Neo Technology에서 발표 했다. 이베이는 전 세계에 위치한 고객들에게 자사의 인기있는 서비스인 당일 배송 서비스를 개선하기 위해 Neo4j를 사용한다. 월마트는 온라인 쇼핑객 구매 행동을 분석하여 최적화된 연관 상품들을 제공하기 위해 Neo4j를 사용한다.

이베이는 대략 75% 소비가 고객의 집에서 15마일이내에서 발생한다는 것을 알고 지역 상권을 재정의 하는 대담한 목표를 가지고 있었다.  전자 상거래는 빠르고 편리하지만 배송은 불편했다. 당일 배송 시스템의 출현으로 지역 상업의 모든 행위가 마비될 것으로 보인다. 온라인 쇼핑과 오프라인 매장의 소비자 경험간의 융합은 소매 업체와 고객사이의 원할한 관계를 만들어 상거래 혁명을 일으키고 있다. 유연하고 빠르고 사용하기 쉽도록 하기 위해 Neo4j는 소매상과 온라인 고객사이의 가장 큰 방해물을 제거할 수 있도록 했다. 

이베이의 폭발적인 성장과 새로운 기능들로 인해 가능한 가장 빠르고 확실한 배송을 위해 이베이의 서비스 플랫폼을 새롭게 구성할 필요가 있었다. 이전 시스템인 MySQL은 너무 느리고 계속 유지하기엔 복잡하고 배송을 위한 최적의 경로를 찾는 쿼리의 수행시간이 너무 길었다. 이베이의 개발팀은 그래프데이터베이스가 성능과 확장에 대한 문제점을 해결하기 위해 기존의SOA 및 서비스 구조에 추가될 수 있다는 것을 알았다.  이 팀은 그래프데이터베이스 시장의 최적의 해결책인 Neo4j를 사용했다.

우린 말그대로 이전 MySQL보다 천배이상 빠르고 10~100번정도 적은 코드로 수행되는 Neo4j를 사용했다. 오늘날 Neo4j는 이전의 이베이에서는 불가능했던 기능들을 지원한다.

- Volker Pacher, Seniro Developer at eBay.


월마트 같은 대형 유통업체도 Neo4j를 사용한다. 과거에 소비자들은 마케팅 형태로 제조업체에서 제공하는 정보에 크게 의존했었다. 요즘은 소비자들이 생성한 제품에 관한 리뷰와 구매에 대해서 소셜 미디어에 상담하는 등 다른 정보를 가지고 있다. 소비자간의 정보의 풍요로움과  전문가의 의견에 따른 전에 없던 가용성은 소비자들을 좀 더 다양한 제품에 대한 경험을 가질수 있게 하고 그들이 사용하거나 소유하려고 고유하는 경향에 대하여 결정할 수 있게 해준다. 이렇게 서로 연결된 모든 데이터들을 이해하기 위하여 월마트는 Neo4j 그래프 데이터베이스를 사용한다.

"Neo4j는  우리가 이해하려고 했던 온라인 고객들의 성향과 고객 및 상품간의 관계에 대하여 실시간 상품 추천을 위한 완벽한 기능을 제공한다. 그래프 데이터베이스 시장의 선두주자이고 확장성과 가용성에 대한 고급 기능들을 제공하는 Neo4j는 우리들의 요구사항을 충족시키는 완벽한 제품이다."

- Marcos Wada, Software Developer at Walmart

그래프는 어디든지..그것은 바로 Neo4j

그래프는 산업 전반에 걸친 다루기 힘든 기술적인 문제에 대한 해결 방안으로 공공연하게 인정받고 있다. DB-Engines에 따르면 Neo4j는 가장 인기있는 그래프데이터베이스다.
firm에 따르면 "데이터베이스 관리 시스템중에 작년에 비해 자신의 인기가 가장 증가했는가 볼때 250% 증가한 그래프 데이터베이스는 명백한 승자라고 볼 수 있다."

이베이의 케이스 스터디는 http://www.neotechnology.com/ebay 을 참조.


그래프 데이터베이스와 Neo4j

그래프 데이터 베이스와 Neo4j에 대해서는 아래의 그림 한장으로 설명 될 수 있습니다.
차분히 읽어 보면 개념 자체는 어렵지 않습니다. ㅎㅎ

아래 동영상은 Neo4j의 공동 설립자인 Emil Eifrem이 설명하는 그래프 데이터베이스입니다.


그럼 본론으로 들어가서..
아래 내용들은 Neo4j.org 에 있는 글들을 번역한 것입니다.
되게 어렵게 설명해서 발번역이 됬네요. ㅋ
직접들어가서 한번 보는것도 추천 드립니다.


그래프 데이터베이스란 무엇인가?

그래프 데이터베이스는 데이터를 그래프에 저장하고 데이터의 구조가 가장 일반적이고, 우아하고 높은 접근 방식으로 모든 데이터를 표현할 수 있다.

그래프에 대해 설명하는 몇가지 그래프들을 보도록 하자. 다이어그램 주위의 화살표를 따라 읽으면 문장을 형성해서 그래프를 읽을 수 있다.

그래프는 Nodes 와 Relationships 을 가지고 있다.

A Graph-[:RECORDS_DATA_IN]->Nodes-[:WHICH_HAVE]->Properties.
가장 심플한 그래프는 한개의 노드로 표현할 수 있다. 프로퍼티라는 값으로 정의 될 수 있다.
약간 평범하지 않은 이야기이긴 하지만 노드는 한개의 속성을 가지고 시작해서 몇 백만개까지 증가할 수 있다. 
이렇게 하는 것 보다는 명시적인 관계로 조직된 다수의 노드로 나누는게 좋다.

위 그래프를 화살표를 따라 읽으면 

A Graph는 Nodes 와 Relationships으로 기록 되고, 각각 Node들은 Relationship으로 조직될 수 있다. 
또 Nodes와 Relationships 은 각각 별도로 속성을 가질 수도 있다.


순회를 통해 그래프에 조회 하기

A Traversal - navigates -> a Graph; it - identifies -> Paths - which order -> Nodes.

순회는 그래프에 어떻게 질문을 하는가 라고 말할 수 있다.
알고리즘에 따라 시작 노드 부터 관계가 있는 노드까지 탐색하고, 아래와 같은 질문에 대한 답을 찾을 수 있다. 
"내 친구가 좋아 하는 음악중에 내가 가지고 있지  않은것은 무엇인가?"
"만약 이 파워 서플라이가 다운되면 웹 서비스에 끼치는 영향은 무엇인가?"



노드와 관계에 대한 인덱스.

An Index - maps from -> Properties - to either -> Nodes or Relationships. It - is a special -> Traversal

가끔 특정 노드나 관계에 저장된 속성들에 대해 찾아야할 때가 있다. 
"Account 중에서 사용자 이름이 '그래프 마스터'인 것에 대해 찾아라" 같은 순회 방식은 가장 일반적인 방식으로 인덱스 룩업에 최적화 되어 있다. 

Neo4J란 무엇인?

Neo4j는그래프 데이터베이스로 신뢰할 수 있고 끈끈하게 연결된 데이터들에 대해 빠르게 관리 및 조회할 수 있다.
Neo4j 는 오픈소스 그래프데이터베이스로 Neo Technology에서 제공한다.
Neo4j 속성들과 함께 다양한 관계들과 연결된 노드들을 직접 저장한다.

주요 특징

  • 직관적 : 데이터를 표현하기 위해 그래프 모델을 사용

  • 믿을수 있는 : FULL ACID 트랜잭션을 제공

  • 빠르고 안전한 : 커스텀 디스크와 네이티브 스토리지 엔진 

  • 대규모 확장 : 수십억개의 노드/관계/속성

  • 고 가용성 : 다양한 머신에 분산

  • 사람이 읽기 편한 그래프 

  • 쿼리 

  • 빠른 속도의 그래프 쿼리를 통산 빠른 검색 속도

  • 몇개의 작은 jar 파일들로 서버 세팅 가능

  • 간편 함 : REST interface를 통한 API 제공 및 OOP한 Java API 제공











http://blog.neo4j.org/2013/10/neo4j-200-m06-introducing-neo4js-browser.html

브라우저를 통해서 그래프를 탐색 할 수 있게 된다.


1.8 버전에는 neoclipse 를 통해서 했었는데... 1.9버전은 안되더니..
2.0버전 부터는 웹콘솔 자체에 포함해서 해주는듯... 기대 중이다!

근데 그전에.. 간단한 보안관련 로직도 좀 넣어 주면 안되겠니? ..;

그냥 일반 DB를 하이버네이트를 써서 스프링 시큐리티로 만든 User 클래스를 사용하면, 로그인도 잘 되고 아무 문제가 없는데

User 클래스를 Neo4j로 사용하면 로그인 하는데 문제가 발생한다.


User 클래스에는 시큐리티 플러그인이 만들어준 "beforeInsert", "beforeUpdate" 메서드가 있고, 여기서 password 인코딩을 해준다.

위 이벤트들은 GORM에서 지원해 주는 것들(http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping)


근데 Neo4j를 사용하면.. 그냥 list 를 호출하는데도 beforeUpdate 가 계속 호출되어, 패스워드 값이 여러번 변경된다.. 

무려 3번. 그냥 list를 호출하는데도.. -_-;; 이건 뭐야!!


저게 존재하는 이유가 패스워드 인코딩을 하기 위한거니..

해결 방법은. 

User 클래스의 위의 두 메서드( beforeInsert, beforeUpdate)를 제거 하고, UserController에서 패스워드 인코딩 하는 내용을 넣어 주는 걸로 변경 함. 


꼼수로.. 하이버네이트와 Neo4j를 같이 써볼려고 했는데..

Neo4j로 쓰는 도메인과 하이버네이트로 쓰는 도메인은.. Neo4j에서 참조가 안되는 관계로 포기.


예를 들어 Neo4j 는 '학교' 이고 하이버네이트가 '학생'일때 '학교'는 '학생'을 참조하고 있으면 에러남..

당연한 이야기긴 한데.. 뭔가 GORM에서 해결했을것 같은 느낌이 들어서 시도해봄...


아 그리고 User 클래스 만들어 주는 템플릿은 스프링 시큐리티 프러그인 내에 "Person.groovy.template"로 존재함.