"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค" ์•ˆ๋…•ํ•˜์„ธ์š”, ์นด๋ธŒ๋กœ ์ฃผ๋ฏผ ์—ฌ๋Ÿฌ๋ถ„! ์ด ์ฑ…์€ ์Šค๋ ˆ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ ค๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ดํ•ดํ•˜๋ฉด Kafka์™€ Kafka Streams๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Kafka ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋ฅผ ์•Œ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆ™๋ จ๋œ Kafka ๊ฐœ๋ฐœ์ž์™€ ์ดˆ๋ณด์ž ๋ชจ๋‘ ์ด ์ฑ…์—์„œ Kafka Streams ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฅ๋ฏธ๋กœ์šด ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง๋ ฌํ™”์™€ ๊ฐ™์€ ๊ฐœ๋…์— ์ด๋ฏธ ์ต์ˆ™ํ•œ ์ค‘๊ธ‰ ๋ฐ ๊ณ ๊ธ‰ Java ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ์˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜์—ฌ Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ด ์ฑ…์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” Java 8๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ Java 8 ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ (๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋„) ๋žŒ๋‹ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐœ์ทŒ. 5.3. ์ง‘๊ณ„ ๋ฐ ์ฐฝ ์ž‘์—…

์ด ์„น์…˜์—์„œ๋Š” Kafka Streams์˜ ๊ฐ€์žฅ ์œ ๋งํ•œ ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ Kafka Streams์˜ ๋‹ค์Œ ์ธก๋ฉด์„ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒ˜๋ฆฌ ํ† ํด๋กœ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ ;
  • ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ ์‚ฌ์šฉ;
  • ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ ;
  • ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ(KStream)๊ณผ ์—…๋ฐ์ดํŠธ ์ŠคํŠธ๋ฆผ(KTable)์˜ ์ฐจ์ด์ 

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹ํ•˜๋‚˜๋กœ ๋ชจ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋˜ ๋‹ค๋ฅธ ๋›ฐ์–ด๋‚œ ๊ธฐ๋Šฅ์ธ ์œˆ๋„์šฐ์ž‰์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ๊ฐ„๋‹จํ•œ ์ง‘๊ณ„์ž…๋‹ˆ๋‹ค.

5.3.1. ์—…์ข…๋ณ„ ์ฃผ์‹๋งค์ถœ ์ง‘๊ณ„

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

์ด ์˜ˆ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์‚ฐ์—… ๋ถ„์•ผ์˜ ํšŒ์‚ฌ ์ฃผ์‹ ํŒ๋งค๋Ÿ‰์„ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ์ผ์ผ ๊ฑฐ๋ž˜์ž์˜ ์˜์ƒ์„ ์ž…๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ท€ํ•˜๋Š” ๊ฐ ์‚ฐ์—… ๋ถ„์•ผ์—์„œ ์ฃผ์‹ ํŒ๋งค๋Ÿ‰์ด ๊ฐ€์žฅ ๋งŽ์€ XNUMX๊ฐœ ํšŒ์‚ฌ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ง‘๊ณ„์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•์‹(์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ ๋งํ•˜๋ฉด)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์›์‹œ ์ฃผ์‹ ๊ฑฐ๋ž˜ ์ •๋ณด๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ์ฃผ์ œ ๊ธฐ๋ฐ˜ ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. StockTransaction ์œ ํ˜•์˜ ๊ฐœ์ฒด๋ฅผ ShareVolume ์œ ํ˜•์˜ ๊ฐœ์ฒด์— ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ ์€ StockTransaction ๊ฐœ์ฒด์— ํŒ๋งค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ํŒ๋งค๋˜๋Š” ์ฃผ์‹ ์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ฃผ์‹ ๊ธฐํ˜ธ๋ณ„๋กœ ShareVolume ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ˜ธ๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•œ ํ›„์—๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์‹ ํŒ๋งค๋Ÿ‰์˜ ์†Œ๊ณ„๋กœ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. KStream.groupBy ๋ฉ”์†Œ๋“œ๊ฐ€ KGroupedStream ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  KGroupedStream.reduce ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ํ˜ธ์ถœํ•˜์—ฌ KTable ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

KGroupedStream ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ

KStream.groupBy ๋ฐ KStream.groupByKey ๋ฉ”์„œ๋“œ๋Š” KGroupedStream์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. KGroupedStream์€ ํ‚ค๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ•œ ํ›„ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ์ง์ ‘์ ์ธ ์ž‘์—…์„ ์œ„ํ•œ ๊ฒƒ์ด ์ „ํ˜€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹ , KGroupedStream์€ ํ•ญ์ƒ KTable์„ ์ƒ์„ฑํ•˜๋Š” ์ง‘๊ณ„ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง‘๊ณ„ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋Š” KTable์ด๊ณ  ์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ ์•„๋ž˜๋กœ ์ „์†ก๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

KTable.groupBy ๋ฉ”์†Œ๋“œ๋Š” ์œ ์‚ฌํ•œ KGroupedTable(ํ‚ค๋ณ„๋กœ ์žฌ๊ทธ๋ฃนํ™”๋œ ์—…๋ฐ์ดํŠธ ์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ํ‘œํ˜„)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž ์‹œ ์‰ฌ๋ฉด์„œ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 5.9๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ฌ์„ฑํ•œ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ํ† ํด๋กœ์ง€๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋งค์šฐ ์ต์ˆ™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด์ œ ์ด ํ† ํด๋กœ์ง€์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.2).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ฃผ์–ด์ง„ ์ฝ”๋“œ๋Š” ๊ฐ„๊ฒฐ์„ฑ๊ณผ ์—ฌ๋Ÿฌ ์ค„์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋งŽ์€ ์–‘์˜ ์ž‘์—…์œผ๋กœ ๊ตฌ๋ณ„๋ฉ๋‹ˆ๋‹ค. builder.stream ๋ฉ”์†Œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Consumed.withOffsetResetPolicy ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋œ ์—ด๊ฑฐํ˜• AutoOffsetReset.EARLIEST(LATEST๋„ ์žˆ์Œ)์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด ์—ด๊ฑฐ ์œ ํ˜•์€ ๊ฐ KStream ๋˜๋Š” KTable์— ๋Œ€ํ•œ ์˜คํ”„์…‹ ์žฌ์„ค์ • ์ „๋žต์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌ์„ฑ์˜ ์˜คํ”„์…‹ ์žฌ์„ค์ • ์˜ต์…˜๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

