Home > ๐Ÿ–Š๏ธ ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ > ๐Ÿ‘‰ Spring Kafka > ๐Ÿ“˜ Kafka RetryTopic ๊ด€๋ จ ๊ธฐ๋ณธ Template Bean ์ด๋ฆ„ ๋ณ€๊ฒฝ

๐Ÿ“˜ Kafka RetryTopic ๊ด€๋ จ ๊ธฐ๋ณธ Template Bean ์ด๋ฆ„ ๋ณ€๊ฒฝ
OpenSource PR Spring Kafka

โœ๏ธ 1. ์„œ๋ก 


๊ฐœ๋ฐœ์ž๋กœ์„œ ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ์—ฌํ•˜๋Š” ์ผ์€ ์–ธ์  ๊ฐ€ ๊ผญ ํ•ด๋ณด๊ณ  ์‹ถ์€ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ง‰์ƒ ์‹œ๋„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•œ ๊ฒƒ์ด ํ˜„์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘, ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ด์ฃผ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ๊ณณ์—์„œ ๋ฉ˜ํ† ๋ง ํ”„๋กœ๊ทธ๋žจ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์Šˆ๋ฅผ ์ฐพ๊ณ , ๊ธฐ์—ฌํ•  ๋ถ€๋ถ„์„ ๊ณ ๋ฏผํ•˜๋ฉฐ, ๋ณธ๊ฒฉ์ ์œผ๋กœ ์˜คํ”ˆ์†Œ์Šค์˜ ์„ธ๊ณ„์— ๋ฐœ์„ ๋“ค์ด๊ฒŒ ๋˜์—ˆ์ฃ .

Kafka๋ฅผ ๊ณต๋ถ€ํ•˜๋˜ ์–ด๋А ๋‚ , ๋ฌธ๋“ Spring Kafka์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๊ถ๊ธˆํ•ด์กŒ๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ GitHub ์ €์žฅ์†Œ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ๋ฐœ๊ฒฌํ•œ ํ•˜๋‚˜์˜ ์ด์Šˆ โ€” ์ž‘์•„ ๋ณด์ด์ง€๋งŒ ์‚ฌ์šฉ์ž ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ โ€” ๋ฅผ ๊ณ„๊ธฐ๋กœ ์ƒ์•  ์ฒซ Pull Request๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๊ณ , ์šด ์ข‹๊ฒŒ๋„ ๋จธ์ง€๋˜๋ฉฐ Spring Kafka์˜ ๊ณต์‹ Contributor๊ฐ€ ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๊ทธ ์—ฌ์ •์„ ๊ณต์œ ํ•˜๋ฉฐ, ์–ด๋–ค ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ–ˆ๋Š”์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋ฅผ ๊ฟˆ๊พธ์ง€๋งŒ ๋ง‰์—ฐํ•œ ๋ถ„๋“ค๊ป˜ ์ž‘๊ฒŒ๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.


โ—ˆ


โœ๏ธ 2. ๋ณธ๋ก 

๐Ÿค” 2.1. ์ด์Šˆ ์„ ํƒ ๊ณผ์ •


์ด์Šˆ๋ฅผ ์„ ์ •ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•œ ๊ธฐ์ค€์€ ๊ธฐ์—ฌ๊ฐ€ ๋น„๊ต์  ์‰ฌ์šด๊ฐ€?, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊นŠ์ด ์ดํ•ดํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? ์˜€์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ Apache ํ”„๋กœ์ ํŠธ, Spring ํ”„๋กœ์ ํŠธ ๋“ฑ ์—ฌ๋Ÿฌ ์˜คํ”ˆ์†Œ์Šค ์ €์žฅ์†Œ๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ์ ์ ˆํ•œ ์ด์Šˆ๋ฅผ ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” Apache Jackrabbit Oak ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ์—ฌํ•  ๋งŒํ•œ ์ด์Šˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•ด๋‹น PR์€ ๋จธ์ง€๋˜์ง€ ๋ชปํ–ˆ๊ณ , ๋‹ค์‹œ ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ฐพ์•„ ๋‚˜์„ฐ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘, Spring-Kafka ์—์„œ KafkaTemplate Bean ์ด๋ฆ„ ๋ถˆ์ผ์น˜ ์ด์Šˆ ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š 2.2. ์ด์Šˆ: KafkaTemplate Bean ์ด๋ฆ„ ๋ถˆ์ผ์น˜


Spring Kafka์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” @RetryableTopic ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  KafkaTemplate ๋นˆ์˜ ์ด๋ฆ„์„ defaultRetryTopicKafkaTemplate๋ผ๊ณ  ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ @RetryableTopic ์˜ JavaDoc์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

