본문 바로가기

2018/09

(Pytest) mongoengine + factoryboy 조합으로 사용할 때, 데이터 리셋시키기 mongoengine + factory boy 조합 문제점 원래 factoryboy를 쓰면, 테스트 데이터가 롤백된다. 그런데 mongoengine을 factory boy로 매핑해서 사용하면, 데이터가 롤백되지 않는다. mongo에 테스트 데이터가 계속 쌓인다. 해결방법 테스트코드가 돌때마다 몽고 디비를 drop 시키면 된다. ( 이렇게하면 몹시 느리다 ㅋ ) A. 몽고 DB Drop fixture 만들기 ### FILE: fixtures.py import pytest import mongoengine as me @pytest.fixture(scope=’function’) def mongo(request): db = me.connect(‘testdb’, host=’mongodb://localhost’) ..
(Draw.io) 온라인 다이어그램 툴 https://www.draw.io/여기 들어가서 그리면 된다 ㅎㅅㅎ XML으로 저장해두고, 나중에 재수정해서 쓸 수도 있다. 요런식으로 그려다가 쓰면 된다 ㅎㅅㅎ
(ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 4 ) - 안티패턴과 멱등성 관리 이 글은 [elastic] Keeping Elasticsearch in Sync 문서를 정리한 글 입니다 ㅎㅅㅎ 엘라스틱서치에 원본 데이터를 싱크할 때, 주의해야하는 점이 있다. Why Marking Source Records is an Anti-Pattern엘라스틱서치 인덱싱 필요 여부를 체크하는 방법 중, 원본 테이블에 필드를 하나 추가하는 방법이 있다. 그런데 이건 안티패턴이다. 하면 안된다. 안티패턴인 이유 1. 엘라스틱서치 데이터 복제와 원본 데이터 간의 커플링이 높아진다. 그러면 유지보수가 어렵다. - 장애로 실제 인덱싱 여부와 원본 데이터에 저장된 인덱싱 여부가 달라질 수도 있다. 2. 전체 테이블을 재인덱싱해야하는 경우, 전체 테이블을 업데이트해줘야한다. UPDATE SET reindex=..
(ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 3 ) - Batching Based on Ranges 이 글은 [elastic] Keeping Elasticsearch in Sync 문서를 정리한 글 입니다 ㅎㅅㅎ 이전글 ((ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 2 ))에서는 계속 변경되는 데이터를 엘라스틱서치에 싱크하는 방법에 대해서 설명했다.이번에는 Immutable한 데이터를 엘라스틱서치에 추가하는 방법에 대해서 설명하고자 한다. Batching Based on RangesImmutable한 데이터의 예시로는 로그가 있다. 로그는 한번 추가되어도, 변경되지 않는 데이터다. 그래서 이 경우에는 ElasticSearch에 Insert만한다. Update는 필요하지 않다. 이 경우, 큐를 이용해서 배치에 사용될 데이터를 가져오는건 오버스펙이다. 단순하게, 데이터를 가져와야하는 범위..
(ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 2 ) - Using Queues to Manage Batches 이 글은 [elastic] Keeping Elasticsearch in Sync 문서를 정리한 글 입니다 ㅎㅅㅎ 이전 글에서는 엘라스틱서치에 저장된 문서를 업데이트할 때, Batch로 한번에 업데이트하는게 효과적이라는 내용을 살펴봤었다. - (ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 1 ) 이번 글에서는 Batch로 한번에 업데이트할 문서 정보들을 원본 데이터에서 가져오는 방법에 대해서 정리해보려고 한다. Using Queues to Manage Batches배치로 데이터들을 일괄 업데이트하려면, 수정해야하는 데이터들만 골라서 가져와야한다. 이 때 큐를 사용하면 효율적으로 관리할 수 있다. 큐 대기열을 관리할 저장소로는 SQL 테이블, Redis Sorted Set 등을 사용할 수 있..
(ElasticSearch) 엘라스틱서치에 데이터 싱크하기 ( 1 ) - The Problems of Too-Frequent Updates and Non-Batch Updates 이 글은 [elastic] Keeping Elasticsearch in Sync 문서를 정리한 글 입니다 ㅎㅅㅎ ElasticSearch은 검색엔진 목적으로 많이 사용된다. 그래서 원천 데이터들은 RDB / NoSQL DB에 저장하고, 제2의 데이터 저장소로 ElasticSearch를 사용하는 경우가 많다. 그래서 원천 데이터를 ElasticSearch으로 옮기는 작업이 필요하다. 이 글에서는 DB와 엘라스틱서치를 효율적으로 싱크시키는 방법에 대해서 정리하고자 한다. 데이터를 복제뜨는 방법은 크게 2가지가 있다. A. 실시간으로 데이터 싱크하기 ( sync )B. 배치로 데이터 싱크하기 ( async ) A. 실시간으로 데이터 싱크하기 문제 1 - 엘라스틱서치 트래픽 증가건바이건으로 엘라스틱서치 데이터를..
(Django) Rest Frame Work Filter 활용하기 FilterBackend 사용하기ViewSet에서 Request 파라미터로 받은 값이랑 일치하는 데이터를 조회해야할 때, 아래처럼 일일히 파라미터를 받아다가, filter 조건에 추가해줘야한다. class ProductList(generics.ListAPIView): serializer_class = PurchaseSerializer def get_queryset(self): """ This view should return a list of all the purchases for the user as determined by the username portion of the URL. """ category = self.kwargs['category'] in_stock = self.kwargs['in_s..
(PostgreSQL) Default 값이 있는 새로운 필드 추가하기 Default 값이 있는 새로운 필드 추가하기ALTER TABLE orders ADD COLUMN price bigint NOT NULL DEFAULT 0; PostgreSQL 10 이하 버전에서는 테이블에 Default 값이 있는 필드를 추가할 땐 주의해야한다. Default값이 있는 필드를 추가할 때, 테이블을 다시 만들어내기 때문이다!그러면 시간도 오래걸리고, ACCESS EXCLUSIVE LOCK도 잡게 된다. ( 참고 - Fast Column Creation with Defaults )ACCESS EXCLUSIVE LOCK이 걸려있는 동안, 이 테이블에 대한 모든 트랜잭션은 BLOCK된다! SELECT 쿼리까지 막힌다! ( ACCESS EXCLUSIVE LOCK LEVEL은 LOCK LEVEL ..