GroupByKey ๋ฐ GroupBy

KStream ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•(GroupByKey ๋ฐ GroupBy)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค KGroupedTable์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€, ์–ธ์ œ ์–ด๋Š ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GroupByKey ๋ฉ”์„œ๋“œ๋Š” KStream์˜ ํ‚ค๊ฐ€ ์ด๋ฏธ ๋น„์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ "์žฌํŒŒํ‹ฐ์…”๋‹ ํ•„์š”" ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GroupBy ๋ฉ”์„œ๋“œ๋Š” ๊ทธ๋ฃนํ™” ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋‹ค์‹œ ๋ถ„ํ•  ํ”Œ๋ž˜๊ทธ๊ฐ€ true๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. GroupBy ๋ฉ”์„œ๋“œ ์ดํ›„์— ์กฐ์ธ, ์ง‘๊ณ„ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ํŒŒํ‹ฐ์…”๋‹๋ฉ๋‹ˆ๋‹ค.
์š”์•ฝ: ๊ฐ€๋Šฅํ•˜๋ฉด GroupBy ๋Œ€์‹  GroupByKey๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mapValues โ€‹โ€‹๋ฐ groupBy ๋ฉ”์†Œ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ sum() ๋ฉ”์†Œ๋“œ(src/main/java/bbejeck/model/ShareVolume.java์— ์žˆ์Œ)๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(๋ชฉ๋ก 5.3).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
ShareVolume.sum ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์‹ ํŒ๋งค๋Ÿ‰์˜ ๋ˆ„๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ „์ฒด ๊ณ„์‚ฐ ์ฒด์ธ์˜ ๊ฒฐ๊ณผ๋Š” KTable ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค. . ์ด์ œ KTable์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜์…จ์Šต๋‹ˆ๋‹ค. ShareVolume ๊ฐœ์ฒด๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ํ•ด๋‹น KTable ๊ฐœ์ฒด๋Š” ์ตœ์‹  ํ˜„์žฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด์ „ shareVolumeKTable์— ๋ฐ˜์˜๋˜์ง€๋งŒ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋” ์ด์ƒ ์ „์†ก๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด KTable์„ ์‚ฌ์šฉํ•˜์—ฌ (๊ฑฐ๋ž˜๋œ ์ฃผ์‹ ์ˆ˜ ๊ธฐ์ค€) ์ง‘๊ณ„ํ•˜์—ฌ ๊ฐ ์‚ฐ์—…์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์ฃผ์‹์ด ๊ฑฐ๋ž˜๋œ XNUMX๊ฐœ ํšŒ์‚ฌ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ์กฐ์น˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ง‘๊ณ„์˜ ์กฐ์น˜์™€ โ€‹โ€‹์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฐ์—…๋ณ„๋กœ ๊ฐœ๋ณ„ ShareVolume ๊ฐœ์ฒด๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด ๋˜ ๋‹ค๋ฅธ groupBy ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ShareVolume ๊ฐœ์ฒด ์š”์•ฝ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ง‘๊ณ„ ๊ฐœ์ฒด๊ฐ€ ๊ณ ์ • ํฌ๊ธฐ ์šฐ์„  ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด ๊ณ ์ • ํฌ๊ธฐ ๋Œ€๊ธฐ์—ด์—๋Š” ๊ฐ€์žฅ ๋งŽ์€ ์–‘์˜ ์ฃผ์‹์„ ํŒ๋งคํ•œ XNUMX๊ฐœ ํšŒ์‚ฌ๋งŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  3. ์ด์ „ ๋‹จ๋ฝ์˜ ๋Œ€๊ธฐ์—ด์„ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜๊ณ  ์—…์ข…๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ๊ฑฐ๋ž˜๋œ ์ƒ์œ„ XNUMX๊ฐœ ์ฃผ์‹์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์ฃผ์ œ์— ์”๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์—์„œ. ๊ทธ๋ฆผ 5.10์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํ† ํด๋กœ์ง€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‘ ๋ฒˆ์งธ ์ฒ˜๋ฆฌ ๋ผ์šด๋“œ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด์ œ ๋‘ ๋ฒˆ์งธ ์ฒ˜๋ฆฌ ๋ผ์šด๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ–ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.4) .

