๋ฐ์ท. 5.3. ์ง๊ณ ๋ฐ ์ฐฝ ์์
์ด ์น์ ์์๋ Kafka Streams์ ๊ฐ์ฅ ์ ๋งํ ๋ถ๋ถ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ง๊ธ๊น์ง Kafka Streams์ ๋ค์ ์ธก๋ฉด์ ๋ค๋ฃจ์์ต๋๋ค.
- ์ฒ๋ฆฌ ํ ํด๋ก์ง๋ฅผ ์์ฑํ๊ณ ;
- ์คํธ๋ฆฌ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ ์ฌ์ฉ;
- ๋ฐ์ดํฐ ์คํธ๋ฆผ ์ฐ๊ฒฐ์ ์ํํ๊ณ ;
- ์ด๋ฒคํธ ์คํธ๋ฆผ(KStream)๊ณผ ์ ๋ฐ์ดํธ ์คํธ๋ฆผ(KTable)์ ์ฐจ์ด์
๋ค์ ์์์๋ ์ด๋ฌํ ๋ชจ๋ ์์๋ฅผ โโํ๋๋ก ๋ชจ์ ๊ฒ์ ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ค๋ฅธ ๋ฐ์ด๋ ๊ธฐ๋ฅ์ธ ์๋์ฐ์์ ๋ํด์๋ ์์๋ด ๋๋ค. ์ฒซ ๋ฒ์งธ ์๋ ๊ฐ๋จํ ์ง๊ณ์ ๋๋ค.
5.3.1. ์ ์ข ๋ณ ์ฃผ์๋งค์ถ ์ง๊ณ
์ง๊ณ ๋ฐ ๊ทธ๋ฃนํ๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์์ ์ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ๊ฐ์ธ ๊ธฐ๋ก์ ์ ์ํ๋ฉด์ ๊ฒํ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฐ์ดํฐ์์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ ๊ฒฐํฉํด์ผ ํฉ๋๋ค.
์ด ์์์๋ ์ฌ๋ฌ ์ฐ์ ๋ถ์ผ์ ํ์ฌ ์ฃผ์ ํ๋งค๋์ ์ถ์ ํด์ผ ํ๋ ์ผ์ผ ๊ฑฐ๋์์ ์์์ ์ ๊ฒ ๋ฉ๋๋ค. ํนํ, ๊ทํ๋ ๊ฐ ์ฐ์ ๋ถ์ผ์์ ์ฃผ์ ํ๋งค๋์ด ๊ฐ์ฅ ๋ง์ XNUMX๊ฐ ํ์ฌ์ ๊ด์ฌ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ง๊ณ์๋ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํ์(์ผ๋ฐ์ ์ธ ์ฉ์ด๋ก ๋งํ๋ฉด)์ผ๋ก ๋ณํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
- ์์ ์ฃผ์ ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ ์ฃผ์ ๊ธฐ๋ฐ ์์ค๋ฅผ ๋ง๋ญ๋๋ค. StockTransaction ์ ํ์ ๊ฐ์ฒด๋ฅผ ShareVolume ์ ํ์ ๊ฐ์ฒด์ ๋งคํํด์ผ ํฉ๋๋ค. ์์ ์ StockTransaction ๊ฐ์ฒด์ ํ๋งค ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ง๋ง ํ๋งค๋๋ ์ฃผ์ ์์ ๋ํ ๋ฐ์ดํฐ๋ง ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
- ์ฃผ์ ๊ธฐํธ๋ณ๋ก ShareVolume ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค. ๊ธฐํธ๋ณ๋ก ๊ทธ๋ฃนํํ ํ์๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ๋งค๋์ ์๊ณ๋ก ์ถ์ํ ์ ์์ต๋๋ค. KStream.groupBy ๋ฉ์๋๊ฐ KGroupedStream ์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ KGroupedStream.reduce ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ํธ์ถํ์ฌ KTable ์ธ์คํด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
KGroupedStream ์ธํฐํ์ด์ค๋ ๋ฌด์์ ๋๊น
KStream.groupBy ๋ฐ KStream.groupByKey ๋ฉ์๋๋ KGroupedStream์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. KGroupedStream์ ํค๋ณ๋ก ๊ทธ๋ฃนํํ ํ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ค๊ฐ ํํ์ ๋๋ค. ์ง์ ์ ์ธ ์์ ์ ์ํ ๊ฒ์ด ์ ํ ์๋๋๋ค. ๋์ , KGroupedStream์ ํญ์ KTable์ ์์ฑํ๋ ์ง๊ณ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ณ ์์ ์ ๊ฒฐ๊ณผ๋ KTable์ด๊ณ ์ํ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ดํ๋ผ์ธ ์๋๋ก ์ ์ก๋์ง ์์ ์๋ ์์ต๋๋ค.
KTable.groupBy ๋ฉ์๋๋ ์ ์ฌํ KGroupedTable(ํค๋ณ๋ก ์ฌ๊ทธ๋ฃนํ๋ ์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ค๊ฐ ํํ)์ ๋ฐํํฉ๋๋ค.
์ ์ ์ฌ๋ฉด์ ๊ทธ๋ฆผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. 5.9๋ ์ฐ๋ฆฌ๊ฐ ๋ฌ์ฑํ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ํ ํด๋ก์ง๋ ์ด๋ฏธ ์ฌ๋ฌ๋ถ์๊ฒ ๋งค์ฐ ์ต์ํ ๊ฒ์ ๋๋ค.
์ด์ ์ด ํ ํด๋ก์ง์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค(src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.2).
์ฃผ์ด์ง ์ฝ๋๋ ๊ฐ๊ฒฐ์ฑ๊ณผ ์ฌ๋ฌ ์ค์์ ์ํ๋๋ ๋ง์ ์์ ์์
์ผ๋ก ๊ตฌ๋ณ๋ฉ๋๋ค. 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).
ShareVolume.sum ๋ฉ์๋๋ ์ฃผ์ ํ๋งค๋์ ๋๊ณ๋ฅผ ๋ฐํํ๊ณ ์ ์ฒด ๊ณ์ฐ ์ฒด์ธ์ ๊ฒฐ๊ณผ๋ KTable ๊ฐ์ฒด์
๋๋ค. . ์ด์ KTable์ ์ญํ ์ ์ดํดํ์
จ์ต๋๋ค. ShareVolume ๊ฐ์ฒด๊ฐ ๋์ฐฉํ๋ฉด ํด๋น KTable ๊ฐ์ฒด๋ ์ต์ ํ์ฌ ์
๋ฐ์ดํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ชจ๋ ์
๋ฐ์ดํธ๊ฐ ์ด์ shareVolumeKTable์ ๋ฐ์๋์ง๋ง ๋ชจ๋ ์
๋ฐ์ดํธ๊ฐ ๋ ์ด์ ์ ์ก๋๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ด KTable์ ์ฌ์ฉํ์ฌ (๊ฑฐ๋๋ ์ฃผ์ ์ ๊ธฐ์ค) ์ง๊ณํ์ฌ ๊ฐ ์ฐ์ ์์ ๊ฐ์ฅ ๋ง์ ์ฃผ์์ด ๊ฑฐ๋๋ XNUMX๊ฐ ํ์ฌ์ ๋๋ฌํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์ ์กฐ์น๋ ์ฒซ ๋ฒ์งธ ์ง๊ณ์ ์กฐ์น์ โโ์ ์ฌํฉ๋๋ค.
- ์ฐ์ ๋ณ๋ก ๊ฐ๋ณ ShareVolume ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃนํํ๋ ค๋ฉด ๋ ๋ค๋ฅธ groupBy ์์ ์ ์ํํฉ๋๋ค.
- ShareVolume ๊ฐ์ฒด ์์ฝ์ ์์ํฉ๋๋ค. ์ด๋ฒ์๋ ์ง๊ณ ๊ฐ์ฒด๊ฐ ๊ณ ์ ํฌ๊ธฐ ์ฐ์ ์์ ๋๊ธฐ์ด์ ๋๋ค. ์ด ๊ณ ์ ํฌ๊ธฐ ๋๊ธฐ์ด์๋ ๊ฐ์ฅ ๋ง์ ์์ ์ฃผ์์ ํ๋งคํ XNUMX๊ฐ ํ์ฌ๋ง ์ ์ง๋ฉ๋๋ค.
- ์ด์ ๋จ๋ฝ์ ๋๊ธฐ์ด์ ๋ฌธ์์ด ๊ฐ์ผ๋ก ๋งคํํ๊ณ ์ ์ข ๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ๊ฑฐ๋๋ ์์ XNUMX๊ฐ ์ฃผ์์ ๋ฐํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์์ด ํ์์ผ๋ก ์ฃผ์ ์ ์๋๋ค.
๊ทธ๋ฆผ์์. ๊ทธ๋ฆผ 5.10์ ๋ฐ์ดํฐ ํ๋ฆ ํ ํด๋ก์ง ๊ทธ๋ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ณด์๋ค์ํผ ๋ ๋ฒ์งธ ์ฒ๋ฆฌ ๋ผ์ด๋๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
์ด์ ๋ ๋ฒ์งธ ์ฒ๋ฆฌ ๋ผ์ด๋์ ๊ตฌ์กฐ๋ฅผ ๋ช
ํํ๊ฒ ์ดํดํ์ผ๋ฏ๋ก ํด๋น ์์ค ์ฝ๋๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค(src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.4) .
์ด ์ด๊ธฐํ ํ๋ก๊ทธ๋จ์๋fixedQueue ๋ณ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ ๊ฑฐ๋๋ ์ฃผ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์์ N๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ java.util.TreeSet์ฉ ์ด๋ํฐ์ธ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด์ ๋๋ค.
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์๋ ์ธ ๊ฐ์ง ์ ํ์ ์ฐฝ์ด ์์ต๋๋ค.
- ์ธ์ ๋ณ;
- "ํ ๋ธ๋ง";
- ์ฌ๋ผ์ด๋ฉ/ํธํ.
์ด๋ค ๊ฒ์ ์ ํํ ์ง๋ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ํ ๋ธ๋ง ๋ฐ ์ ํ ์ฐฝ์ ์๊ฐ์ด ์ ํ๋์ด ์๋ ๋ฐ๋ฉด, ์ธ์ ์ฐฝ์ ์ฌ์ฉ์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. ์ธ์ ๊ธฐ๊ฐ์ ์ฌ์ฉ์์ ํ๋ ์ ๋์ ์ํด์๋ง ๊ฒฐ์ ๋ฉ๋๋ค. ๊ธฐ์ตํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ์ ์ ๋ชจ๋ ์ฐฝ ์ ํ์ ์์คํ ์๊ฐ์ด ์๋ ํญ๋ชฉ์ ๋ ์ง/์๊ฐ ์คํฌํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์์ผ๋ก ๊ฐ ์ฐฝ ์ ํ์ผ๋ก ํ ํด๋ก์ง๋ฅผ ๊ตฌํํฉ๋๋ค. ์ ์ฒด ์ฝ๋๋ ์ฒซ ๋ฒ์งธ ์์์๋ง ์ ๊ณต๋๋ฉฐ ๋ค๋ฅธ ์ ํ์ ์ฐฝ์์๋ ์ฐฝ ์์ ์ ํ ์ธ์๋ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
์ธ์ ์ฐฝ
์ธ์ ์ฐฝ์ ๋ค๋ฅธ ๋ชจ๋ ์ ํ์ ์ฐฝ๊ณผ ๋งค์ฐ ๋ค๋ฆ ๋๋ค. ์ด๋ ์๊ฐ๋ณด๋ค๋ ์ฌ์ฉ์์ ํ๋(๋๋ ์ถ์ ํ๋ ค๋ ์ํฐํฐ์ ํ๋)์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค. ์ธ์ ๊ธฐ๊ฐ์ ๋นํ์ฑ ๊ธฐ๊ฐ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
๊ทธ๋ฆผ 5.12๋ ์ธ์ ์ฐฝ์ ๊ฐ๋ ์ ๋ณด์ฌ์ค๋๋ค. ๋ ์์ ์ธ์ ์ด ์ผ์ชฝ ์ธ์ ๊ณผ ๋ณํฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์ธ์ ์ ์ค๋ ๊ธฐ๊ฐ ๋์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌ๋ฉ๋๋ค. ์ธ์ ์ฐฝ์ ์ฌ์ฉ์ ํ๋์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ํญ๋ชฉ์ ๋ ์ง/์๊ฐ ์คํฌํ๋ฅผ ์ฌ์ฉํ์ฌ ํญ๋ชฉ์ด ์ํ ์ธ์ ์ ๊ฒฐ์ ํฉ๋๋ค.
์ธ์ ์ฐฝ์ ์ฌ์ฉํ์ฌ ์ฃผ์ ๊ฑฐ๋ ์ถ์
์ธ์ ์ฐฝ์ ์ฌ์ฉํ์ฌ ๊ตํ ๊ฑฐ๋์ ๋ํ ์ ๋ณด๋ฅผ ์บก์ฒํด ๋ณด๊ฒ ์ต๋๋ค. ์ธ์ ์ฐฝ์ ๊ตฌํ์ ๋ชฉ๋ก 5.5(src/main/java/bbejeck/chapter_5/CountingWindowingAndKTableJoinExample.java์์ ์ฐพ์ ์ ์์)์ ๋์ ์์ต๋๋ค.
์ด ํ ํด๋ก์ง์์ ๋๋ถ๋ถ์ ์์
์ ์ด๋ฏธ ์ดํด๋ณด์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ค์ ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ์๋ก์ด ์์๋ ์๋๋ฐ, ์ด์ ์ด์ ๋ํด ๋
ผ์ํ๊ฒ ์ต๋๋ค.
๋ชจ๋ groupBy ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ผ์ข ์ ์ง๊ณ ์์ (์ง๊ณ, ๋กค์ ๋๋ ๊ณ์ฐ)์ ์ํํฉ๋๋ค. ๋๊ณ๋ฅผ ์ฌ์ฉํ ๋์ ์ง๊ณ ๋๋ ์ง์ ๋ ๊ธฐ๊ฐ ๋ด์ ๋ ์ฝ๋๋ฅผ ๊ณ ๋ คํ๋ ์ฐฝ ์ง๊ณ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๋ชฉ๋ก 5.5์ ์ฝ๋๋ ์ธ์ ์ฐฝ ๋ด์ ํธ๋์ญ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ทธ๋ฆผ์์. 5.13 ์ด๋ฌํ ์กฐ์น๋ ๋จ๊ณ๋ณ๋ก ๋ถ์๋ฉ๋๋ค.
windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) ๋ฅผ ํธ์ถํ์ฌ ๋นํ์ฑ ๊ฐ๊ฒฉ์ด 20์ด์ด๊ณ ์ง์ ๊ฐ๊ฒฉ์ด 15๋ถ์ธ ์ธ์ ์ฐฝ์ ๋ง๋ญ๋๋ค. 20์ด์ ์ ํด ๊ฐ๊ฒฉ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ฌ ์ธ์ ์ข ๋ฃ ๋๋ ์์ ํ 20์ด ์ด๋ด์ ๋์ฐฉํ๋ ๋ชจ๋ ํญ๋ชฉ์ ํ์ฌ(ํ์ฑ) ์ธ์ ์ ํฌํจํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ค์์ผ๋ก ์ธ์
์ฐฝ์์ ์ํํด์ผ ํ๋ ์ง๊ณ ์์
(์ด ๊ฒฝ์ฐ count)์ ์ง์ ํฉ๋๋ค. ์์ ํญ๋ชฉ์ด ๋นํ์ฑ ๊ธฐ๊ฐ(๋ ์ง/์๊ฐ ์คํฌํ์ ์์ชฝ)์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ธ์
์ ์์ฑํฉ๋๋ค. ๋ณด์กด ๊ฐ๊ฒฉ์ ํน์ ์๊ฐ ๋์ ์ธ์
์ ์ ์งํ๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ์ธ์
์ ๋นํ์ฑ ๊ธฐ๊ฐ์ ์ด๊ณผํ์ง๋ง ์ฌ์ ํ ์ฒจ๋ถํ ์ ์๋ ์ง์ฐ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํฉ๋๋ค. ๋ํ ๋ณํฉ์ผ๋ก ์ธํ ์ ์ธ์
์ ์์๊ณผ ๋์ ๊ฐ์ฅ ๋น ๋ฅธ ๋ ์ง/์๊ฐ ์คํฌํ์ ๊ฐ์ฅ ๋ฆ์ ๋ ์ง/์๊ฐ ์คํฌํ์ ํด๋นํฉ๋๋ค.
์ธ์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์์๋ณด๊ธฐ ์ํด count ๋ฉ์๋์ ๋ช ๊ฐ์ง ํญ๋ชฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค(ํ 5.1).
๋ ์ฝ๋๊ฐ ๋์ฐฉํ๋ฉด ๋์ผํ ํค, ํ์ฌ ๋ ์ง/ํ์์คํฌํ๋ณด๋ค ์์ ์ข
๋ฃ ์๊ฐ - ๋นํ์ฑ ๊ฐ๊ฒฉ, ํ์ฌ ๋ ์ง/ํ์์คํฌํ + ๋นํ์ฑ ๊ฐ๊ฒฉ๋ณด๋ค ํฐ ์์ ์๊ฐ์ ๊ฐ์ง ๊ธฐ์กด ์ธ์
์ ์ฐพ์ต๋๋ค. ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ํ์ 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๋ ์ด๋ฌํ ์ํฉ์ ๋ณด์ฌ์ค๋๋ค.
๋ณด์๋ค์ํผ ์ง๋ 20์ด ๋์ ์์ ๋ ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ์ฐฝ์ ํฌํจ๋ฉ๋๋ค. ์ด ๊ธฐ๊ฐ์ด ๋๋๋ฉด ์ ์ฐฝ์ด ์์ฑ๋ฉ๋๋ค.
๋ชฉ๋ก 5.6์ ํ ๋ธ๋ง ์๋์ฐ๋ฅผ ์ฌ์ฉํ์ฌ 20์ด๋ง๋ค ์ฃผ์ ๊ฑฐ๋๋ฅผ ์บก์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค(src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์ ์์).
TimeWindows.of ๋ฉ์๋ ํธ์ถ์ ์กฐ๊ธ๋ง ๋ณ๊ฒฝํ๋ฉด ์ฐ์ ์ฐฝ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์์ ์์๋ Until() ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ๋ณด์กด ๊ฐ๊ฒฉ์ธ 24์๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ฐฝ ์ต์ ์ ๋ง์ง๋ง์ธ "ํธํ" ์ฐฝ์ผ๋ก ์ด๋ํ ์๊ฐ์ ๋๋ค.
์ฌ๋ผ์ด๋ฉ("์ ํ") ์ฐฝ
์ฌ๋ผ์ด๋ฉ/ํธํ ์ฐฝ์ ํ ๋ธ๋ง ์ฐฝ๊ณผ ์ ์ฌํ์ง๋ง ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ฌ๋ผ์ด๋ฉ ์ฐฝ์ ์ต๊ทผ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ์ฐฝ์ ๋ง๋ค๊ธฐ ์ ์ ์๊ฐ ๊ฐ๊ฒฉ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ฐฝ ๊ธฐ๊ฐ๋ณด๋ค ์งง์ ๋๊ธฐ ๊ฐ๊ฒฉ ํ์ ์ ๊ณ์ฐ์ ์์ํฉ๋๋ค.
ํ ๋ธ๋ง ์ฐฝ๊ณผ ์ ํ ์ฐฝ์ ์ฐจ์ด์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฆ๊ถ ๊ฑฐ๋์ ๊ฑฐ๋ ๊ณ์ฐ์ ์๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ฌ์ ํ ํธ๋์ญ์ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด์ง๋ง ์นด์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ์ ์ฒด ์๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ง๋ ์์ต๋๋ค. ๋์ ๋ ์งง์ ๊ฐ๊ฒฉ์ผ๋ก ์นด์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๋ ์ฌ์ ํ 20์ด๋ง๋ค ํธ๋์ญ์ ์๋ฅผ ๊ณ์ฐํ์ง๋ง ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 5์ด๋ง๋ค ์นด์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. 5.15. ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๊ฒน์น๋ ๊ฒฐ๊ณผ ์ฐฝ์ด XNUMX๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ชฉ๋ก 5.7์ ์ฌ๋ผ์ด๋ฉ ์ฐฝ์ ์ ์ํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค(src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์ ์์).
advanceBy() ๋ฉ์๋์ ๋ํ ํธ์ถ์ ์ถ๊ฐํ์ฌ ํ
๋ธ๋ง ์ฐฝ์ ํธํ ์ฐฝ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ํ์๋ ์์์ ์ ์ฅ ๊ฐ๊ฒฉ์ 15๋ถ์
๋๋ค.
์ด ์น์ ์์๋ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๊ฐ์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. ํนํ ์ด ์น์ ์์ ๋ค์ ์ธ ๊ฐ์ง ์ฌํญ์ ๊ธฐ์ตํ์๊ธฐ ๋ฐ๋๋๋ค.
- ์ธ์ ์ฐฝ์ ํฌ๊ธฐ๋ ๊ธฐ๊ฐ์ด ์๋๋ผ ์ฌ์ฉ์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฉ๋๋ค.
- "ํ ๋ธ๋ง" ์ฐฝ์ ํน์ ๊ธฐ๊ฐ ๋ด์ ์ด๋ฒคํธ์ ๋ํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฐฝ ์ ํ ๊ธฐ๊ฐ์ ๊ณ ์ ๋์ด ์์ง๋ง ์์ฃผ ์ ๋ฐ์ดํธ๋๋ฉฐ ๋ชจ๋ ์ฐฝ์ ์ค๋ณต๋๋ ํญ๋ชฉ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก ์ฐ๊ฒฐ์ ์ํด KTable์ ๋ค์ KStream์ผ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
5.3.3. KStream ๋ฐ KTable ๊ฐ์ฒด ์ฐ๊ฒฐ
4์ฅ์์ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ KStream ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ์ด์ KTable๊ณผ KStream์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์์ผ ํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ด์ ๋ก ํ์ํ ์ ์์ต๋๋ค. KStream์ ๋ ์ฝ๋ ์คํธ๋ฆผ์ด๊ณ KTable์ ๋ ์ฝ๋ ์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ด์ง๋ง ๋๋ก๋ KTable์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๋ ์คํธ๋ฆผ์ ์ถ๊ฐ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
์ฆ๊ถ ๊ฑฐ๋์ ๊ฑฐ๋ ๊ฑด์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ทจํฉํ์ฌ ๊ด๋ จ ์ ์ข ์ ์ฆ๊ถ ๊ฑฐ๋์ ๋ด์ค์ ๊ฒฐํฉํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ฝ๋๋ฅผ ๊ณ ๋ คํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ํํด์ผ ํ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฃผ์ ๊ฑฐ๋ ๊ฑด์์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ KTable ๊ฐ์ฒด๋ฅผ KStream์ผ๋ก ๋ณํํ ํ ํด๋น ์ฃผ์ ๊ธฐํธ์ ํด๋นํ๋ ์ฐ์ ๋ถ๋ฌธ์ ๋ํ๋ด๋ ํค๋ก ํค๋ฅผ ๋ฐ๊ฟ๋๋ค.
- ์ฆ๊ถ ๊ฑฐ๋์ ๋ด์ค๊ฐ ํฌํจ๋ ์ฃผ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ KTable ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์๋ก์ด KTable์ ์ฐ์ ๋ถ์ผ๋ณ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
- ์ ์ข ๋ณ ์ฆ๊ถ๊ฑฐ๋์ ๊ฑฐ๋๊ฑด์ ์ ๋ณด์ ๋ด์ค ์ ๋ฐ์ดํธ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
์ด์ ์ด ์คํ ๊ณํ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
KTable์ KStream์ผ๋ก ๋ณํ
KTable์ KStream์ผ๋ก ๋ณํํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
- KTable.toStream() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- KStream.map ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํค๋ฅผ ์ ๊ณ ์ด๋ฆ์ผ๋ก ๋ฐ๊พผ ๋ค์ Windowed ์ธ์คํด์ค์์ TransactionSummary ๊ฐ์ฒด๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ด๋ฌํ ์์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ฒฐํฉ๋๋ค(์ฝ๋๋ src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.8).
KStream.map ์์
์ ์ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ๋ KStream ์ธ์คํด์ค๋ ์ฐ๊ฒฐ์์ ์ฌ์ฉ๋ ๋ ์๋์ผ๋ก ๋ค์ ๋ถํ ๋ฉ๋๋ค.
๋ณํ ํ๋ก์ธ์ค๋ฅผ ์๋ฃํ์ต๋๋ค. ๋ค์์ผ๋ก ์ฃผ์ ๋ด์ค๋ฅผ ์ฝ๊ธฐ ์ํ KTable ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ฃผ์๋ด์ค์ฉ KTable ์์ฑ
๋คํ์ค๋ฝ๊ฒ๋ KTable ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐ๋ ๋จ ํ ์ค์ ์ฝ๋๋ง ํ์ํฉ๋๋ค(์ฝ๋๋ src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.9).
๋ฌธ์์ด Serdes๊ฐ ์ค์ ์ ์ฌ์ฉ๋๋ฏ๋ก Serde ๊ฐ์ฒด๋ฅผ ์ง์ ํ ํ์๊ฐ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ํ EARLIEST ์ด๊ฑฐํ์ ์ฌ์ฉํ๋ฉด ํ
์ด๋ธ์ ๋งจ ์ฒ์ ๋ถ๋ถ์ด ๋ ์ฝ๋๋ก ์ฑ์์ง๋๋ค.
์ด์ ๋ง์ง๋ง ๋จ๊ณ์ธ ์ฐ๊ฒฐ๋ก ๋์ด๊ฐ ์ ์์ต๋๋ค.
๋ด์ค ์ ๋ฐ์ดํธ๋ฅผ ๊ฑฐ๋ ํ์ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ
์ฐ๊ฒฐ์ ๋ง๋๋ ๊ฒ์ ์ด๋ ต์ง ์์ต๋๋ค. ๊ด๋ จ ์ฐ์ ์ ๋ํ ์ฃผ์ ๋ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ Left ์กฐ์ธ์ ์ฌ์ฉํฉ๋๋ค(ํ์ํ ์ฝ๋๋ src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.10).
์ด 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 ๊ฐ์ฒด์ ์ฐ๊ฒฐํฉ๋๋ค.
์ด์ ๋ํด์๋ ์ด๋ฏธ ์ด์ ์ ๋
ผ์ํ์ผ๋ฏ๋ก ๋ฐ๋ณตํ์ง ์๊ฒ ์ต๋๋ค. ํ์ง๋ง toStream().map ํจ์์ ์ฝ๋๋ ๊ฐ๋
์ฑ์ ์ํด ์ธ๋ผ์ธ ๋๋ค ํํ์ ๋์ ํจ์ ๊ฐ์ฒด๋ก ์ถ์ํ๋์ด ์์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ GlobalKTable์ ๋ ์ธ์คํด์ค๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋๋ค(ํ์๋ ์ฝ๋๋ src/main/java/bbejeck/chapter_5/GlobalKTableExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)(๋ชฉ๋ก 5.12).
์ฃผ์ ์ด๋ฆ์ ์ด๊ฑฐ ์ ํ์ ์ฌ์ฉํ์ฌ ์ค๋ช ๋ฉ๋๋ค.
์ด์ ๋ชจ๋ ๊ตฌ์ฑ ์์๊ฐ ์ค๋น๋์์ผ๋ฏ๋ก ๋จ์ ๊ฒ์ ์ฐ๊ฒฐ์ ์ํ ์ฝ๋(src/main/java/bbejeck/chapter_5/GlobalKTableExample.java ํ์ผ์์ ์ฐพ์ ์ ์์)๋ฅผ ์์ฑํ๋ ๊ฒ๋ฟ์ ๋๋ค(๋ชฉ๋ก 5.13).
์ด ์ฝ๋์๋ ๋ ๊ฐ์ ์กฐ์ธ์ด ์์ง๋ง ๊ฒฐ๊ณผ๊ฐ ๋ณ๋๋ก ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ์ ์ฒด ์์
์ด ๋๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ํ์๋ฉ๋๋ค.
์์ ์กฐ์ธ ์์ ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
{customer='Barney, Smith' company="Exxon", transactions= 17}
๋ณธ์ง์ ๋ณํ์ง ์์์ง๋ง ์ด๋ฌํ ๊ฒฐ๊ณผ๋ ๋์ฑ ๋ช ํํด ๋ณด์ ๋๋ค.
4์ฅ๊น์ง ์นด์ดํธ๋ค์ดํ๋ฉด ์ด๋ฏธ ์ฌ๋ฌ ์ ํ์ ์ฐ๊ฒฐ์ด ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ํ์ ๋์ด๋์ด ์์ต๋๋ค. 5.2. ์ด ํ๋ Kafka Streams ๋ฒ์ 1.0.0์ ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ๋ฐ์ํฉ๋๋ค. ํฅํ ๋ฆด๋ฆฌ์ค์์๋ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ฌํญ์ ์์ฝํด ๋ณด๊ฒ ์ต๋๋ค. ๋ก์ปฌ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ์คํธ๋ฆผ(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