* If not specified, a bean with name {@code retryTopicDefaultKafkaTemplate} or {@code kafkaTemplate} will be looked up.

์ฆ‰, JavaDoc์—๋Š” retryTopicDefaultKafkaTemplate, ๊ณต์‹ ๋ฌธ์„œ์—๋Š” defaultRetryTopicKafkaTemplate๋ผ๋Š” ์ด๋ฆ„์ด ๋‚˜์™€ ์žˆ์—ˆ๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ผ๋ถ€๋„ JavaDoc ์ชฝ ์ด๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์–ด๋–ค ๋นˆ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

1


๐Ÿ‘‰ ํ•ด๋‹น ์ด์Šˆ๋Š” Spring Kafka GitHub Issue #3514 ์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โ€๐Ÿ’ป 2.3. PR: JavaDoc ์ •์ •


๋จผ์ €, @RetryableTopic ์–ด๋…ธํ…Œ์ด์…˜ ํด๋ž˜์Šค์˜ JavaDoc์„ ๊ณต์‹ ๋ฌธ์„œ์™€ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Before:

 * The bean name of the {@link org.springframework.kafka.core.KafkaTemplate} bean that
 * will be used to forward the message to the retry and Dlt topics. If not specified,
 * a bean with name {@code retryTopicDefaultKafkaTemplate} or {@code kafkaTemplate}
 * will be looked up.
 *
 * @return the kafkaTemplate bean name.

After:

 * The bean name of the {@link org.springframework.kafka.core.KafkaTemplate} bean that
 * will be used to forward the message to the retry and Dlt topics. If not specified,
 * a bean with name {@code defaultRetryTopicKafkaTemplate} or {@code kafkaTemplate}
 * will be looked up.
 *
 * @return the kafkaTemplate bean name.

bean ์œผ๋กœ retryTopicDefaultKafkaTemplate ๋Œ€์‹  defaultRetryTopicKafkaTemplate ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ˆ˜์ •์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด ์ˆ˜์ •์œผ๋กœ ๊ณต์‹ ๋ฌธ์„œ์™€ JavaDoc์ด ์ผ์น˜ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์ด ํ˜ผ๋ž€ ์—†์ด ์˜ฌ๋ฐ”๋ฅธ ๋นˆ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘‰ Commit Message โ†’ Fix: Replace retryTopicDefaultKafkaTemplate with defaultRetryTopicKafkaTemplate in docs

๐Ÿ’ป 2.4. PR: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ •์ •


๋˜ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ๋„ ์ž˜๋ชป๋œ ๋นˆ ์ด๋ฆ„ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ๋ช…์‹œํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. RetryTopicConfigurationProviderTests ๋ผ๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ด์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ ์ƒ์ˆ˜ RetryTopicBeanNames.DEFAULT_KAFKA_TEMPLATE_BEAN_NAME ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ„ฐ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

Before:

@Test
void shouldProvideFromAnnotation() {

	// setup
	willReturn(kafkaOperations).given(beanFactory).getBean("retryTopicDefaultKafkaTemplate", KafkaOperations.class);

	// given
	RetryTopicConfigurationProvider provider = new RetryTopicConfigurationProvider(beanFactory);
	RetryTopicConfiguration configuration = provider.findRetryConfigurationFor(topics, annotatedMethod, bean);
	RetryTopicConfiguration configurationFromClass = provider
			.findRetryConfigurationFor(topics, null, AnnotatedClass.class, bean);
	// then
	then(this.beanFactory).should(times(0)).getBeansOfType(RetryTopicConfiguration.class);
	assertThat(configuration).isNotNull();
	assertThat(configurationFromClass).isNotNull();
}

@Test
void shouldProvideFromMetaAnnotation() {

	// setup
	willReturn(kafkaOperations).given(beanFactory).getBean("retryTopicDefaultKafkaTemplate", KafkaOperations.class);

	// given
	RetryTopicConfigurationProvider provider = new RetryTopicConfigurationProvider(beanFactory);
	RetryTopicConfiguration configuration = provider.findRetryConfigurationFor(topics, metaAnnotatedMethod, bean);
	RetryTopicConfiguration configurationFromClass = provider
			.findRetryConfigurationFor(topics, null, MetaAnnotatedClass.class, bean);
	// then
	then(this.beanFactory).should(times(0)).getBeansOfType(RetryTopicConfiguration.class);
	assertThat(configuration).isNotNull();
	assertThat(configuration.getConcurrency()).isEqualTo(3);
	assertThat(configurationFromClass).isNotNull();
	assertThat(configurationFromClass.getConcurrency()).isEqualTo(3);
}

After:

