Programing 101

Akka Stream 기본 개념 Source, Sink, Flow

Akka Stream 기본 개념 Source, Sink, FlowSource- 하나의 아웃풋(output), 데이터를 발생시켜 다운스트림으로 흐리게 한다- 데이터가 발생되는 점이라고 생각하면 된다.- 예를 들어 Kafka 등 MQ에서 데이터를 받을수 있다.- 파일, List, Queue 등을 원천으로 할수 있다.Sink- 하나의 인풋(input)- 데이터가 끝나는 지점, 데이터를 처리하는 지점- 데이터의 결과값을 CompletionStage객체로 받을수가 있다.- 예를 데이터를 들어오는 MySQL에 저장을 한다. Flow- 하나의 인풋(input)과 하나의 아웃풋(output)- 데이터의 Transform(변경)이 된다.- 예를 데이터를 다른 형태의 데이터를 컨버팅을 한다. RunnableGraph- S..

Programing/Akka 2018.06.29

Spock Framework을 이용한 Unit test 작성

Spock Framework을 이용한 Unit test 작성Java Application을 개발하면서 Unit Test를 작성을 할때 jUnit과 Mockito를 이용하여 작성을 할수도 있지만 테스트 코드만 다른 코드로 간다면 좀더 쉽게 Unit Test를 작성을 할수 있다. 그 중에 Groovy를 언어를 이용한 Test 코드 작성에 대해 알아보자. Reference- http://spockframework.org/spock/docs/1.1/index.html gradleapply plugin: "groovy" .... compile "org.codehaus.groovy:groovy-all:2.4.15"testCompile "org.spockframework:spock-core:1.1-groovy-2.4..

Programing/Java 2018.06.25

Java Stream을 이용한 Inner Join / Left Join 기능

Java Stream을 이용한 Inner Join/Left Join 기능 - NoSQL Database를 사용하다보면 Join 기능이 없기 때문에 Application에서 Join 기능을 만들어야 된다.- Java Stream을 이용하여 손쉽게 inner join/left join을 할수 있게 구현을 할수 있다.- 저장되어 있는 DB가 서로 다른 경우에도 inner join/ left join 가능하다. ex) mysql에서 유저 정보를 가지고 와서 redis에 있는 주문 정보를 조회할수 있는 구조에서의 join 기능을 구현, batch job을 통한 데이터 추출 등..Data Class@Getter@AllArgsConstructor(staticName = "create")static class User..

Programing/Java 2018.06.18

객체지향 응집도와 결합도

객체지향적으로 모듈은 응집도가 높고, 결합도가 낮을수록 좋은 코드이다. 코드를 작성을 할때 자신의 작성하는 코드가 좋은 코드인지 나쁜 코드인지를 판단을 할수 있는 기준이 될수 있다. 응집도가 높은 코드, 결합도가 낮은 코드는- 이해하기가 쉽다- 수정하기가 쉽다- 하나의 모듈에서 다른 모듈에서의 코드 연관이 많이 없다.- 하나의 모듈 단위를 지웠을때 다른 모듈의 코드를 수정하지 않아도 된다.- 하나의 기능을 수정한다면 하나의 모듈만 수정을 하면 된다. 응집도가 낮은 코드, 결합도가 높은 코드는- 이해하기가 어렵다- 수정하기가 어렵다- 하나의 모듈 단위에서 다른 모듈 단위에서서의 코드 연관이 많이 있다.- 하나의 모듈 단위를 지웠을때 다른 모듈의 코드를 수정을 해야 된다.- 하나의 기능을 수정할려고 하면 여..

Programing 2018.06.13

Akka Stream Graph DSL를 이용한 Broadcast/Merge 기능 구현

Akka Stream Graph DSL를 이용한 Broadcast/Merge 기능 구현- Data stream 기능을 개발을 하다보면 같은 데이터를 Broadcast로 보내고 분석해야 되는 경우가 있다.- 또 다른 경우에는 데이터를 하나로 합치는 Merge 기능이 필요할때도 있다.- Akka Stream에서는 GraphDSL를 이용하여 Broadcast/Merge 기능을 제공한다. gradledependencies { compile group: 'com.typesafe.akka', name: 'akka-stream_2.12', version: '2.5.13'}Reference- https://doc.akka.io/docs/akka/2.5/stream/stream-graphs.html Example fin..

Programing/Akka 2018.06.02

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

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

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

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

Akka Cluster

Akka Cluster시작하기전에 Gradle 라이브러리 추가compile group: 'com.typesafe.akka', name: 'akka-cluster_2.12', version: '2.5.6'Simple Configurationapplication.confakka { actor { # cluster mode로 실행을 의미 provider = "cluster" } # 원격 접근을 위한 설정 remote { log-remote-lifecycle-events = off netty.tcp { # local로 실행할때에는 127.0.0.1이지만 실제 배포시에는 hostname을 변경해줘야된다. hostname = "127.0.0.1" # 0 - Random Port port = 0 } } # 클러스터 ..

Programing/Akka 2017.10.22

Attribute Converter를 이용한 커스텀 컬럼 사용하기

Attribute Converter를 이용한 커스텀 컬럼 사용하기데이터를 저장할때 사용하는 방식으로 JSON 방식으로 사용하는 경우가 많다. DB에서 데이터를 읽을 때에는 객체로 변환하고 저장할때에는 스트링 형태로 다시 변환하는 과정이 필요하다. JPA의 Attribute Converter를 이용하면 이러한 과정 없이 Repository에서 읽어들인 값을 이용하여 바로 객체로 변환할수가 있다.Json Object@JsonIgnoreProperties(ignoreUnknown = true)public class EventData { private String name; private String password;}Converter@Converterpublic class EventDataConverter i..