{"id":51551,"date":"2024-08-15T00:22:32","date_gmt":"2024-08-14T15:22:32","guid":{"rendered":"https:\/\/m9js.shop\/blog\/development\/implementing-advanced-messaging-patterns-with-spring-boot-and-apache-kafka"},"modified":"2024-08-15T00:22:32","modified_gmt":"2024-08-14T15:22:32","slug":"implementing-advanced-messaging-patterns-with-spring-boot-and-apache-kafka","status":"publish","type":"post","link":"https:\/\/m9js.shop\/blog\/development\/implementing-advanced-messaging-patterns-with-spring-boot-and-apache-kafka","title":{"rendered":"Spring Boot\uc640 Apache Kafka\ub97c \uc774\uc6a9\ud55c \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134 \uad6c\ud604"},"content":{"rendered":"
\ud604\ub300\uc758 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c\uc740 \ud544\uc218\uc801\uc778 \uc694\uc18c\ub85c \uc790\ub9ac \uc7a1\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, Spring Boot\uc640 Apache Kafka\ub294 \uac15\ub825\ud55c \uc870\ud569\uc73c\ub85c, \ub300\uaddc\ubaa8 \ubd84\uc0b0 \uc2dc\uc2a4\ud15c\uc5d0\uc11c\uc758 \ub370\uc774\ud130 \uc804\uc1a1\uacfc \ucc98\ub9ac\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud574\uc90d\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Spring Boot\uc640 Apache Kafka\ub97c \ud65c\uc6a9\ud558\uc5ec \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134\uc744 \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uae4a\uc774 \uc788\uac8c \ub2e4\ub8e8\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Boot\ub294 Java \uae30\ubc18\uc758 \ud504\ub808\uc784\uc6cc\ud06c\ub85c, \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uac04\uc18c\ud654\ud558\uace0 \uc2e0\uc18d\ud558\uac8c \uc9c4\ud589\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4. \ubc18\uba74, Apache Kafka\ub294 \ubd84\uc0b0 \uc2a4\ud2b8\ub9ac\ubc0d \ud50c\ub7ab\ud3fc\uc73c\ub85c, \ub300\ub7c9\uc758 \ub370\uc774\ud130\ub97c \uc2e4\uc2dc\uac04\uc73c\ub85c \ucc98\ub9ac\ud558\uace0 \uc804\uc1a1\ud558\ub294 \ub370 \ucd5c\uc801\ud654\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ub450 \uae30\uc220\uc758 \uacb0\ud569\uc740 \ub9c8\uc774\ud06c\ub85c\uc11c\ube44\uc2a4 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \ub370\uc774\ud130 \ud750\ub984\uc744 \uc6d0\ud65c\ud558\uac8c \ud558\uace0, \uc2dc\uc2a4\ud15c\uc758 \ud655\uc7a5\uc131\uc744 \ub192\uc774\ub294 \ub370 \uae30\uc5ec\ud569\ub2c8\ub2e4.<\/p>\n
Spring Boot\ub294 \uc124\uc815\uc774 \uac04\ud3b8\ud558\uace0, \ub2e4\uc591\ud55c \uc2a4\ud0c0\ud130 \ud328\ud0a4\uc9c0\ub97c \uc81c\uacf5\ud558\uc5ec \uac1c\ubc1c\uc790\uac00 \ube60\ub974\uac8c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ud569\ub2c8\ub2e4. Kafka\ub294 \ub192\uc740 \ucc98\ub9ac\ub7c9\uacfc \ub0b4\uad6c\uc131\uc744 \uc81c\uacf5\ud558\uba70, \uba54\uc2dc\uc9c0\uc758 \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\ub294 \uae30\ub2a5\ub3c4 \uac16\ucd94\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud2b9\uc131 \ub355\ubd84\uc5d0 \ub450 \uae30\uc220\uc740 \uc11c\ub85c \ubcf4\uc644\uc801\uc778 \uad00\uacc4\ub97c \ud615\uc131\ud569\ub2c8\ub2e4.<\/p>\n
\uc774 \uc139\uc158\uc5d0\uc11c\ub294 Spring Boot\uc640 Apache Kafka\uc758 \uae30\ubcf8 \uac1c\ub150\uacfc \uc544\ud0a4\ud14d\ucc98\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \uc774 \ub450 \uae30\uc220\uc774 \uc5b4\ub5bb\uac8c \uc0c1\ud638\uc791\uc6a9\ud558\ub294\uc9c0\uc5d0 \ub300\ud55c \uc774\ud574\ub97c \ub3d5\uae30 \uc704\ud574 \uac04\ub2e8\ud55c \uc608\uc81c\ub97c \ud1b5\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Boot \ud504\ub85c\uc81d\ud2b8\ub97c \uc124\uc815\ud558\ub294 \uacfc\uc815\uc740 \ub9e4\uc6b0 \uac04\ub2e8\ud569\ub2c8\ub2e4. Spring Initializr\ub97c \uc0ac\uc6a9\ud558\uba74 \ud544\uc694\ud55c \uc758\uc874\uc131\uc744 \uc27d\uac8c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 Spring Boot \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud558\uace0, Apache Kafka\uc640\uc758 \ud1b5\ud569\uc744 \uc704\ud55c \uc124\uc815 \ubc29\ubc95\uc744 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
curl https:\/\/start.spring.io\/starter.zip -d dependencies=web,kafka -d name=KafkaDemo -o KafkaDemo.zip<\/code><\/pre>\n\uc704\uc758 \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec Spring Boot \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c \ud6c4, \ud544\uc694\ud55c \uc758\uc874\uc131\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. Maven \ub610\ub294 Gradle\uc744 \uc0ac\uc6a9\ud558\uc5ec Kafka \uad00\ub828 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub2e4\uc74c\uc73c\ub85c, application.properties \ud30c\uc77c\uc5d0\uc11c Kafka \ube0c\ub85c\ucee4\uc758 \uc8fc\uc18c\uc640 \uad00\ub828\ub41c \uc124\uc815\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
spring.kafka.bootstrap-servers=localhost:9092\nspring.kafka.consumer.group-id=my-group\nspring.kafka.auto-offset-reset=earliest<\/code><\/pre>\n\uc774\uc81c \uae30\ubcf8\uc801\uc778 \uc124\uc815\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4\ub85c\ub294 Kafka Producer\uc640 Consumer\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n
3. Kafka Producer \uad6c\ud604<\/h2>\n
Kafka Producer\ub294 \uba54\uc2dc\uc9c0\ub97c Kafka \ud1a0\ud53d\uc5d0 \uc804\uc1a1\ud558\ub294 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 Spring Boot\uc5d0\uc11c Kafka Producer\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
\uba3c\uc800, ProducerConfig \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud558\uc5ec Kafka Producer\uc758 \uc124\uc815\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\uc5d0\uc11c\ub294 \uc9c1\ub82c\ud654 \ubc29\uc2dd\uacfc \uad00\ub828\ub41c \uc124\uc815\uc744 \ud3ec\ud568\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
@Configuration\npublic class ProducerConfig {\n @Bean\n public ProducerFactory producerFactory() {\n Map configProps = new HashMap();\n configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, \"localhost:9092\");\n configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);\n configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);\n return new DefaultKafkaProducerFactory(configProps);\n }\n\n @Bean\n public KafkaTemplate kafkaTemplate() {\n return new KafkaTemplate(producerFactory());\n }\n}<\/code><\/pre>\n\uc774\uc81c KafkaTemplate\uc744 \uc0ac\uc6a9\ud558\uc5ec \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\ub294 \uc11c\ube44\uc2a4 \ud074\ub798\uc2a4\uc758 \uc608\uc785\ub2c8\ub2e4.<\/p>\n
@Service\npublic class MessageProducer {\n private final KafkaTemplate kafkaTemplate;\n\n @Autowired\n public MessageProducer(KafkaTemplate kafkaTemplate) {\n this.kafkaTemplate = kafkaTemplate;\n }\n\n public void sendMessage(String topic, String message) {\n kafkaTemplate.send(topic, message);\n }\n}<\/code><\/pre>\n\uc774\uc81c Producer\uac00 \uc900\ube44\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4\ub85c\ub294 Consumer\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n
4. Kafka Consumer \uad6c\ud604<\/h2>\n
Kafka Consumer\ub294 Kafka \ud1a0\ud53d\uc5d0\uc11c \uba54\uc2dc\uc9c0\ub97c \uc77d\uc5b4\uc624\ub294 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 Spring Boot\uc5d0\uc11c Kafka Consumer\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
ConsumerConfig \ud074\ub798\uc2a4\ub97c \uc0dd\uc131\ud558\uc5ec Kafka Consumer\uc758 \uc124\uc815\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\uc5d0\uc11c\ub294 \uadf8\ub8f9 ID\uc640 \uc9c1\ub82c\ud654 \ubc29\uc2dd\uc744 \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
@Configuration\npublic class ConsumerConfig {\n @Bean\n public ConsumerFactory consumerFactory() {\n Map configProps = new HashMap();\n configProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, \"localhost:9092\");\n configProps.put(ConsumerConfig.GROUP_ID_CONFIG, \"my-group\");\n configProps.put(ConsumerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n configProps.put(ConsumerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringDeserializer.class);\n return new DefaultKafkaConsumerFactory(configProps);\n }\n\n @Bean\n public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() {\n ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();\n factory.setConsumerFactory(consumerFactory());\n return factory;\n }\n}<\/code><\/pre>\n\uc774\uc81c @KafkaListener \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud560 \uc218 \uc788\ub294 \uba54\uc11c\ub4dc\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
@Service\npublic class MessageConsumer {\n @KafkaListener(topics = \"my-topic\", groupId = \"my-group\")\n public void listen(String message) {\n System.out.println(\"Received Message: \" + message);\n }\n}<\/code><\/pre>\n\uc774\uc81c Producer\uc640 Consumer\uac00 \ubaa8\ub450 \uad6c\ud604\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub2e8\uacc4\ub85c\ub294 \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134\uc744 \uc801\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n
5. \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134<\/h2>\n
\uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134\uc740 \ub2e4\uc591\ud55c \ube44\uc988\ub2c8\uc2a4 \uc694\uad6c \uc0ac\ud56d\uc744 \ucda9\uc871\ud558\uae30 \uc704\ud574 \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uba87 \uac00\uc9c0 \uc8fc\uc694 \ud328\ud134\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
\n- Publish\/Subscribe \ud328\ud134:<\/strong> \uc5ec\ub7ec \uc18c\ube44\uc790\uac00 \ub3d9\uc77c\ud55c \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.<\/li>\n
- Request\/Reply \ud328\ud134:<\/strong> \uc694\uccad\uc5d0 \ub300\ud55c \uc751\ub2f5\uc744 \ucc98\ub9ac\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.<\/li>\n
- Message Routing:<\/strong> \uba54\uc2dc\uc9c0\ub97c \ud2b9\uc815 \uc18c\ube44\uc790\uc5d0\uac8c \ub77c\uc6b0\ud305\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n
\uac01 \ud328\ud134\uc740 \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub420 \uc218 \uc788\uc73c\uba70, \uc774\ub97c \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc758 \uc720\uc5f0\uc131\uacfc \ud655\uc7a5\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
6. \uba54\uc2dc\uc9c0 \ucc98\ub9ac \ubc0f \uc624\ub958 \ucc98\ub9ac<\/h2>\n
\uba54\uc2dc\uc9c0\ub97c \ucc98\ub9ac\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \uc624\ub958\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \uba54\uc2dc\uc9c0 \ucc98\ub9ac \ubc0f \uc624\ub958 \ucc98\ub9ac \uc804\ub7b5\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Kafka\ub294 \ub2e4\uc591\ud55c \uc624\ub958 \ucc98\ub9ac \uba54\ucee4\ub2c8\uc998\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, RetryTemplate\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc77c\uc2dc\uc801\uc778 \uc624\ub958\uc5d0 \ub300\ud574 \uc7ac\uc2dc\ub3c4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
@Bean\npublic RetryTemplate retryTemplate() {\n RetryTemplate retryTemplate = new RetryTemplate();\n FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();\n backOffPolicy.setBackOffPeriod(1000);\n retryTemplate.setBackOffPolicy(backOffPolicy);\n return retryTemplate;\n}<\/code><\/pre>\n\ub610\ud55c, Dead Letter Topic\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucc98\ub9ac\ud560 \uc218 \uc5c6\ub294 \uba54\uc2dc\uc9c0\ub97c \ubcc4\ub3c4\uc758 \ud1a0\ud53d\uc73c\ub85c \uc774\ub3d9\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc2dc\uc2a4\ud15c\uc758 \uc548\uc815\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
7. \ubaa8\ub2c8\ud130\ub9c1 \ubc0f \uc131\ub2a5 \ucd5c\uc801\ud654<\/h2>\n
\uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c\uc758 \uc131\ub2a5\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\uace0 \ucd5c\uc801\ud654\ud558\ub294 \uac83\uc740 \ub9e4\uc6b0 \uc911\uc694\ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 Kafka\uc758 \ubaa8\ub2c8\ud130\ub9c1 \ub3c4\uad6c\uc640 \uc131\ub2a5 \ucd5c\uc801\ud654 \uae30\ubc95\uc5d0 \ub300\ud574 \uc124\uba85\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
Kafka\ub294 JMX(Java Management Extensions)\ub97c \ud1b5\ud574 \ub2e4\uc591\ud55c \uba54\ud2b8\ub9ad\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ube0c\ub85c\ucee4, \ud1a0\ud53d, \uc18c\ube44\uc790 \ub4f1\uc758 \uc0c1\ud0dc\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub610\ud55c, \uc131\ub2a5 \ucd5c\uc801\ud654\ub97c \uc704\ud574 \ud30c\ud2f0\uc154\ub2dd\uacfc \ubcf5\uc81c\ub97c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud30c\ud2f0\uc154\ub2dd\uc744 \ud1b5\ud574 \ub370\uc774\ud130\uc758 \ubcd1\ub82c \ucc98\ub9ac\ub97c \uac00\ub2a5\ud558\uac8c \ud558\uace0, \ubcf5\uc81c\ub97c \ud1b5\ud574 \ub370\uc774\ud130\uc758 \ub0b4\uad6c\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
8. \uacb0\ub860 \ubc0f \ud5a5\ud6c4 \uc804\ub9dd<\/h2>\n
Spring Boot\uc640 Apache Kafka\ub97c \uc774\uc6a9\ud55c \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134 \uad6c\ud604\uc740 \ud604\ub300 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \ub9e4\uc6b0 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uae30\ubcf8\uc801\uc778 \uc124\uc815\ubd80\ud130 \uace0\uae09 \ud328\ud134\uae4c\uc9c0 \ub2e4\uc591\ud55c \ub0b4\uc6a9\uc744 \ub2e4\ub8e8\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n
\uc55e\uc73c\ub85c\ub3c4 \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c\uc740 \ub354\uc6b1 \ubc1c\uc804\ud560 \uac83\uc774\uba70, \uc0c8\ub85c\uc6b4 \uae30\uc220\uacfc \ud328\ud134\uc774 \ub4f1\uc7a5\ud560 \uac83\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c \uac1c\ubc1c\uc790\ub4e4\uc740 \uc9c0\uc18d\uc801\uc73c\ub85c \ud559\uc2b5\ud558\uace0 \ucd5c\uc2e0 \uae30\uc220 \ub3d9\ud5a5\uc744 \ud30c\uc545\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
\uacb0\ub860\uc801\uc73c\ub85c, Spring Boot\uc640 Apache Kafka\uc758 \uc870\ud569\uc740 \ub300\uaddc\ubaa8 \ubd84\uc0b0 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ub370\uc774\ud130 \ud750\ub984\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub294 \uac15\ub825\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uae30\uc5c5\uc740 \ube44\uc988\ub2c8\uc2a4 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub9de\ub294 \uc720\uc5f0\ud558\uace0 \ud655\uc7a5 \uac00\ub2a5\ud55c \uc2dc\uc2a4\ud15c\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"
\ubaa9\ucc28 Spring Boot\uc640 Apache Kafka\ub97c \uc774\uc6a9\ud55c \uace0\uae09 \uba54\uc2dc\uc9d5 \ud328\ud134 \uad6c\ud604 1. Spring Boot\uc640 Apache Kafka […]<\/p>\n","protected":false},"author":1,"featured_media":33704,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2058,2351,2156],"class_list":["post-51551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-application","tag-management","tag-spring"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/51551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/comments?post=51551"}],"version-history":[{"count":0,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/51551\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/33704"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=51551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=51551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=51551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}