@Test
void shouldProvideFromAnnotation() {

	// setup
	willReturn(kafkaOperations).given(beanFactory).getBean(RetryTopicBeanNames.DEFAULT_KAFKA_TEMPLATE_BEAN_NAME, KafkaOperations.class);

	// given
	RetryTopicConfigurationProvider provider = new RetryTopicConfigurationProvider(beanFactory);
	RetryTopicConfiguration configuration = provider.findRetryConfigurationFor(topics, annotatedMethod, bean);
	RetryTopicConfiguration configurationFromClass = provider
			.findRetryConfigurationFor(topics, null, AnnotatedClass.class, bean);
	// then
	then(this.beanFactory).should(times(0)).getBeansOfType(RetryTopicConfiguration.class);
	assertThat(configuration).isNotNull();
	assertThat(configurationFromClass).isNotNull();
}

@Test
void shouldProvideFromMetaAnnotation() {

	// setup
	willReturn(kafkaOperations).given(beanFactory).getBean(RetryTopicBeanNames.DEFAULT_KAFKA_TEMPLATE_BEAN_NAME, KafkaOperations.class);

	// given
	RetryTopicConfigurationProvider provider = new RetryTopicConfigurationProvider(beanFactory);
	RetryTopicConfiguration configuration = provider.findRetryConfigurationFor(topics, metaAnnotatedMethod, bean);
	RetryTopicConfiguration configurationFromClass = provider
			.findRetryConfigurationFor(topics, null, MetaAnnotatedClass.class, bean);
	// then
	then(this.beanFactory).should(times(0)).getBeansOfType(RetryTopicConfiguration.class);
	assertThat(configuration).isNotNull();
	assertThat(configuration.getConcurrency()).isEqualTo(3);
	assertThat(configurationFromClass).isNotNull();
	assertThat(configurationFromClass.getConcurrency()).isEqualTo(3);
}

"retryTopicDefaultKafkaTemplate" ์œผ๋กœ ๋˜์–ด์žˆ๋˜ Bean ์ด๋ฆ„ ๋ถ€๋ถ„์„ RetryTopicBeanNames.DEFAULT_KAFKA_TEMPLATE_BEAN_NAME ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋นˆ ์ด๋ฆ„๋„ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ, ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„ KafkaTemplate ๋นˆ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ƒ์ˆ˜๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


๐Ÿ‘‰ Commit Message โ†’ Fix: Replace retryTopicDefaultKafkaTemplate with RetryTopicBeanNames.DEFAULT_KAFKA_TEMPLATE_BEAN_NAME in Test Code


opensource

opensource

opensource

๊ทธ ๊ฒฐ๊ณผ, Spring Kafka ์˜ Contributor ๊ฐ€ ๋˜์—ˆ๊ณ , ์ œ ์ƒ์˜ ์ฒซ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์—ฌ์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น PR ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Spring Kafka PR ๊ธฐ์—ฌ ์„ฑ๊ณต ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๐Ÿคฃ 2.5. ๋ฐฐ์›€: Apache Jackrabbit Oak ๊ธฐ์—ฌ ์‹คํŒจ ๊ฒฝํ—˜


์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€์ง€๋งŒ, Spring Kafka ๋ฅผ ๊ธฐ์—ฌํ•˜๊ธฐ ์ „์—, Apache Jackrabbit Oak ์˜ ์ด์Šˆ๋ฅผ ํ•˜๋‚˜ ๋จผ์ € ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก Apache Jackrabbit Oak ?
ํŒŒ์ผ์ด๋‚˜ ๋ฌธ์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
Java๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , Adobe Experience Manager(AEM) ๊ฐ™์€ ์œ ๋ช…ํ•œ ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋‚ด๋ถ€ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด, ์›น์‚ฌ์ดํŠธ์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ, ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ Oak๊ฐ€ ์“ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ๋””๋ ‰ํ† ๋ฆฌ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ˆ„๊ฐ€ ์–ธ์ œ ๋ฐ”๊ฟจ๋Š”์ง€ ๊ธฐ๋ก๋„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์–ด์„œ, ๋ฌธ์„œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‚˜ CMS์— ๋”ฑ ๋งž๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.



๋‹น์‹œ ์ด์Šˆ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋Š”๋ฐ

opensource

MAX_SEGMENT_SIZE ์ƒ์ˆ˜๊ฐ€ Segment์™€ SegmentDataUtil s์— ์ค‘๋ณต ์ •์˜๋˜์–ด ์žˆ์œผ๋‹ˆ ํ•˜๋‚˜๋กœ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‹ฌ๋ผ๋Š” ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Segment ๋ผ๋Š” ํด๋ž˜์Šค์—์„œ static final int MAX_SEGMENT_SIZE = 1 << 18; ๋กœ ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์— public ์„ ๋‹ฌ์•„์ฃผ๊ณ , ๊ทธ๊ฑธ SegmentDataUtil ์—์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒŒ ์ „๋ถ€์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด, ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค PR ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