์ด ์ดˆ๊ธฐํ™” ํ”„๋กœ๊ทธ๋žจ์—๋Š”fixedQueue ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฑฐ๋ž˜๋œ ์ฃผ์‹์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ƒ์œ„ N๊ฐœ ๊ฒฐ๊ณผ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” java.util.TreeSet์šฉ ์–ด๋Œ‘ํ„ฐ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
groupBy ๋ฐ mapValues โ€‹โ€‹ํ˜ธ์ถœ์„ ์ด๋ฏธ ๋ณด์•˜์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค(KTable.print ๋ฉ”์„œ๋“œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ KTable.toStream ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์€ ์•„์ง KTable ๋ฒ„์ „์˜ Aggregate()๋ฅผ ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์ž ์‹œ ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ์–ตํ•˜์‹œ๊ฒ ์ง€๋งŒ, KTable์ด ๋‹ค๋ฅธ ์ ์€ ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. KTable์€ ์ด์ „ ํ•ญ๋ชฉ์„ ์ƒˆ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ง‘๊ณ„๋Š” ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ตœ์‹  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ง‘๊ณ„๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ๋ง์…ˆ๊ธฐ(์ง‘๊ณ„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ FixedSizePriorityQueue ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€๋˜์ง€๋งŒ, ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋นผ๊ธฐ(์ง‘๊ณ„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ง‘๊ณ„ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ).

์ด๋Š” ์šฐ๋ฆฌ์˜ ์ง‘๊ณ„์ž(FixedSizePriorityQueue)๊ฐ€ ํ•˜๋‚˜์˜ ํ‚ค๋กœ ๋ชจ๋“  ๊ฐ’์„ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ๋งŽ์ด ๊ฑฐ๋ž˜๋˜๋Š” N๊ฐœ ์œ ํ˜•์˜ ์ฃผ์‹ ์ˆ˜๋Ÿ‰์˜ ์ด๋™ ํ•ฉ๊ณ„๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ˆ˜์‹  ํ•ญ๋ชฉ์—๋Š” ์ง€๊ธˆ๊นŒ์ง€ ํŒ๋งค๋œ ์ด ์ฃผ์‹ ์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. KTable์€ ๊ฐ ์—…๋ฐ์ดํŠธ์˜ ๋กค๋ง ์ง‘๊ณ„ ์—†์ด ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ๊ฑฐ๋ž˜๋˜๋Š” ํšŒ์‚ฌ์˜ ์ฃผ์‹์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ผ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

  • KTable์˜ ๊ฐ’์„ ๊ณตํ†ต ํ‚ค๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ทธ๋ฃนํ™”๋œ ๊ฐ’์— ๋Œ€ํ•ด ๋กค์—… ๋ฐ ์ง‘๊ณ„์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์ด๋™ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ์ฑ…์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋…ผ์˜ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. 4์žฅ์—์„œ๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ, ๋กœ์ปฌ ์ƒํƒœ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฅ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ์ง€์—ญ ์ƒํƒœ๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ ๋ณธ ์ •๋ณด๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์•ก์„ธ์Šค๋Š” ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ  ์˜ค๋ฅ˜ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋กค์—… ๋˜๋Š” ์ง‘๊ณ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ƒํƒœ ์ €์žฅ์†Œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กค์—… ๋ฐ ์ง‘๊ณ„ ์ž‘์—…์€ KTable ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  KTable์€ ์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ ๊ฒฐ๊ณผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „์†ก๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ง‘๊ณ„ ์ž‘์—…์€ ์š”์•ฝ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด KTable์€ ๋ชจ๋“  ์ง‘๊ณ„ ๋ฐ ๋กค์—… ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ํŠน์ • ๊ธฐ๊ฐ„ ๋‚ด์— ์ง‘๊ณ„์™€ ๊ฐ™์€ ์ž‘์—…(์†Œ์œ„ ์œˆ๋„์ž‰ ์ž‘์—…์ด๋ผ๊ณ  ํ•จ)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5.3.2. ์ฐฝ ์ž‘์—…

์ด์ „ ์„น์…˜์—์„œ๋Š” ์Šฌ๋ผ์ด๋”ฉ ์ปจ๋ณผ๋ฃจ์…˜๊ณผ ์ง‘๊ณ„๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ฃผ์‹ ํŒ๋งค๋Ÿ‰์„ ์ง€์†์ ์œผ๋กœ ๋กค์—…ํ•œ ํ›„ ๊ฑฐ๋ž˜์†Œ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ฑฐ๋ž˜๋˜๋Š” XNUMX๊ฐœ ์ฃผ์‹์„ ์ง‘๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ์˜ ์ง€์†์ ์ธ ์ง‘๊ณ„ ๋ฐ ๋กค์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ์—๋งŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง€๋‚œ 10๋ถ„ ๋™์•ˆ ํŠน์ • ํšŒ์‚ฌ์˜ ์ฃผ์‹์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ตํ™˜ ๊ฑฐ๋ž˜๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ๊ณ„์‚ฐํ•ด ๋ณด์„ธ์š”. ๋˜๋Š” ์ง€๋‚œ 15๋ถ„ ๋™์•ˆ ์ƒˆ ๊ด‘๊ณ  ๋ฐฐ๋„ˆ๋ฅผ ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž ์ˆ˜์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์ง€์ •๋œ ๊ธฐ๊ฐ„(๊ธฐ๊ฐ„)์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋งค์ž๋ณ„ ๊ตํ™˜๊ฑฐ๋ž˜ ์ง‘๊ณ„

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋Œ€๊ทœ๋ชจ ์กฐ์ง์ด๋“  ํ˜„๋ช…ํ•œ ๊ฐœ์ธ ๊ธˆ์œต๊ฐ€๋“  ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜์ž ๊ฐ„์˜ ์ฃผ์‹ ๊ฑฐ๋ž˜๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ถ”์ ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ์žฅ ๋ฆฌ๋”๊ฐ€ ๋ฌด์—‡์„ ์‚ฌ๊ณ  ํŒŒ๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋Œ€ํ˜• ๊ธฐ์—…๊ณผ ์ •๊ตํ•œ ํˆฌ์ž์ž๊ฐ€ ๊ธฐํšŒ๋ฅผ ๋ฐœ๊ฒฌํ•œ๋‹ค๋ฉด ๊ทธ๋“ค์˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ด์œ ๋Š” ๋ถˆ๋ฒ•์ ์ธ ๋‚ด๋ถ€ ๊ฑฐ๋ž˜์˜ ์ง•ํ›„๋ฅผ ์ฐพ์•„๋‚ด๊ณ ์ž ํ•˜๋Š” ์š•๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋Œ€๊ทœ๋ชจ ๋งค์ถœ ๊ธ‰์ฆ๊ณผ ์ค‘์š”ํ•œ ๋ณด๋„ ์ž๋ฃŒ์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ถ”์ ์€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์‹ ๊ฑฐ๋ž˜ ์ฃผ์ œ์—์„œ ์ฝ๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ๋งค์ž ID ๋ฐ ์ฃผ์‹ ๊ธฐํ˜ธ๋ณ„๋กœ ์ˆ˜์‹  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. groupBy ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด KGroupedStream ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • KGroupedStream.windowedBy ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๊ฐ„ ์ง‘๊ณ„๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์‹œ๊ฐ„ ์ฐฝ์œผ๋กœ ์ œํ•œ๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฐฝ ์œ ํ˜•์— ๋”ฐ๋ผ TimeWindowedKStream ๋˜๋Š” SessionWindowedKStream์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ง‘๊ณ„ ์ž‘์—…์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์ด ๊ณ„์‚ฐ์—์„œ ํŠน์ • ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ณ ๋ ค๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์ œ์— ์“ฐ๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ ์ค‘์— ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ† ํด๋กœ์ง€๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ทธ๋ฆผ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด์ž. 5.11.

๋‹ค์Œ์œผ๋กœ ์ฐฝ ์ž‘์—…์˜ ๊ธฐ๋Šฅ๊ณผ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"

์ฐฝ ์œ ํ˜•

Kafka Streams์—๋Š” ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ฐฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„ธ์…˜๋ณ„;
  • "ํ…€๋ธ”๋ง";
  • ์Šฌ๋ผ์ด๋”ฉ/ํ˜ธํ•‘.

์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ• ์ง€๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ…€๋ธ”๋ง ๋ฐ ์ ํ”„ ์ฐฝ์€ ์‹œ๊ฐ„์ด ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๋ฐ˜๋ฉด, ์„ธ์…˜ ์ฐฝ์€ ์‚ฌ์šฉ์ž ํ™œ๋™์— ๋”ฐ๋ผ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ธฐ๊ฐ„์€ ์‚ฌ์šฉ์ž์˜ ํ™œ๋™ ์ •๋„์— ์˜ํ•ด์„œ๋งŒ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์–ตํ•ด์•ผ ํ•  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ๋ชจ๋“  ์ฐฝ ์œ ํ˜•์€ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด ์•„๋‹Œ ํ•ญ๋ชฉ์˜ ๋‚ ์งœ/์‹œ๊ฐ„ ์Šคํƒฌํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๊ฐ ์ฐฝ ์œ ํ˜•์œผ๋กœ ํ† ํด๋กœ์ง€๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋งŒ ์ œ๊ณต๋˜๋ฉฐ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ฐฝ์—์„œ๋Š” ์ฐฝ ์ž‘์—… ์œ ํ˜• ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ธ์…˜ ์ฐฝ

์„ธ์…˜ ์ฐฝ์€ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•์˜ ์ฐฝ๊ณผ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž์˜ ํ™œ๋™(๋˜๋Š” ์ถ”์ ํ•˜๋ ค๋Š” ์—”ํ„ฐํ‹ฐ์˜ ํ™œ๋™)์— ๋”ฐ๋ผ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ธฐ๊ฐ„์€ ๋น„ํ™œ์„ฑ ๊ธฐ๊ฐ„์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ 5.12๋Š” ์„ธ์…˜ ์ฐฝ์˜ ๊ฐœ๋…์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋” ์ž‘์€ ์„ธ์…˜์ด ์™ผ์ชฝ ์„ธ์…˜๊ณผ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ ์„ธ์…˜์€ ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋™์•ˆ ํ™œ๋™์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ์ฐฝ์€ ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ํ•ญ๋ชฉ์˜ ๋‚ ์งœ/์‹œ๊ฐ„ ์Šคํƒฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ์ด ์†ํ•œ ์„ธ์…˜์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"

์„ธ์…˜ ์ฐฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์‹ ๊ฑฐ๋ž˜ ์ถ”์ 

์„ธ์…˜ ์ฐฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตํ™˜ ๊ฑฐ๋ž˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์บก์ฒ˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ์ฐฝ์˜ ๊ตฌํ˜„์€ ๋ชฉ๋ก 5.5(src/main/java/bbejeck/chapter_5/CountingWindowingAndKTableJoinExample.java์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด ํ† ํด๋กœ์ง€์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ด๋ฏธ ์‚ดํŽด๋ณด์•˜์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ๋ณผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์š”์†Œ๋„ ์žˆ๋Š”๋ฐ, ์ด์ œ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  groupBy ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์ข…์˜ ์ง‘๊ณ„ ์ž‘์—…(์ง‘๊ณ„, ๋กค์—… ๋˜๋Š” ๊ณ„์‚ฐ)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ ๋ˆ„์  ์ง‘๊ณ„ ๋˜๋Š” ์ง€์ •๋œ ๊ธฐ๊ฐ„ ๋‚ด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์ฐฝ ์ง‘๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ๋ก 5.5์˜ ์ฝ”๋“œ๋Š” ์„ธ์…˜ ์ฐฝ ๋‚ด์˜ ํŠธ๋žœ์žญ์…˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ. 5.13 ์ด๋Ÿฌํ•œ ์กฐ์น˜๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.

windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋น„ํ™œ์„ฑ ๊ฐ„๊ฒฉ์ด 20์ดˆ์ด๊ณ  ์ง€์† ๊ฐ„๊ฒฉ์ด 15๋ถ„์ธ ์„ธ์…˜ ์ฐฝ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. 20์ดˆ์˜ ์œ ํœด ๊ฐ„๊ฒฉ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ˜„์žฌ ์„ธ์…˜ ์ข…๋ฃŒ ๋˜๋Š” ์‹œ์ž‘ ํ›„ 20์ดˆ ์ด๋‚ด์— ๋„์ฐฉํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ˜„์žฌ(ํ™œ์„ฑ) ์„ธ์…˜์— ํฌํ•จํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋‹ค์Œ์œผ๋กœ ์„ธ์…˜ ์ฐฝ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ง‘๊ณ„ ์ž‘์—…(์ด ๊ฒฝ์šฐ count)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹  ํ•ญ๋ชฉ์ด ๋น„ํ™œ์„ฑ ๊ธฐ๊ฐ„(๋‚ ์งœ/์‹œ๊ฐ„ ์Šคํƒฌํ”„์˜ ์–‘์ชฝ)์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒˆ ์„ธ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กด ๊ฐ„๊ฒฉ์€ ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ์„ธ์…˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์„ธ์…˜์˜ ๋น„ํ™œ์„ฑ ๊ธฐ๊ฐ„์„ ์ดˆ๊ณผํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ‘ํ•ฉ์œผ๋กœ ์ธํ•œ ์ƒˆ ์„ธ์…˜์˜ ์‹œ์ž‘๊ณผ ๋์€ ๊ฐ€์žฅ ๋น ๋ฅธ ๋‚ ์งœ/์‹œ๊ฐ„ ์Šคํƒฌํ”„์™€ ๊ฐ€์žฅ ๋Šฆ์€ ๋‚ ์งœ/์‹œ๊ฐ„ ์Šคํƒฌํ”„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด count ๋ฉ”์†Œ๋“œ์˜ ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(ํ‘œ 5.1).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋ ˆ์ฝ”๋“œ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ๋™์ผํ•œ ํ‚ค, ํ˜„์žฌ ๋‚ ์งœ/ํƒ€์ž„์Šคํƒฌํ”„๋ณด๋‹ค ์ž‘์€ ์ข…๋ฃŒ ์‹œ๊ฐ„ - ๋น„ํ™œ์„ฑ ๊ฐ„๊ฒฉ, ํ˜„์žฌ ๋‚ ์งœ/ํƒ€์ž„์Šคํƒฌํ”„ + ๋น„ํ™œ์„ฑ ๊ฐ„๊ฒฉ๋ณด๋‹ค ํฐ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ฐ€์ง„ ๊ธฐ์กด ์„ธ์…˜์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ‘œ์— 5.1๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. XNUMX์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹จ์ผ ์„ธ์…˜์œผ๋กœ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

1. ๋ ˆ์ฝ”๋“œ 1์ด ๋จผ์ € ๋„์ฐฉํ•˜๋ฏ€๋กœ ์‹œ์ž‘ ์‹œ๊ฐ„์€ ์ข…๋ฃŒ ์‹œ๊ฐ„๊ณผ ๋™์ผํ•˜๋ฉฐ 00:00:00์ž…๋‹ˆ๋‹ค.

2. ๋‹ค์Œ์œผ๋กœ ํ•ญ๋ชฉ 2๊ฐ€ ๋„์ฐฉํ•˜๊ณ  23:59:55 ์ด์ „์— ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  00:00:35 ์ด์ „์— ์‹œ์ž‘๋˜๋Š” ์„ธ์…˜์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ 1์„ ์ฐพ๊ณ  ์„ธ์…˜ 1๊ณผ 2๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ 1์˜ ์‹œ์ž‘ ์‹œ๊ฐ„(์ด์ „)๊ณผ ์„ธ์…˜ 2์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„(๋‚˜์ค‘)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์„ธ์…˜์ด 00:00:00์— ์‹œ์ž‘ํ•˜๊ณ  00์— ๋๋‚˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. 00:15.

3. ๋ ˆ์ฝ”๋“œ 3์ด ๋„์ฐฉํ•˜๋ฉด 00:00:30์—์„œ 00:01:10 ์‚ฌ์ด์˜ ์„ธ์…˜์„ ์ฐพ์•˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. 123:345:654์— ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚˜๋Š” ํ‚ค 00-00-50,FFBE์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ์„ธ์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ ˆ์ฝ”๋“œ 4๊ฐ€ ๋„์ฐฉํ•˜๊ณ  23:59:45์—์„œ 00:00:25 ์‚ฌ์ด์˜ ์„ธ์…˜์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์„ธ์…˜ 1๊ณผ 2๊ฐ€ ๋ชจ๋‘ ๋ฐœ๊ฒฌ๋˜์—ˆ์œผ๋ฉฐ, ์„ธ ์„ธ์…˜์ด ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ์‹œ์ž‘ ์‹œ๊ฐ„์€ 00:00:00, ์ข…๋ฃŒ ์‹œ๊ฐ„์€ 00:00:15์ž…๋‹ˆ๋‹ค.

์ด ์„น์…˜์— ์„ค๋ช…๋œ ๋‚ด์šฉ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋‰˜์•™์Šค๋ฅผ ๊ธฐ์–ตํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์„ธ์…˜์€ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์ฐฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ธฐ๊ฐ„์€ ์ฃผ์–ด์ง„ ๊ธฐ๊ฐ„ ๋‚ด์˜ ํ™œ๋™์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ๋‚ ์งœ/ํƒ€์ž„ ์Šคํƒฌํ”„๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๊ธฐ์กด ์„ธ์…˜ ๋‚ด์— ์†ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์œ ํœด ๊ธฐ๊ฐ„์— ์†ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ๋‹ค์Œ ์œ ํ˜•์˜ ์ฐฝ์ธ "ํ…€๋ธ”๋ง" ์ฐฝ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

"ํ…€๋ธ”๋ง" ์ฐฝ

ํ…€๋ธ”๋ง ์œˆ๋„์šฐ๋Š” ํŠน์ • ๊ธฐ๊ฐ„ ๋‚ด์— ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํšŒ์‚ฌ์˜ ๋ชจ๋“  ์ฃผ์‹ ๊ฑฐ๋ž˜๋ฅผ 20์ดˆ๋งˆ๋‹ค ์บก์ฒ˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 20์ดˆ ๊ฐ„๊ฒฉ์ด ๋๋‚˜๋ฉด ์ฐฝ์ด ๋กค์˜ค๋ฒ„๋˜์–ด ์ƒˆ๋กœ์šด 20์ดˆ ๊ด€์ฐฐ ๊ฐ„๊ฒฉ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ 5.14๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋ณด์‹œ๋‹ค์‹œํ”ผ ์ง€๋‚œ 20์ดˆ ๋™์•ˆ ์ˆ˜์‹ ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ๊ฐ€ ์ฐฝ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„์ด ๋๋‚˜๋ฉด ์ƒˆ ์ฐฝ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก 5.6์€ ํ…€๋ธ”๋ง ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 20์ดˆ๋งˆ๋‹ค ์ฃผ์‹ ๊ฑฐ๋ž˜๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์— ์žˆ์Œ).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
TimeWindows.of ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์กฐ๊ธˆ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์—ฐ์† ์ฐฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” Until() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ๋ณด์กด ๊ฐ„๊ฒฉ์ธ 24์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ฐฝ ์˜ต์…˜์˜ ๋งˆ์ง€๋ง‰์ธ "ํ˜ธํ•‘" ์ฐฝ์œผ๋กœ ์ด๋™ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด๋”ฉ("์ ํ”„") ์ฐฝ

์Šฌ๋ผ์ด๋”ฉ/ํ˜ธํ•‘ ์ฐฝ์€ ํ…€๋ธ”๋ง ์ฐฝ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋”ฉ ์ฐฝ์€ ์ตœ๊ทผ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ์ฐฝ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐฝ ๊ธฐ๊ฐ„๋ณด๋‹ค ์งง์€ ๋Œ€๊ธฐ ๊ฐ„๊ฒฉ ํ›„์— ์ƒˆ ๊ณ„์‚ฐ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ…€๋ธ”๋ง ์ฐฝ๊ณผ ์ ํ”„ ์ฐฝ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ๊ถŒ ๊ฑฐ๋ž˜์†Œ ๊ฑฐ๋ž˜ ๊ณ„์‚ฐ์˜ ์˜ˆ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์—ฌ์ „ํžˆ ํŠธ๋žœ์žญ์…˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์นด์šดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ์ „์ฒด ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋” ์งง์€ ๊ฐ„๊ฒฉ์œผ๋กœ ์นด์šดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ 20์ดˆ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 5์ดˆ๋งˆ๋‹ค ์นด์šดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. 5.15. ์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒน์น˜๋Š” ๊ฒฐ๊ณผ ์ฐฝ์ด XNUMX๊ฐœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋ชฉ๋ก 5.7์€ ์Šฌ๋ผ์ด๋”ฉ ์ฐฝ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์— ์žˆ์Œ).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
advanceBy() ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…€๋ธ”๋ง ์ฐฝ์„ ํ˜ธํ•‘ ์ฐฝ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์‹œ๋œ ์˜ˆ์—์„œ ์ €์žฅ ๊ฐ„๊ฒฉ์€ 15๋ถ„์ž…๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๊ฐ„์œผ๋กœ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด ์„น์…˜์—์„œ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ธฐ์–ตํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • ์„ธ์…˜ ์ฐฝ์˜ ํฌ๊ธฐ๋Š” ๊ธฐ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ํ™œ๋™์— ๋”ฐ๋ผ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • "ํ…€๋ธ”๋ง" ์ฐฝ์€ ํŠน์ • ๊ธฐ๊ฐ„ ๋‚ด์˜ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐฝ ์ ํ”„ ๊ธฐ๊ฐ„์€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€๋งŒ ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋ฉฐ ๋ชจ๋“  ์ฐฝ์— ์ค‘๋ณต๋˜๋Š” ํ•ญ๋ชฉ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด KTable์„ ๋‹ค์‹œ KStream์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

5.3.3. KStream ๋ฐ KTable ๊ฐœ์ฒด ์—ฐ๊ฒฐ

4์žฅ์—์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐœ์˜ KStream ๊ฐ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ KTable๊ณผ KStream์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ด์œ ๋กœ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. KStream์€ ๋ ˆ์ฝ”๋“œ ์ŠคํŠธ๋ฆผ์ด๊ณ  KTable์€ ๋ ˆ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ ์ŠคํŠธ๋ฆผ์ด์ง€๋งŒ ๋•Œ๋กœ๋Š” KTable์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ฝ”๋“œ ์ŠคํŠธ๋ฆผ์— ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ๊ถŒ ๊ฑฐ๋ž˜์†Œ ๊ฑฐ๋ž˜ ๊ฑด์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ทจํ•ฉํ•˜์—ฌ ๊ด€๋ จ ์—…์ข…์˜ ์ฆ๊ถŒ ๊ฑฐ๋ž˜์†Œ ๋‰ด์Šค์™€ ๊ฒฐํ•ฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ฃผ์‹ ๊ฑฐ๋ž˜ ๊ฑด์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ KTable ๊ฐœ์ฒด๋ฅผ KStream์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ํ•ด๋‹น ์ฃผ์‹ ๊ธฐํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฐ์—… ๋ถ€๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‚ค๋กœ ํ‚ค๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  2. ์ฆ๊ถŒ ๊ฑฐ๋ž˜์†Œ ๋‰ด์Šค๊ฐ€ ํฌํ•จ๋œ ์ฃผ์ œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” KTable ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด KTable์€ ์‚ฐ์—… ๋ถ„์•ผ๋ณ„๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.
  3. ์—…์ข…๋ณ„ ์ฆ๊ถŒ๊ฑฐ๋ž˜์†Œ ๊ฑฐ๋ž˜๊ฑด์ˆ˜ ์ •๋ณด์™€ ๋‰ด์Šค ์—…๋ฐ์ดํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด ์‹คํ–‰ ๊ณ„ํš์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

KTable์„ KStream์œผ๋กœ ๋ณ€ํ™˜

KTable์„ KStream์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. KTable.toStream() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. KStream.map ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ‚ค๋ฅผ ์—…๊ณ„ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พผ ๋‹ค์Œ Windowed ์ธ์Šคํ„ด์Šค์—์„œ TransactionSummary ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(์ฝ”๋“œ๋Š” src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.8).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
KStream.map ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜๋œ KStream ์ธ์Šคํ„ด์Šค๋Š” ์—ฐ๊ฒฐ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ฃผ์‹ ๋‰ด์Šค๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ KTable ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์‹๋‰ด์Šค์šฉ KTable ์ƒ์„ฑ

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ KTable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋Š” ๋‹จ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์ฝ”๋“œ๋Š” src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.9).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋ฌธ์ž์—ด Serdes๊ฐ€ ์„ค์ •์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ Serde ๊ฐœ์ฒด๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ EARLIEST ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ”์˜ ๋งจ ์ฒ˜์Œ ๋ถ€๋ถ„์ด ๋ ˆ์ฝ”๋“œ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

