Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Logstash
- aws
- 카프카
- statestore
- kafkastream
- Elk
- coursera
- avo
- scala
- Spring
- springboot
- spring-kafka
- RabbitMQ
- 플레이 프레임워크
- kafka streams
- kafkastreams
- scala 2.10
- Elasticsearch
- spring-cloud-stream
- spring-batch
- confluent
- Kafka
- enablekafkastreams
- reactive
- kafka interactive query
- Slick
- schema registry
- 한빛미디어
- gradle
- play framework
Archives
- Today
- Total
b
조금 더 나아지는 Domain Class 본문
과거의 기록
domain 패키지에는 도메인 클래스와 UseCase등의 interface를 위치하고, infra 패키지에는 실제 인프라스트럭쳐와 연동되는 구현코드가 위치했다.
원칙적으로는 domain package는 pure 해야 한다. 하지만 아래의 MessageProducer class는 POJO임에도 불구하고, Domain 에 포지셔닝 하고 있음에도 springframework 의 SendResult에 의존을 가지고 있었다.
package vine.eda.gateway.domain.messaging;
import org.springframework.kafka.support.SendResult;
import java.util.concurrent.CompletableFuture;
public interface MessageProducer<K, V> {
CompletableFuture<SendResult<K, V>> send(K key, V value);
}
package vine.eda.gateway.infra.kafka.producer;
public class KafkaMessageProducer<K, V> implements MessageProducer<K, V> {
@Override
public CompletableFuture<SendResult<K, V>> send(K key, V value) {
//
}
}
이와 유사한 Kafka Producer를 구현해야 하는 일이 최근에 있었는데 좀 더 개선을 하였다.
package push.domain.result;
public interface ResultPublisher<K, V, R> {
void publish(K k, V v);
R publishAndReceive(K k, V v);
}
----
package push.outbound.kafka;
...
public class KafkaResultProducer implements ResultPublisher<Long, String, CompletableFuture<SendResult<Long, String>>> {
private final KafkaTemplate<Long, String> template;
private final String topic;
public KafkaResultProducer(KafkaTemplate<Long, String> template, String topic) {
this.template = template;
this.topic = topic;
}
@Override
public void publish(String key, String value) {
}
@Override
public CompletableFuture<SendResult<Long, String>> publishAndRecive(Long key, String value) {
return toCompletableFuture(template.send(topic, k, v));
}
}
가능하면 generic의 사용범위도 최소화 하고 싶지만, domain package에서 framework 의존성을 제거하기 위해 이런식으로 처리했다.
Comments