카테고리 없음
조금 더 나아지는 Domain Class
dev.bistro
2019. 5. 30. 09:29
과거의 기록
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 의존성을 제거하기 위해 이런식으로 처리했다.