데이터 검색Query대신 Filter 사용filter는 _score를 사용하지 않기 때문에 query에 비해 속도가 빠르다.필터는 오직 결과가 검색과 일치하는지만 관심을 가진다는 것이다. 결과적으로 다른 쿼리보다 빠르고 쉽게 캐시에 저장할 수 있다.필터 결과는 점수에 의해 정렬되지 않는다. (모든 결과에 대한 점수가 1.0이기 때문)_score : 문서가 지정한 조건과 얼마나 유사한지 평가 실시간 VS 준 실시간ID로 문서를 조회하는 것은 쿼리 검색보다 훨씬 빠르다. 실시간에 준하는 검색 속도를 보장한다.그에 반해 쿼리 검색은 준 실시간이다. 기본값으로 매초 발생하는 리프레시를 기다려야 하기 때문이다. [리프레시 설정 값]"index.refresh_interval": "5s" ulimit데이터가 많아지면..
한번에 대량의 데이터를 저장해야 하는 경우가 있을 것이다.예를 들어 엑셀 업로드 하면 해당 데이터들을 DB에 저장해야 한다.데이터가 3만 건 존재한다고 했을 때 어떻게 처리 해야 할 것인가? 먼저 주의점에 대해서 나열해보자.3만 건의 데이터를 영속화 한 뒤 flush 하는 방법은 과연 괜찮을까? 메모리가 충분하다면 3만 건 데이터는 문제 없이 처리될 것이다. 다만, 그 이상의 데이터를 영속화 하게 된다면 out of memory 예외를 만나게 된다.많은 데이터를 영속화해서 flush 하면 메모리 오류가 나니~ 건건이 영속화하고 flush 하면 되겠네? 라고 생각하면 이 또한 큰 오산이다. 처리 속도도 오래 걸릴 뿐더러 데이터 양만큼의 통신이 발생하기 때문에 비효율적이다.그럼 방법이 뭔데?의외로 해답은 단..
Spring Data 프로젝트 하위에 Spring Data JPA가 존재JPA를 쉽게 사용할 수 있도록 제공해 주는 프로젝트이다. "쉽게 사용할 수 있다" 의미?대게 DB관련 로직이 있는 데이터 계층에 select, insert, update, delete와 같은 코드를 반복적으로 작성한다.Spring Data JPA에서는 이런 지루하고 반복적인 작업을 인터페이스 선언만으로 해결하였다. JpaRepository 인터페이스를 상속하면 된다. 인터페이스만 선언해서 어떻게 해결했지? 라는 의문점이 들 수 있을 것이다. Spring Data JPA에서는 런타임 시점에 구현 객체를 동적으로 생성해준다. (JDK Dynamic Proxy 이용)12public interface SDTRepository extends..
pom.xml 에 여러 개의 dependency 설정을 했을 때 각 라이브러리가 참조하는 라이브러리 중 버전이 충돌하는 경우가 있다.예를 들어 다음과 같이 hystrix-core 라이브러리는 commons-logging 1.1.1 버전을 참조하고 있고httpcomponents 라이브러리는 commons-logging 1.2 버전을 참조한다. 12hystrix-core -> commons-logging:1.1.1httpcomponents -> commons-logging:1.2cs 이처럼 두 개의 서로 다른 버전을 참조하고 있을 때 maven은 root 레벨과 가장 가까운 라이브러리를 선택하게 된다.이게 무슨 의미냐 하면mvn dependency:tree 명령을 치면 pom.xml 에 선언되어 있는 의존성..
로컬환경에서 개발 할 때 가끔 패킷을 보고 싶을 때가 있다. (로컬 -> 로컬 통신)패킷 캡쳐를 할 때 대게는 wireshark를 많이 이용한다. 허나 해당 프로그램은 loopback 인터페이스에 대한 캡쳐가 불가능하다.그래서 찾아보니 RawCap 이란게 있더라http://www.netresec.com/?page=RawCap 위의 페이지에 들어가서 RawCap.exe 파일 다운로드 받고 다음과 같이 실행하면 된다.1234C:\Users\nklee\Desktop>RawCap.exe 127.0.0.1 test_catpture.capSniffing IP : 127.0.0.1File : test_catpture.capPackets : 100Colored by Color Scriptercs 실행 후 캡쳐된 tes..
elasticsearch-head 플러그인 기능1234클러스터 상태생성된 index, type 정보Document 데이터데이터 조회 (Query DSL)cs 플러그인 설치1./plugin install mobz/elasticsearch-headcs 설치가 완료되면 elasticsearch 재기동 후 다음의 URL에 접속해 보자.http://127.0.0.1:9200/_plugin/head/ 다음과 같이 클러스터에 포함되어 있는 노드들이 보일 것이다.노드 이름 앞에 별이 있는 녀석이 마스터이다. 샤드가 어떤 노드에서 관리되고 있는지를 확인하고 싶다면 다음의 URL을 호출해 보자.http://localhost:9200/_cat/shards?v
클러스터 구성은 Elasticsearch 2.4.6 기준으로 작성한다. https://www.elastic.co/downloads/past-releases 페이지에서 Elasticsearch 2.4.6 버전을 다운로드 받는다. (tar 파일)검색 필터를 이용해서 원하는 제품과 버전을 빠르게 찾을 수 있다. 다운로드 받은 tar파일을 압축해제 하면 설치 끝이다.Elasticsearch 서비스를 구동하려면 /bin/elasticsearch 를 실행하면 된다.백그라운드 실행할 때에는 /bin/elasticsearch & 와 같이 하도록 하자. 구성은 한 장비에 3개의 Elasticsearch node를 실행할 것이다.master node : nklee-data-node1data node : nklee-data..
Elasticsearch는 Lucene 기반의 오픈 소스 검색엔진실시간 검색, 분석 지원분산 환경 지원트랜잭션을 제공하지 않음업데이트가 빈번하게 발생한다면 다른 NoSQL을 사용RESTFul 기반 JSON 메시지 사용 (어느 시스템이나 연동하기 쉽게) Cluster여러 개의 노드를 하나의 그룹으로 묶어서 서비스 Master node노드 관리고사양 컴퓨터 아니어도 된다. Data node검색, 색인 처리 (색인은 인덱스를 만드는 과정)고사양 컴퓨터 권장 Client nodeREST 지원검색에 대한 로드 분산 처리 Shard인덱스의 조각데이터 분산 ReplicaShard의 복제본검색할 때 이용하기도 하며 Replica Shard라고도 불린다. IndexRDB의 데이타베이스와 유사하다. TypeRDB의 테이블..
엔티티 클래스에 lombok을 사용하면 StackOverflowError 오류가 발생할 수 있다. 다음과 같은 엔티티 연관 관계가 있다고 하자.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455@Data@Entityclass LMember { @Id @Column(name = "MEMBER_ID") private int id; private String name; @OneToMany(fetch = FetchType.LAZY, mappedBy = "lMember", cascade = CascadeType.ALL) private List phoneList = new ArrayLi..
JPA를 적용하고 나면 애플리케이션의 트랜잭션 처리가 정상 동작되는지 확인해 볼 필요가 있다.예외가 발생했을 때 rollback 이 되는지를 확인하는 절차가 될 것이다. 스프링에서 지원하는 @Transactional을 이용해 보자.@Transactional 은 선언적 트랜잭션이라 부른다.클래스, 메서드위에 @Transactional 이 추가되면 프록시 오브젝트가 생성되어 요청이 들어왔을 때 이를 가로채고 트랜잭션 처리를 해준다. (메서드 동작 전, 후 처리) 예를 들어 사용자가 회원 정보 수정을 했다고 하자. 처리 순서는 다음과 같을 것이다.1. 사용자가 주소 정보 변경 후 "수정" 버튼 클릭2. 스프링의 Controller -> Service 호출 (updateMember 메서드 위에 @Transact..
fetch 조인을 통해 N+1 문제 해결 방안에 대해서 알아보도록 하자.다음과 같은 테이블 관계가 있다.[테이블 구조]12345678910111213141516create table nplus_order ( id integer not null, primary key (id)) create table nplus_shipping ( id integer not null, order_id integer not null, primary key (id)) create table nplus_order_product ( id integer not null, order_id integer, primary key (id))Colored by Color Scriptercs [엔티티 연관 관계]12345678910111213..