{"id":1550,"date":"2021-01-02T08:34:57","date_gmt":"2021-01-01T23:34:57","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1550"},"modified":"2021-01-02T09:06:18","modified_gmt":"2021-01-02T00:06:18","slug":"spring-boot-kafka-json-%eb%8d%b0%ec%9d%b4%ed%83%80-%ec%a0%84%ec%86%a1%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1550","title":{"rendered":"Spring Boot Kafka Json \ub370\uc774\ud0c0 \uc804\uc1a1\ud558\uae30"},"content":{"rendered":"<h1>Spring Boot Kafka Json \ub370\uc774\ud0c0 \uc804\uc1a1\ud558\uae30<\/h1>\n<h2>application.yml \uc124\uc815<\/h2>\n<pre><code class=\"language-yaml\">spring:\n  kafka:\n    bootstrap-servers: 192.168.0.9:9092<\/code><\/pre>\n<h2>\ub370\uc774\ud0c0 class \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@Getter\n@Setter\n@NoArgsConstructor\npublic class StockChange {\n\n    String yyyymmdd;\n    String skuCd;\n    String fieldName;\n    int diff;\n\n    @Builder\n    public StockChange(String yyyymmdd, String skuCd, String fieldName, int diff) {\n        this.yyyymmdd = yyyymmdd;\n        this.skuCd = skuCd;\n        this.fieldName = fieldName;\n        this.diff = diff;\n    }\n}<\/code><\/pre>\n<h2>Configuration \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@Configuration\npublic class KafkaStockChangeProducerConfig {\n\n    @Value(&quot;${spring.kafka.bootstrap-servers}&quot;)\n    private String bootstrapServers;\n\n    @Bean\n    public ProducerFactory&lt;String, StockChange&gt; producerFactory() {\n\n        Map&lt;String,Object&gt; configs = new HashMap&lt;&gt;();\n        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);\n        configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);\n        configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);\n        return new DefaultKafkaProducerFactory(configs);\n    }\n\n    @Bean\n    public KafkaTemplate&lt;String, StockChange&gt; kafkaTemplate() {\n\n        return new KafkaTemplate&lt;&gt;(producerFactory());\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-java\">@Configuration\npublic class KafkaStockChangeConsumerConfig {\n\n    @Value(&quot;${spring.kafka.bootstrap-servers}&quot;)\n    private String bootstrapServers;\n\n    @Bean\n    public ConsumerFactory&lt;String, StockChange&gt; stockChangeConsumer() {\n\n        Map&lt;String, Object&gt; configs = new HashMap&lt;&gt;();\n        configs.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);\n        configs.put(ConsumerConfig.GROUP_ID_CONFIG, &quot;foo&quot;);\n\n        return new DefaultKafkaConsumerFactory&lt;&gt;(\n                configs,\n                new StringDeserializer(),\n                new JsonDeserializer&lt;&gt;(StockChange.class));\n    }\n\n    @Bean\n    public ConcurrentKafkaListenerContainerFactory&lt;String, StockChange&gt; stockChangeListener() {\n        ConcurrentKafkaListenerContainerFactory&lt;String, StockChange&gt; factory = new ConcurrentKafkaListenerContainerFactory&lt;&gt;();\n        factory.setConsumerFactory(stockChangeConsumer());\n        return factory;\n    }\n}<\/code><\/pre>\n<h2>Producer, Consumer \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@Service\npublic class KafkaProducer {\n\n    private static final String TOPIC = &quot;exam&quot;;\n    private final KafkaTemplate&lt;String, StockChange&gt; kafkaTemplate;\n\n    @Autowired\n    public KafkaProducer(KafkaTemplate&lt;String, StockChange&gt; kafkaTemplate) {\n        this.kafkaTemplate = kafkaTemplate;\n    }\n\n    public void sendMessage(String message) {\n\n        StockChange stockChange = StockChange.builder()\n                .yyyymmdd(&quot;2021-01-01&quot;)\n                .skuCd(&quot;10300000033&quot;)\n                .fieldName(&quot;ipgoNo&quot;)\n                .diff(100)\n                .build();\n\n        \/\/ Send a message\n        kafkaTemplate.send(TOPIC, stockChange);\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-java\">@Service\npublic class KafkaConsumer {\n\n    @KafkaListener(topics = &quot;exam&quot;, groupId = &quot;foo&quot;, containerFactory = &quot;stockChangeListener&quot;)\n    public void consume(StockChange stockChange) {\n        System.out.printf(&quot;Consumed message : %s%n&quot;, stockChange.getYyyymmdd());\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot Kafka Json \ub370\uc774\ud0c0 \uc804\uc1a1\ud558\uae30 application.yml \uc124\uc815 spring: kafka: bootstrap-servers: 192.168.0.9:9092 \ub370\uc774\ud0c0 class \uc0dd\uc131 @Getter @Setter @NoArgsConstructor public class StockChange { String yyyymmdd; String skuCd; String fieldName; int diff; @Builder public StockChange(String yyyymmdd, String skuCd, String fieldName, int diff) { this.yyyymmdd = yyyymmdd; this.skuCd = skuCd; this.fieldName = fieldName; this.diff = diff; } }\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1550\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1550","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-1"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1550"}],"version-history":[{"count":3,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1550\/revisions"}],"predecessor-version":[{"id":1553,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1550\/revisions\/1553"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}