b

조금 더 나아지는 Domain Class 본문

카테고리 없음

조금 더 나아지는 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 의존성을 제거하기 위해 이런식으로 처리했다.

 

Comments