์ด์ œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ ์—ฐ๊ฒฐ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‰ด์Šค ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฑฐ๋ž˜ ํšŸ์ˆ˜ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ฒฐ

์—ฐ๊ฒฐ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์‚ฐ์—…์— ๋Œ€ํ•œ ์ฃผ์‹ ๋‰ด์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Left ์กฐ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.10).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด leftJoin ์—ฐ์‚ฐ์ž๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. 4์žฅ์˜ ์กฐ์ธ๊ณผ ๋‹ฌ๋ฆฌ KStream-KTable ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ฐ ํ‚ค์— ๋Œ€ํ•ด KTable์— ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— JoinWindow ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ์€ ์‹œ๊ฐ„์— ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ๋Š” KTable์— ์žˆ๊ฑฐ๋‚˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๊ฒฐ๋ก : KTable ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š” ์ฐธ์กฐ ๋ฐ์ดํ„ฐ๋กœ KStream์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ KStream์—์„œ ์ด๋ฒคํŠธ๋ฅผ ํ’์„ฑํ•˜๊ฒŒ ํ•˜๋Š” ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5.3.4. GlobalKTable ๊ฐ์ฒด

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๊ฐ•ํ™”ํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 4์žฅ์—์„œ๋Š” ๋‘ KStream ๊ฐ์ฒด ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์„ ๋ณด์•˜๊ณ  ์ด์ „ ์„น์…˜์—์„œ๋Š” KStream๊ณผ KTable ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— ํ‚ค๋ฅผ ์ƒˆ๋กœ์šด ์œ ํ˜•์ด๋‚˜ ๊ฐ’์— ๋งคํ•‘ํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๋ถ„ํ• ์ด ๋ช…์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  Kafka Streams๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒˆ ์„น์…˜์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ํŒŒํ‹ฐ์…”๋‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ด ๋‚ด์šฉ์€ 4์žฅ ํ•˜์œ„ ์„น์…˜ 4.2.4์˜ "๋ฐ์ดํ„ฐ ๋‹ค์‹œ ํŒŒํ‹ฐ์…”๋‹" ์„น์…˜์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

