전체 글 194

Akka Stream을 이용한 Kafka Producer 개발

Akka Stream을 이용한 Kafka Producer 개발 Referencehttps://doc.akka.io/docs/akka-stream-kafka/current/producer.html - Kafka Library에서 KafkaProducer를 이용한다. Settingsprotected final ProducerSettings producerSettings = ProducerSettings .create(system, new ByteArraySerializer(), new StringSerializer()) .withBootstrapServers("localhost:9092"); 필요한 정보- Kafka BootstrapServer- Key/Value Serializer Configuration..

Programing/Akka 2018.06.02

Transactional with jpa repository

interface SampleRepository {} interfaces SampleJpaRepository implements JpaRepository, SampleRepository {} @Autowiredprivate SampleRepository sampleRepositry; - SampleRepositry라는 인터페이스를 두고 실제 SampleJpaRepository 구현체를 따로 두는 형식으로 구현을 할수가 있다.- 구조는 Domain Driven Design에서 인프라 설계부분 (여기에서는 JPA를 Infra라고 볼수 있다)을 인터페이스 두고 구현을 한 예제이다. 위의 코드는 비즈니스 로직을 작성을 할때 문제점이 발생이 될수가 있다.- 실제 Transaction은 SampleJpaRepost..

Database/JPA 2018.05.28

Database Transaction Lock With JPA

Database Transaction Lock With JPA데이터베이스의 Transaction Lock은 두가지 방식이 있다. 1. 낙관적 잠금- 다른 transaction이 수정이 할수가 있다.- version 컬럼을 두어 version 이 달라지는 경우 충돌을 알려준다.- JPA에서의 @Version 기능, 버전이 달라질 경우에는 OptimisticLockException 에러가 발생이 된다. @Lock Annotation- LockModeType.OPTIMISTIC- LockModeType.OPTIMISTIC_FORCE_INCREMENT - 업데이트가 되지 않는 경우에 강제로 version을 +1를 더한다. - 1:N의 구조의 데이터 인경우는 N에 해당하는 데이터를 추가할때 1에 해당하는 데이터가..

Database/JPA 2018.05.28

Persistence Actor

Persistence Actor- Actor를 이용하여 비즈니스 로직을 구현을 할때, Actor가 상태를 필요한 경우가 있을수 있다. 이런 경우에는 Akka의 Persistence 기능을 이용하여 구현을 할수가 있다.- 상태를 저장하는 방식을 2가지 방식이 있다. (Event Sourcing) - 상태의 데이터를 그대로 저장하는 방식. - 상태의 데이터를 변환하는 과정을 저장을 하는 방식 (Append)- Event Sourcing 관련 내용 : https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj591559(v=pandp.10)Gradledependencies { compile group: 'com.typesafe.akka', name: 'akk..

Programing/Akka 2018.05.27

로그성 데이터의 날짜 기반의 index 설계

- 주로 Elastic Search를 사용하는 use-case가 로그 분석, 사용자 행동 분석 등을 사용한다.- 하지만 로그 분석 등의 데이터는 규모가 따라 다르지만 양이 생각보다 많다.- Document를 지우는것은 비용이 비싼 연산에 포함이 된다.- Document를 지우는 것보다는 Index를 삭제하는 것이 싼 연산이다.- 따라서 index 이름에 날짜를 포함시켜 시간이 지난 index는 삭제하는 방법이다 좋다.- index의 Type Mapping은 Template 기능을 이용하면 된다. ex)server_log-2018.01.01server_log-2018.01.02....

term aggregation 기능 사용하기

- SQL의 Group by의 기능을 필요하다면 Terms Aggregation을 사용하면 된다.- AVG, MAX 등의 데이터는 Metric Aggregation을 참고를 하면 된다- SQL의 distinct 기능으로 활용될수도 있다. - 참고자료 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html - Example SQL SampleSELECT genre, count(*) FROM docs GROUP BY genre - Term Aggregation QueryGET /_search{ "aggs" : { "genres" : { "terms" : { ..

_source를 이용하여 원하는 필드만 선택하기

- ElasticSearch Query를 사용하다보면 필요한 데이터만 가지고 오고 싶을때가 있다. 그럴 경우에는 "_source" 필드를 사용하여 데이터를 선택할수가 있다.- 하나의 데이터가 큰 경우에는 _source를 이용하여 네트워크 비용을 줄일수가 있다.- 참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html - 필드를 선택을 하지 않는 경우 GET /_search{ "_source": false, "query" : { "term" : { "user" : "kimchy" } }} - nested 구조의 필드를 선택하는 경우GET /_search{ "_source":..

변수 이름은 정직하게 가는 것이 좋다.

변수 이름은 정직하게 가는 것이 좋다. 예를 들어 카테고리 1번 depth의 이름과 id를 변수 이름을 짓는다고 한다고 하면 아래와 같이 이름을 지을수 있을 것이다.- cate1id- cate1name 위와 같은 이름 보다는 아래와 같은 이름이 좀더 더 정확하게 의미가 전달이 된다.- category1DepthId- category1DepthName 데이터의 전달(json 형태의 message)에서는 크기를 줄여야 한다면 (보통 저정도 크기가 영향을 미치지를 않는다.)JsonProperty (ObjectMapper 인경우) 를 적용하여 실제 JSON를 맵핑하는 필드는 다르게 설정하는것이 낫다.

NoSQL DB의 1:N 데이터의 구조의 설계 방법의 종류

1:N 데이터의 구조의 설계 방법의 종류- Embedded Data Model- 1:N 구조의 데이터를 하나의 document로 표현하는 방법- 데이터의 용량이 커지는 경우에는 문제가 될수가 있다.- Normalized Data Model- 1:N의 구조를 데이터를 분리하여 저장을 하는 방법.- 기존 RDB에서 설계하는 방법과 동일하다.- nosql 에서는 join 기능이 제공을 하지 않기 때문에 application level에서 처리를 해줘야 한다. 설계 선택?- 데이터의 형태에 따라 구조를 다르게 설계를 하면 될듯.- Embedded Data Model를 가능 경우에는 하나의 Document가 비대해지것은 막기 위한 로직도 필요하다고 생각된다.

Database 2018.05.22

Elastic Search Nested Query

Nested Query- document에서 list의 object가 있는 구조- 일반적인 DB에서의 1:N 구조를 하나의 document에 포함시키는 구조로 갈수가 있다. Nested MappingPUT /my_index{ "mappings": { "type1" : { "properties" : { "obj1" : { "type" : "nested" } } } }}- Type : nested GET /_search{ "query": { "nested" : { "path" : "obj1", "score_mode" : "avg", "query" : { "bool" : { "must" : [ { "match" : {"obj1.name" : "blue"} }, { "range" : {"obj1.count" :..