{"id":2251,"date":"2021-07-17T15:22:43","date_gmt":"2021-07-17T06:22:43","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2251"},"modified":"2022-04-18T16:06:39","modified_gmt":"2022-04-18T07:06:39","slug":"kafka-%eb%a5%bc-%ec%9d%b4%ec%9a%a9%ed%95%9c-%eb%a9%94%ec%8b%9c%ec%a7%95","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2251","title":{"rendered":"Spring Kafka \ub97c \uc774\uc6a9\ud55c \uba54\uc2dc\uc9d5(send\/receive message)"},"content":{"rendered":"<h1>Spring Kafka \ub97c \uc774\uc6a9\ud55c \uba54\uc2dc\uc9d5(send\/receive message)<\/h1>\n<h2>\ubaa9\ud45c<\/h2>\n<p>Kafka \ub97c \uc774\uc6a9\ud574, \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\ud569\ub2c8\ub2e4.<\/p>\n<h2>Kafka \uc124\uce58<\/h2>\n<p><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1557\">Install Kafka on Windows<\/a>, <a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=1307\">Install Kafka with docker<\/a> \ub97c \ucc38\uc870\ud574\uc11c Kafka \ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<h2>\ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131<\/h2>\n<p>\uc2e0\uaddc \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc758\uc874\uc131\uc740 DevTools, Lombok, Web, Spring for Apache Kafka \ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4.<\/p>\n<h2>application.yml \uc218\uc815<\/h2>\n<pre><code class=\"language-yaml\">spring:\n  kafka:\n    consumer:\n      bootstrap-servers: 127.0.0.1:9092\n      group-id: foo\n      # auto-offset-reset: earliest\n      # key-deserializer: org.apache.kafka.common.serialization.StringDeserializer\n      # value-deserializer: org.apache.kafka.common.serialization.StringDeserializer\n    producer:\n      bootstrap-servers: 127.0.0.1:9092\n      # key-serializer: org.apache.kafka.common.serialization.StringSerializer\n      # value-serializer: org.apache.kafka.common.serialization.StringSerializer<\/code><\/pre>\n<h2>Producer \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, String&gt; kafkaTemplate;\n\n    @Autowired\n    public KafkaProducer(KafkaTemplate kafkaTemplate) {\n        this.kafkaTemplate = kafkaTemplate;\n    }\n\n    public void sendMessage(String message) {\n        System.out.printf(&quot;Produce message : %s%n&quot;, message);\n        this.kafkaTemplate.send(TOPIC, message);\n    }\n}<\/code><\/pre>\n<h2>Consumer \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@Service\npublic class KafkaConsumer {\n\n    @KafkaListener(topics = &quot;exam&quot;, groupId = &quot;foo&quot;)\n    public void consume(String message) throws IOException {\n        System.out.printf(&quot;Consumed message : %s%n&quot;, message);\n    }\n}<\/code><\/pre>\n<h2>Controller \uc0dd\uc131<\/h2>\n<pre><code class=\"language-java\">@RestController\n@RequestMapping(value = &quot;\/kafka&quot;)\npublic class KafkaController {\n\n    private final KafkaProducer producer;\n\n    @Autowired\n    KafkaController(KafkaProducer producer) {\n        this.producer = producer;\n    }\n\n    @GetMapping(&quot;\/&quot;)\n    public String sendMessage(@RequestParam(&quot;message&quot;) String message) {\n        this.producer.sendMessage(message);\n\n        return &quot;success&quot;;\n    }\n}<\/code><\/pre>\n<h2>\ud504\ub85c\uc81d\ud2b8 \uc2e4\ud589<\/h2>\n<p>\ud504\ub85c\uc81d\ud2b8 \uc2e4\ud589 \ud6c4 \uc544\ub798 \ub9c1\ud06c\uc5d0 \uc811\uc18d\ud569\ub2c8\ub2e4.<\/p>\n<p><a href=\"http:\/\/localhost:8080\/kafka\/?message=\ud558\uc774\">http:\/\/localhost:8080\/kafka\/?message=\ud558\uc774<\/a><\/p>\n<p>\ub85c\uadf8\uc5d0 \uba54\uc2dc\uc9c0\uac00 \ucd9c\ub825\ub418\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>json \ub370\uc774\ud0c0 \uc1a1\uc218\uc2e0\ud558\uae30<\/h2>\n<p>build.gradle<\/p>\n<pre><code class=\"language-gradle\">......\n    implementation &#039;org.json:json:20220320&#039;\n    implementation &#039;com.googlecode.json-simple:json-simple:1.1.1&#039;\n......<\/code><\/pre>\n<pre><code class=\"language-java\">    public void sendMessage(String message) {\n        System.out.printf(&quot;Produce message : %s%n&quot;, message);\n\n        Date now = new Date();\n        DateFormat df = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;); \/\/yyyy-MM-dd HH:mm:ss\n        System.out.println(df.format(now));\n\n        JSONObject data = new JSONObject();\n        data.put(&quot;dt&quot;, df.format(now));\n        data.put(&quot;msg&quot;, message);\n\n        System.out.printf(&quot;Produce json message : %s%n&quot;, data.toJSONString());\n        this.kafkaTemplate.send(TOPIC, data.toJSONString());\n    }<\/code><\/pre>\n<pre><code class=\"language-java\">    @KafkaListener(topics = &quot;json_topic&quot;, groupId = &quot;foo&quot;)\n    public void consume(String message) {\n        System.out.printf(&quot;Consumed json message : %s%n&quot;, message);\n\n        try {\n            JSONParser parser = new JSONParser();\n            Object obj = parser.parse(message);\n            JSONObject jsonObj = (JSONObject) obj;\n\n            String msg = (String) jsonObj.get(&quot;msg&quot;);\n            System.out.printf(&quot;Consumed message : %s%n&quot;, msg);\n        } catch (ParseException ignored) {\n            \/\/\n        }\n    }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Kafka \ub97c \uc774\uc6a9\ud55c \uba54\uc2dc\uc9d5(send\/receive message) \ubaa9\ud45c Kafka \ub97c \uc774\uc6a9\ud574, \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\ud569\ub2c8\ub2e4. Kafka \uc124\uce58 Install Kafka on Windows, Install Kafka with docker \ub97c \ucc38\uc870\ud574\uc11c Kafka \ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \uc2e0\uaddc \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc758\uc874\uc131\uc740 DevTools, Lombok, Web, Spring for Apache Kafka \ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4. application.yml \uc218\uc815 spring: kafka: consumer: bootstrap-servers: 127.0.0.1:9092 group-id: foo # auto-offset-reset: earliest\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=2251\">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":[29],"tags":[],"class_list":["post-2251","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-5"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2251","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=2251"}],"version-history":[{"count":4,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2251\/revisions"}],"predecessor-version":[{"id":5284,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/2251\/revisions\/5284"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}