์žฌํŒŒํ‹ฐ์…”๋‹์—๋Š” ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค

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

๋” ์ž‘์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์—ฐ๊ฒฐ

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์—ฐ๊ฒฐ๋  ์ฐธ์กฐ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋ณต์‚ฌ๋ณธ์ด ๊ฐ ๋…ธ๋“œ์— ๋กœ์ปฌ๋กœ ์‰ฝ๊ฒŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์œ„ํ•ด Kafka Streams๋Š” GlobalKTable ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GlobalKTable ์ธ์Šคํ„ด์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ ๋…ธ๋“œ์— ๋ณต์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ ๋…ธ๋“œ์— ์กด์žฌํ•˜๋ฏ€๋กœ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ํ‚ค๋กœ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๋ถ„ํ• ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. GlobalKTable ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ์—†๋Š” ์กฐ์ธ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด์ „ ์˜ˆ์ œ ์ค‘ ํ•˜๋‚˜๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

KStream ๊ฐœ์ฒด๋ฅผ GlobalKTable ๊ฐœ์ฒด์— ์—ฐ๊ฒฐ

ํ•˜์œ„ ์„น์…˜ 5.3.2์—์„œ๋Š” ๊ตฌ๋งค์ž๋ณ„ ๊ตํ™˜ ๊ฑฐ๋ž˜ ์ฐฝ ์ง‘๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ง‘๊ณ„์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{customerId='074-09-3705', stockTicker='GUTM'}, 17
{customerId='037-34-5184', stockTicker='CORK'}, 16

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

