전체 글
Elasticsearch에서 Dictionary 변경 시 analyzer와 인덱싱된 Document 갱신 방법
Elasticsearch에서 Dictionary를 사용하여 analyzer를 만들고 그를 사용해서 index에 Document를 인덱싱할 수 있다. 근데 Dictionary가 변경되면 analyzer를 변경하고 indexing된 document를 갱신하려면 어떻게 해야하는지 정리해보자. Background 지식 Analyzer는 character filter, tokenizer, token filter 순서대로 적용한다. 기본적으로 anaylyzer는 indexing time과 search time에 적용된다. index time 분석 대상은 source data(원본 데이터)이고 search time 분석 대상은 query string이다. 그러므로 사전을 변경하는 것은 indexing, serchin..
백준 4673번 셀프 넘버
1 ~ 10000까지의 숫자중에 셀프 넘버가 아닌 데이터를 noSelfNumber에 집어넣고 loop를 순회하면서 selfNumber 여부를 체크하면 된다. 간단한 문제이다. https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다..
[번역] Elasticsearch 퍼포먼스 튜닝 방법 - ebay
Elasticsearch에 대해 검색하다가 ebay에 퍼포먼스 튜닝방법에 대해 좋은 글이 있어서 간단하게 정리해봤다. 새롭게 알게된 사실이 많아서 좋았다. 정리 잘된 기술 블로그를 보는것은 책을 읽는거보다 훨씬 유익한 경우가 많은 것 같다. Elasticsearch 엘라스틱 서치는 아파치 루씬을 기반으로한 검색과 분석 엔진으로 데이터를 실시간에 가깝게 보여주고 분석해 준다. 실시간성으로 분석과 검색을 위해서 많이 사용되는 엘라스틱 서치의 퍼포먼스는 무엇보다 중요한데 이를 위한 퍼포먼스 튜닝방법을 정리해보자. 높은 엘라스틱서치의 퍼포먼스를 위해서는 많은 처리량, 낮은 검색 지연시간등이 요구된다. 고효율성 Elasticsearch를 위한 솔루션 - 효율 적인 인덱스 디자인 인덱스를 설계하다보면 하나의 인덱스..
Elasticsearch template를 일별 index 구성하기
Elasticsearch를 이용해서 로그기록을 많이한다. 일별 로그성 인덱스를 자동으로 만들기 위해 template를 사용해서 구성하는 법을 정리해보자. 우선 매일 새롭게 생성될 index에 대한 template를 생성해보자. template 생성 PUT _template/wedul_log_* { "index_patterns": [ "wedul_log_*" ], "mappings": { "_doc": { "dynamic": false, "properties": { "id": { "type": "integer" } } } } } 생성한 템플릿이 잘 만들어졌는지 확인해보자. 확인 GET template/wedul_log* 그럼 이제 wedul_log라는 대표 인덱스를 생성해주고 template에 맞는 일자별..
Elasticsearch에서 reindex를 이용해서 매핑정보 변경하기
Elasticsearch에서 index를 구성하다보면 매핑정보를 추가하거나 수정하고 싶을때가 있다. 내가 아는 내에서는 한번 생성된 index의 매핑정보를 변경하는건 어렵다. 그래서 reindex를 통해 index의 매핑정보를 변경해줘야한다. 우선 wedul_mapping이라는 인덱스가 있다고 해보자. 매핑 정보는 다음과 같다. PUT wedul_mapping { "mappings": { "_doc": { "dynamic": "false", "properties": { "id": { "type": "integer" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } } } 이때 name에서 keyword필드를 ..
ffmpeg로 동영상 정보 추출 및 썸네일 가져오기
ffmpeg로 동영상 정보 추출과 썸네일을 가져올 수 있다. 간단하게 설치하고 cli를 통해 진행해보자. 설치 우선 mac os인경우 brew install ffmpeg로 설치하고 linux인 경우 sudo apt-get install ffmpeg로 설치하면 되다. 동영상 정보 가져오기 (ffprobe) ffmpeg에서 ffprobe를 이용해서 동영상 정보를 추출 할 수 있다. print_format옵션을 사용하여 json 형태로 출력이 가능하다. 만약 프로그램에서 사용 시 node에서는 child_process를 이용해서 실행 수 결과를 받아서 사용하면 된다. ffprobe -v quiet -print_format json -show_format -show_streams wedul.mp4 썸네일 만들기..
DDD. 응용서비스 코드 규칙과 트랜잭션 관리
도메인 응용서비스 관련 내용을 진행하기 전에 도메인에 대해 간단하게 정리해보자. 응용서비스에서 가장많이 사용하게 되는 부분은 도메인이다. 도메인에서 담당하는 역할은 도메인 내부에 있어야한다. 특히 도메인의 데이터를 조작하는 경우에는 도메인을 사용하는 응용서비스 영역에 배치되게 되면 응용서비스 영역에서 사용할 때마다 중복코드가 발생할 간으성이 크다. (도메인 관련 validation 체크도 도메인 내부에서 진행하는 것을 추천) 응용서비스 응용서비스는 표현영역과 도메인 영역을 연결하는 매개체 역할을 하는데 이는 디자인 패터의 파사드(Fasade)패턴과 같다. 응용서비스의 크기 응용서비스는 보통 다음 두가지 방법 중 한가지 방식으로 구현한다. 1. 한 응용서비스 클래스에 회원 도메인의 모든 기능을 구현한다. ..
DDD. 애거리루트 정리
애그리거트는 관련된 객체를 하나의 군으로 묶어주는 것 으로 상위수준에서 모델을 조망하는 방법 중 하나이다. 애그리거트는 비슷한 속성을 가진 객체를 묶어놓은 것을 의미한다. 예를 들어 주문 시스템에 주문 관련 애그리거트는 Order, Receiver, OrderLine.. 등이 있고 회원정보에는 Member, MemberInfo등으로 나눌 수 있다. 각 애그리거트에 연관된 객체를 담고 있으며 유사하고 동일한 라이프 사이클을 보유하고 있다. 애거리거트 루트 애그리거트에서 가장 핵심이 되는 주체 즉, 애그리거트 전체를 관리하고 책임지는 주체를 애그리거트의 루트 엔티티라고 한다. 애그리거트내에 존재하는 모든 엔티티는 루트 엔티티와 직간접적으로 연결되어있다. 애거리거트 루트의 핵심 역할은 애거리거트의 일관성을 유..
Redis Cluster mode에서 mget, mset, pipeline과 같은 멀티 키 명령어 사용하기.
redis에 만약 200 ~ 300개가 넘는 캐시 정보를 계속 request를 날리면 레이턴시가 발생할 가능성이 크기 때문에 이런경우에 mget, mset, pipeline 등 멀티키 명령어를 사용한다. 하지만 redis가 single mode일 때는 아무 상관이 없지만 cluster mode인경우에는 다음과 같은 오류를 발생 시킨다. "CROSSSLOT Keys in request don't hash to the same slot" 무슨 오류일까?? 처음에 redis가 싱글모드로 돌고 있던 stage에서 테스트를 해서 정상적으로 멀티키 명령어가 잘 되는줄 알고 배포 했다가 라이브에서 위와 같은 오류가 발생했다... 너무 당황해서 바로 수정했다. 무엇이 문제 였을까? 하면서 문서를 찾아보니 redis에는..
DDD. DIP 의존 역전 원칙
서비스가 특정 시스템에 의존성을 가지게 되면 서비스 자체만으로 테스트 수행이 어렵고 종속되는 시스템에 따라 서비스의 코드가 지속적으로 변경될 여지가 있다. 이를 해결하기 위해서 DIP개념을 사용할 수 있다. DIP 제품의 할인율을 구하는 서비스가 있다고 가정해보자. 이 서비스는 의미 있는 단일 기능을 제공하는 고수준 모듈이다. 그리고 이 고수준 모듈의 기능 구현을 위해서 현재 가격과 할인 %등을 구하는 여러 하위 기능이 필요하다. 이때 이 기능들은 하위 기능을 실제로 구현한 저수준 모듈이라고 한다. 고수준 모듈이 저수준 모듈 여러개의 의존성을 가지게 된다면 테스트와 여러 기능 수정 때마다 변경이 생긴다. 그럼 이를 해결하기위해서는 저수준 모듈이 고수준 모듈을 의존하게 만들어야 하는데 이를 위해서는 추상화..