opensource

opensource

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” Merge ์‹คํŒจ์˜€์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

opensource

์ด๋ฏธ ์ €๋ณด๋‹ค ๋จผ์ € ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์บ์น˜ํ•˜๊ณ  PR ์„ ์˜ฌ๋ฆฐ ์‚ฌ๋žŒ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„๋ฅผ ๋ณด๋ฉด, ์ฒ˜์Œ์—๋Š” ์ž˜ ๋ชฐ๋ผ์„œ ์‹ค์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์™„๋ฃŒ ๋œ ์ด์Šˆ์ธ๋ฐ๋„ ์ด์Šˆ๊ฐ€ Close ๋˜์–ด์žˆ์ง€ ์•Š์€๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€ ํ•ด๋‹น ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Assign ์„ ๋ฐ›์•˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์„ ๊ฐ€๋กœ์ฑ„๋Š” ํ–‰๋™์„ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณดํ†ต์€ ์ด์Šˆ์— ๋Œ“๊ธ€๋กœ ๋ณธ์ธ์ด ํ•ด๊ฒฐํ•˜๊ฒ ๋‹ค๊ณ  ๋ฆฌํ”Œ์„ ๋‹ฌ์•„๋‘๊ณ  ์ง„ํ–‰์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋– ํ•œ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๊ผญ ๋Œ“๊ธ€์— ๋ณธ์ธ์ด ํ•ด๊ฒฐํ•˜๊ฒ ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ๋ฐํžˆ๊ณ , ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ง„ํ–‰์„ ํ•˜๊ฒ ๋‹ค๊ณ  ๋Œ“๊ธ€์„ ์ด๋ฏธ ๋‚จ๊ธด ์ƒํƒœ๋ผ๋ฉด, ๊ทธ๊ฑธ ๊ฐ€๋กœ์ฑ„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๊ณ  ํ•œ์ฐธ์ด ์ง€๋‚ฌ๋Š”๋ฐ๋„ ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š์€ ์ด์Šˆ๋ผ๋ฉด, ํ•ด๋‹น ์ด์Šˆ๊ฐ€ ํ˜„์žฌ ํ•ด๊ฒฐ ์ค‘์ธ์ง€, ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋‚ด๊ฐ€ ํ•ด๊ฒฐ์„ ํ•ด๋„ ๋˜๋Š”์ง€ ๋Œ“๊ธ€๋กœ ๋ฌผ์–ด๋ณด๊ณ  ์ง„ํ–‰์„ ํ•˜๋Š” ๋ฐฉํ–ฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


โ—ˆ


โœ๏ธ 3. ๊ฒฐ๋ก 


์ด๋ฒˆ ๊ธฐ์—ฌ๋ฅผ ํ†ตํ•ด Spring Kafka ๋ฌธ์„œ์™€ ์ฝ”๋“œ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐ ์ž‘์€ ๋ณดํƒฌ์ด ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋ก ์ž‘๊ณ  ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๊ทธ ์˜๋ฏธ๋Š” ๊ฒฐ์ฝ” ์ž‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์˜คํ”ˆ์†Œ์Šค ์ƒํƒœ๊ณ„์˜ ๋ฌธํ™”, ํ”„๋กœ์„ธ์Šค, ํ˜‘์—… ๋ฐฉ์‹์„ ์‹ค์ œ๋กœ ์ฒดํ—˜ํ•˜๊ณ  ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฐ’์ง„ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋ฅผ ์–ด๋ ต๊ฒŒ๋งŒ ๋А๋ผ๋Š” ๋ถ„๋“ค๋„ ๋งŽ๊ฒ ์ง€๋งŒ, ์™„๋ฒฝํ•˜๊ฒŒ ์•„๋Š” ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ € ์—ญ์‹œ ๋ฌธ์„œ ํ•˜๋‚˜ ๊ณ ์น˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ•œ ์ค„ ๋ฐ”๊พธ๋Š” ๋ฐ์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž‘์€ ๊ธฐ์—ฌ๋„ ์ถฉ๋ถ„ํžˆ ์˜๋ฏธ ์žˆ๊ณ , ์˜คํ”ˆ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ทธ๋Ÿฐ ๊ธฐ์—ฌ๋ฅผ ์†Œ์ค‘ํžˆ ์—ฌ๊น๋‹ˆ๋‹ค.


๐Ÿ‘จ โ€œ์ค‘์š”ํ•œ ๊ฑด ์™„๋ฒฝํ•จ์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ฒซ ๋ฐœ์„ ๋‚ด๋””๋ŽŒ๋ณด์„ธ์š”.โ€