์ด๋ฅผ ์œ„ํ•ด ๋ชฉ๋ก 5.11์˜ countStream ๊ฐœ์ฒด(ํ•ด๋‹น ์ฝ”๋“œ๋Š” src/main/java/bbejeck/chapter_5/GlobalKTableExample.java์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ๋‘ ๊ฐœ์˜ GlobalKTable ๊ฐœ์ฒด์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฏธ ์ด์ „์— ๋…ผ์˜ํ–ˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ toStream().map ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ธ๋ผ์ธ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋Œ€์‹  ํ•จ์ˆ˜ ๊ฐœ์ฒด๋กœ ์ถ”์ƒํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” GlobalKTable์˜ ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ‘œ์‹œ๋œ ์ฝ”๋“œ๋Š” src/main/java/bbejeck/chapter_5/GlobalKTableExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)(๋ชฉ๋ก 5.12).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"

์ฃผ์ œ ์ด๋ฆ„์€ ์—ด๊ฑฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ค€๋น„๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‚จ์€ ๊ฒƒ์€ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ฝ”๋“œ(src/main/java/bbejeck/chapter_5/GlobalKTableExample.java ํŒŒ์ผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค(๋ชฉ๋ก 5.13).

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
์ด ์ฝ”๋“œ์—๋Š” ๋‘ ๊ฐœ์˜ ์กฐ์ธ์ด ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ„๋„๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ž‘์—…์ด ๋๋‚˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์กฐ์ธ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

{customer='Barney, Smith' company="Exxon", transactions= 17}

๋ณธ์งˆ์€ ๋ณ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋Š” ๋”์šฑ ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

4์žฅ๊นŒ์ง€ ์นด์šดํŠธ๋‹ค์šดํ•˜๋ฉด ์ด๋ฏธ ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ์—ฐ๊ฒฐ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ํ‘œ์— ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 5.2. ์ด ํ‘œ๋Š” Kafka Streams ๋ฒ„์ „ 1.0.0์˜ ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Kafka Streams in Action"์ด๋ผ๋Š” ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค"
๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์š”์•ฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ(KStream)๊ณผ ์—…๋ฐ์ดํŠธ ์ŠคํŠธ๋ฆผ(KTable)์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ฐธ์กฐ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ์ง€ ์•Š์œผ๋ฉด GlobalKTable ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GlobalKTables๋Š” ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์„ ๊ฐ Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ธ๋“œ์— ๋ณต์ œํ•˜์—ฌ ํ‚ค๊ฐ€ ํ•ด๋‹นํ•˜๋Š” ํŒŒํ‹ฐ์…˜์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ Kafka ์ฃผ์ œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” Kafka Streams ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5.3.5. ์ฟผ๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ํ•ญ์ƒ ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜(๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ) ์ฃผ์ œ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœ๋•์…˜ ๋ชฉ์ ์œผ๋กœ). ์ฃผ์ œ์— ๊ฒฐ๊ณผ๋ฅผ ์“ธ ๋•Œ Kafka ์†Œ๋น„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฃผ์ œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด Wikipedia์˜ ๊ตฌ์ฒดํ™”๋œ ๋ทฐ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œ...์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฌผ๋ฆฌ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›๊ฒฉ ๋ฐ์ดํ„ฐ์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ํ…Œ์ด๋ธ”์ด๋‚˜ ์กฐ์ธ ๊ฒฐ๊ณผ์˜ ํ–‰ ๋ฐ/๋˜๋Š” ์—ด์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์ง‘๊ณ„๋ฅผ ํ†ตํ•ด ์–ป์€ ์š”์•ฝ ํ…Œ์ด๋ธ”์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค." (https://en.wikipedia.org/wiki) /Materialized_view).

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

์ƒํƒœ ์ €์žฅ์†Œ๋ฅผ ์ง์ ‘ ์ฟผ๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋จผ์ € Kafka ์†Œ๋น„์ž๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ•„์š” ์—†์ด ๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํšจ์œจ์„ฑ๋„ ๋†’์•„์ง‘๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ์˜ ์ง€์—ญ์„ฑ ๋•๋ถ„์— ๋น ๋ฅด๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ์ €์žฅ์†Œ์— ๊ธฐ๋ก๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ค‘๋ณต์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

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

์ด ์žฅ์—์„œ ๊ฝค ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ์—ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ์ƒํƒœ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋Œ€ํ™”ํ˜• ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. 9์žฅ์—์„œ๋Š” ๋Œ€ํ™”ํ˜• ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ๊ฐ„๋‹จํ•œ ๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์žฅ๊ณผ ์ด์ „ ์žฅ์˜ ์˜ˆ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ™”ํ˜• ์ฟผ๋ฆฌ์™€ ์ด๋ฅผ Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฐœ์š”

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

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋†’์€ ์ˆ˜์ค€์˜ KStream DSL์„ ์‚ฌ์šฉํ•˜์—ฌ Kafka Streams ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋†’์€ ์ˆ˜์ค€์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ˆ์ถฉ์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค. DSL KStream์œผ๋กœ ์ž‘์—…ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ œ์–ด ์ˆ˜์ค€์„ ์ค„์—ฌ ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ๋Š” ํ•˜์œ„ ์ˆ˜์ค€ ํ•ธ๋“ค๋Ÿฌ ๋…ธ๋“œ API๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๋‹ค๋ฅธ ์ ˆ์ถฉ์•ˆ์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ „๋ณด๋‹ค ๊ธธ์–ด์ง€์ง€๋งŒ ํ•„์š”ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ์ฑ…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐœํ–‰์ธ์˜ ์›น์‚ฌ์ดํŠธ

โ†’ ์ฟ ํฐ์„ ์ด์šฉํ•˜์—ฌ Habrozhiteli 25% ํ• ์ธ์„ ๋ฐ›์œผ๋ ค๋ฉด - ์นดํ”„์นด ์ŠคํŠธ๋ฆผ

โ†’ ์ข…์ด์ฑ… ๊ฒฐ์ œ ์‹œ, ์ „์ž์ฑ…์ด ์ด๋ฉ”์ผ๋กœ ๋ฐœ์†ก๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€