์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ksqlDB

๋ณธ ๊ฐ•์˜๋Š” ksqlDB์˜ ํ™œ์šฉ๊ณผ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹ค์–‘ํ•œ ์‹ค์Šต์„ ํ†ตํ•ด ์ตํž ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ Kafka(์นดํ”„์นด) ๊ธฐ๋ฐ˜์˜ ์‹ค์‹œ๊ฐ„ Streaming ๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•ํ•˜์‹ค ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(5.0) ์ˆ˜๊ฐ•ํ‰ 20๊ฐœ

์ˆ˜๊ฐ•์ƒ 372๋ช…

๋‚œ์ด๋„ ์ค‘๊ธ‰์ด์ƒ

์ˆ˜๊ฐ•๊ธฐํ•œ ๋ฌด์ œํ•œ

๋จผ์ € ๊ฒฝํ—˜ํ•œ ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํ›„๊ธฐ

๋จผ์ € ๊ฒฝํ—˜ํ•œ ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํ›„๊ธฐ

5.0

5.0

logt

100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

์„ ์ƒ๋‹˜์ด ๋งˆ์ง€๋ง‰์— ๋ณด๋„ˆ์Šค๋กœ ElasticSearch์™€ Kibana๋ฅผ ์ด์šฉํ•ด์„œ ๊ทธ๋ž˜ํ”„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊นŒ์ง€ ๋ชจ๋“  ์‹ค์Šต์„ ๊ฐ€๋ฅด์ณ ์ฃผ์…”์„œ Kafka ๋กœ๋“œ๋งต์˜ ํ”ผ๋‚ ๋ ˆ๋ฅผ ์žฅ์‹ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๋‹ˆ ๋ฟŒ๋“ฏํ•˜๋„ค์š”. ์ข‹์€ ๊ฐ•์˜ ์ œ๊ณตํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

5.0

jsggo2001

100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

5.0

Matthew

33% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

๋‚˜๋งŒ ๋“ฃ๊ณ  ์‹ถ์€ ๊ฐ•์˜๐Ÿ‘๐Ÿ‘๐Ÿ‘ ๊ฐ•์˜์ž๋ฃŒ์™€ ์„ค๋ช…์ด ๋งค์šฐ ์ข‹์Šต๋‹ˆ๋‹ค. ksqlDB๋งŒ ๋“ค์œผ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ๊ฐ•์˜๋„ ๋“ฃ๊ณ  ์‹ถ์–ด์กŒ์–ด์š”.

์ˆ˜๊ฐ• ํ›„ ์ด๋Ÿฐ๊ฑธ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”

  • KSQLDB์˜ ๊ธฐ๋ฐ˜ ๊ฐœ๋…๋ถ€ํ„ฐ Advanced ์•„ํ‚คํ…์ฒ˜๊นŒ์ง€

  • Stream๊ณผ Table์˜ ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ  Stateful(์ƒํƒœ๊ฐ€ ์žˆ๋Š”) Streaming ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • KSQLDB ์ฃผ์š” ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ์ •๋ณด, ๋‹ค์–‘ํ•œ Data ํƒ€์ž…์˜ ์ดํ•ด

  • KSQLDB์—์„œ RocksDB ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • KSQLDB์˜ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ๊ณผ ํ•จ์ˆ˜ ์ดํ•ด

  • Group by ์™€ Mview ์ดํ•ด์™€ ํ™œ์šฉ, ๊ทธ๋ฆฌ๊ณ  ํŠน์ˆ˜์„ฑ๊ณผ ์ œ์•ฝ

  • ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ KSQLDB ์กฐ์ธ ์ดํ•ด์™€ ํ™œ์šฉ ๊ทธ๋ฆฌ๊ณ  ํŠน์ˆ˜์„ฑ๊ณผ ์ œ์•ฝ

  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์œ ํ˜•์˜ Window๋“ค์˜ ์ดํ•ด ๋ฐ Time ๊ธฐ๋ฐ˜ Window Aggregation๊ณผ Window ์กฐ์ธ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • KSQLDB์—์„œ Connect ํ™œ์šฉ

  • KSQLDB์™€ Elasticsearch ์—ฐ๋™ ๋ฐ Kibana๋ฅผ ํ†ตํ•œ ๋ถ„์„ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”

๋Œ€์šฉ๋Ÿ‰ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„ ์‹œ์Šคํ…œ, 
Kafka + ksqlDB๋กœ ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ! 

์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ 
ํšจ์œจ๊ณผ ํ™•์žฅ์„ฑ์„ ์žก๊ณ  ์‹ถ๋‹ค๋ฉด?

Kafka(์นดํ”„์นด)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๋Œ€์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ ksqlDB๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

Kafka์™€ ํ†ตํ•ฉ๋˜์–ด ์„ค์น˜ ๋ฐ ๊ตฌ๋™๋˜๋Š” ksqlDB๋Š” ๋ณต์žกํ•œ Streaming API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‹จ ๋ช‡ ์ค„์˜ SQL ์ฝ”๋“œ๋งŒ์œผ๋กœ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€๊ณต/๋ณ€ํ™˜/๋ถ„์„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ปจํ”Œ๋ฃจ์–ธํŠธ ๊ณต์‹ ํŽ˜์ด์ง€์—์„œ ๋ฐœ์ทŒ (๋งํฌ)

์ด๋ฏธ ๊ตญ๋‚ด์™ธ ์œ ์ˆ˜ ๊ธฐ์—…๋“ค์ด ๊ณผ๊ฑฐ์™€ ๋น„ํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋Œ€์šฉ๋Ÿ‰์ด๋ฉด์„œ ๋น ๋ฅธ Latency๋ฅผ ๊ฐ€์ง€๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์˜ํ•˜๋ ค๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ksqlDB๋ฅผ ์ ๊ทน์ ์œผ๋กœ ๋„์ž…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ณผ๊ฑฐ์—๋Š” Kafka ๊ธฐ๋ฐ˜์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต/๋ณ€ํ™˜/๋ถ„์„์„ ์œ„ํ•ด ๋ณต์žกํ•œ Kafka Streams API๋ฅผ ํ™œ์šฉํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋งŒ์œผ๋กœ๋„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ksqlDB๊ฐ€ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋Œ€์„ธ๊ฐ€ ๋˜์–ด ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๋Š” ksqlDB, ๊ทธ๋ฆฌ๊ณ  ๋ถ€์กฑํ•œ ์ „๋ฌธ๊ฐ€

ksqlDB๋Š” SQL ๊ธฐ๋ฐ˜์˜ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•œ ๊ตฌํ˜„ ๋“ฑ ์—ฌ๋Ÿฌ ์žฅ์ ์œผ๋กœ ์ธํ•ด ๊ธฐ์กด์˜ ์นดํ”„์นด Streams API๋ฅผ ๋น ๋ฅด๊ฒŒ ๋Œ€์ฒดํ•˜๋ฉฐ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ksqlDB๋ฅผ ์‹ค๋ฌด์— ํ™œ์šฉํ•  ์ •๋„์˜ ์‹ค๋ ฅ์„ ๊ฐ–์ถ˜ ํ˜„์—… ์ธ๋ ฅ์„ ์ฐพ๊ธฐ๋Š” ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ksqlDB๊ฐ€ ๋น„๊ต์  ์ตœ๊ทผ์— ๋ถ€๊ฐ๋œ ์†”๋ฃจ์…˜์ž„๊ณผ ๋™์‹œ์—, ksqlDB๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ž๋ฃŒ๋‚˜ ๊ฐ•์˜๊ฐ€ ํ”ผ์ƒ์ ์ธ ๊ฐœ๋… ์œ„์ฃผ์˜ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์‹ค๋ฌด์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์‹ค๋ ฅ์„ ์Œ“๊ธฐ์—๋Š” ๋ถ€์กฑํ•จ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


์‹ค์‹œ๊ฐ„ ๋Œ€์šฉ๋Ÿ‰ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ.

โ€˜์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ksqlDBโ€™๋Š” 

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

โœ… ๋ฒˆ๋ฒˆ์ด ksqlDB์˜ ๋†’์€ ๋ฒฝ์— ๊ฐ€๋กœ๋ง‰ํžˆ์‹  ๋ถ„

โœ… ksqlDB์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„

โœ… ์—…๋ฌด์— ์ฆ‰๊ฐ์ ์œผ๋กœ ksqlDB๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์œผ์‹  ๋ถ„

์ด์— ๋ณธ ๊ฐ•์˜๋Š” ์ˆ˜๊ฐ•์ƒ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ksqlDB๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์ฒด๋“ํ•ด์•ผ ํ•  ๋‚ด์šฉ๋“ค๋กœ ์ฑ„์›Œ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜๋งŒ์˜ ํŠน์ง•์„ 
ํ™•์ธํ•ด๋ณด์„ธ์š”.

์ƒ์„ธํ•œ ์‹œ๊ฐ์ž๋ฃŒ์™€ ์‹ค์Šต์„ ํ†ตํ•ด ksqlDB ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ๋“ค์˜ ํ•ต์‹ฌ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ฒด๋“

ksqlDB๋Š” ์ผ๋ฐ˜ RDBMS์™€ ๋น„์Šทํ•œ ๋ถ€๋ถ„๋„ ์žˆ์ง€๋งŒ, ์ƒ๋‹นํžˆ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ksqlDB๋ฅผ ์ž˜ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์ธ Stream, Table, Query, Mview, RocksDB ๋“ฑ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ƒ์„ธํžˆ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ฐ•์˜๋Š” ์ƒ์„ธํ•œ ์‹œ๊ฐ์ž๋ฃŒ์™€ ์‹ค์Šต์„ ํ†ตํ•ด  ksqlDB์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ฒด๋“ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€๋“œ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

ksqlDB ๊ณ ์œ ์˜ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜, ์กฐ์ธ, Group by, Window ํ™œ์šฉ ๋ฐ ์‹ค๋ฌด ํ™œ์šฉ์„ ์œ„ํ•œ ์‹ค์ „ ์‹ค์Šต๊นŒ์ง€

ksqlDB๋ฅผ ์‹ค๋ฌด์—์„œ ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด ksqlDB์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์„  ์กฐ์ธ ๋ฐ Group by, ๊ทธ๋ฆฌ๊ณ  Window ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ksqlDB์˜ ์กฐ์ธ, Group by, Window๋Š” SQL๊ณผ๋Š” ๋‹ค๋ฅธ ์ œ์•ฝ์ ๋“ค์ด ์žˆ์œผ๋ฉฐ, ์ด๋“ค์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ksqlDB๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณธ ๊ฐ•์˜์—์„œ ์ด๋“ค ์š”์†Œ๋“ค์„ ๋งŽ์€ ์‹ค์Šต์„ ํ†ตํ•ด์„œ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด ๋ณด๋ฉด์„œ ๊ทธ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณ„๋„๋กœ ๋งˆ๋ จ๋œ '์˜จ๋ผ์ธ ์‹ ๋ฐœ Shop' ์‹ค์ „ ์‹ค์Šต ์„น์…˜์„ ํ†ตํ•ด, ์—ฌ๋Ÿฌ๋ถ„์„ ์‹ค๋ฌด์—์„œ ksqlDB์—์„œ ๋‹ค์–‘ํ•œ ์‹ค์‹œ๊ฐ„ ๋ถ„์„์„ ํšจ์œจ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ด๋Œ์–ด ๋“œ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

ksqlDB์—์„œ Connect ํ™œ์šฉ, ๊ทธ๋ฆฌ๊ณ  Elasticsearch ์—ฐ๋™๊ณผ Kibana ์‹œ๊ฐํ™”๊นŒ์ง€

ksqlDB์—์„œ Connect์˜ ํ†ตํ•ฉํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋˜ํ•œ ksqlDB์˜ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ Elasticsearch๋กœ Connect๋ฅผ ํ†ตํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ Kibana๋ฅผ ํ†ตํ•ด ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์Šต์„ ํ†ตํ•ด ์ตํžˆ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

ksqlDB ์ดˆ๋ณด์—์„œ ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์œผ๋กœ ์ด๋Œ์–ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

โš™๏ธ

ksqlDB ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋“ค์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

๐Ÿ”Ž

Stream๊ณผ Table์˜ ์ฐจ์ด ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•, ์ฃผ์š” ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

๐Ÿงฐ

์‹ค์Šต์„ ํ†ตํ•œ ksqlDB์˜ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ๊ณผ ์ฃผ์š” ํ•จ์ˆ˜์˜ ์ดํ•ด

๐Ÿ“Š

ksqlDB ๊ณ ์œ ์˜ Group by, MView, Join ์ดํ•ด์™€ ํ™œ์šฉ, RDBMS์™€์˜ ์ฐจ์ด ๋ฐ ์ œ์•ฝ ์‚ฌํ•ญ

๐Ÿ”

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์œ ํ˜•์˜ Window์— ๋Œ€ํ•œ ์ดํ•ด ๋ฐ Time ๊ธฐ๋ฐ˜ Window Aggregation, Window ์กฐ์ธ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‹ค์Šต

๐Ÿ’พ

Connect์™€์˜ ์—ฐ๋™ ๋ฐ Elasticsearch์™€ Kibana๋ฅผ ํ†ตํ•œ ๋ถ„์„ ๊ฒฐ๊ณผ์˜ ์ˆ˜์ง‘ ๋ฐ ์‹œ๊ฐํ™”

ksqlDB ๊ฒ‰ํ•ฅ๊ธฐ๊ฐ€ ์•„๋‹Œ, ์ง€๊ธˆ๊นŒ์ง€์˜ ์–ด๋–ค ๊ฐ•์˜๋‚˜ ์ธํ„ฐ๋„ท ์ž๋ฃŒ์—์„œ๋„ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†์—ˆ๋˜ ํ•ต์‹ฌ์ ์ธ ๋‚ด์šฉ๊ณผ ํ™œ์šฉ๋ฒ•์„ ๋‹ด์•„๋‚ด๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์Šต์„ ํ†ตํ•ด ์ด๋ก ์„ ๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ตํž ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ์‹ค์Šต ์ˆ˜์—…์œผ๋กœ ์ปค๋ฆฌํ˜๋Ÿผ์„ ๊ฐ€๋“ ์ฑ„์› ์Šต๋‹ˆ๋‹ค.

๋ณธ ๊ฐ•์˜๋ฅผ ๋งˆ์น˜์‹  ๋’ค์—๋Š”, ๋ˆ„๊ตฌ์™€ ๊ฒฌ์ฃผ์–ด๋„ ์†์ƒ‰์—†๋Š” ksqlDB ์ „๋ฌธ๊ฐ€๋กœ ์„ฑ์žฅํ•ด ์žˆ๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์ƒ์„ธํ•œ ์„ค๋ช…, ๋‹ค์–‘ํ•œ ์‹ค์Šต์œผ๋กœ ๋‚ด์šฉ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. 
(์ˆ˜๊ฐ•์ƒ ๋ถ„๋“ค๊ป˜๋Š” 100ํŽ˜์ด์ง€ ์ด์ƒ์˜ ๊ฐ•์˜ ๊ต์žฌ PDF๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.) 

๐Ÿ’ก ์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

  • ๋ณธ ๊ฐ•์˜์—์„œ๋Š” ksqlDB๋งŒ ๋‹ค๋ฃจ๋ฉฐ, Kafka Streams๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
  • Macbook M1/M2 ๋ชจ๋ธ PC์—์„œ๋Š” Virtualbox VM ํ˜ธํ™˜ ์‹ค์Šต์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์‹ค์Šต ํ™˜๊ฒฝ 

์„œ๋ฒ„ OS 

์นดํ”„์นด ์„œ๋ฒ„ OS๋กœ ์˜ค๋ผํด(Oracle) VirtualBox VM ๊ธฐ๋ฐ˜์—์„œ Ubuntu Linux(์šฐ๋ถ„ํˆฌ ๋ฆฌ๋ˆ…์Šค) 20.04๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ ๊ฐ€์ƒ ๋จธ์‹  ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋™๋˜๋ฏ€๋กœ Windows/macOS ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VirtualBox๋Š” Windows/macOS ํ™˜๊ฒฝ์—์„œ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ ์„ค์น˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ Mac์˜ ๊ฒฝ์šฐ ์ตœ์‹  M1 ๋ชจ๋ธ์—์„œ VirtualBox๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ UTM๋“ฑ์˜ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์ด์šฉํ•˜์—ฌ Ubuntu๋ฅผ ์„ค์น˜ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. M1 ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ Ubuntu๊ฐ€ ์„ค์น˜๋˜๋Š”์ง€ ํ™•์ธ ํ›„ ๊ฐ•์˜๋ฅผ ์„ ํƒํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.  

์ปจํ”Œ๋ฃจ์–ธํŠธ ์นดํ”„์นด 
์ปค๋ฎค๋‹ˆํ‹ฐ ์—๋””์…˜  

์นดํ”„์นด๋Š” ์•„ํŒŒ์น˜ ์นดํ”„์นด(Apache Kafka)๊ฐ€ ์•„๋‹Œ ์ปจํ”Œ๋ฃจ์–ธํŠธ ์นดํ”„์นด(Confluent Kafka) Community Edition ๋ฒ„์ „ 7.1.2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๊ถŒ์žฅ PC ์‚ฌ์–‘ 

์ „์ฒด ์‹ค์Šต ํ™˜๊ฒฝ ๊ตฌ์„ฑ์œผ๋กœ 20~30GB์˜ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰, 4GB ์ด์ƒ์˜ RAM์„ ๊ฐ–์ถ˜ PC ํ™˜๊ฒฝ์ด ์š”๊ตฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Q&A๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š” ๐Ÿ’ฌ

Q. ์ด์ „ ๊ฐ•์˜์ธ ์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ์ฝ”์–ดํŽธ์ด๋‚˜ ์ปค๋„ฅํŠธํŽธ์„ ๋“ค์–ด์•ผ ํ•˜๋‚˜์š”?

 ๋ณธ ๊ฐ•์˜ ์ค‘ 2๊ฐœ ์„น์…˜์€ ksqlDB์™€ Connect์˜ ์—ฐ๋™์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ์ปค๋„ฅํŠธํŽธ์„ ์ˆ˜๊ฐ•ํ•˜์ง€ ์•Š์œผ์…จ๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์ธ Connect์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์‹ค์Šต ๊ฒฝํ—˜์€ ์žˆ์œผ์…”์•ผ ํ•ด๋‹น ์„น์…˜ ์‹ค์Šต์„ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

์นดํ”„์นด ์ฝ”์–ด์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ•์˜์ธ ์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ์ฝ”์–ดํŽธ์„ ์ˆ˜๊ฐ•ํ•˜์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ˆ˜๊ฐ•ํ•˜์ง€ ์•Š์œผ์…จ๋”๋ผ๋„ ์นดํ”„์นด์˜ ๊ธฐ๋ณธ์ธ Broker, Producer, Consumer์˜ ํ™œ์šฉ ๊ฒฝํ—˜์ด ์žˆ๊ณ  ํ•ต์‹ฌ ๊ฐœ๋…์ด ์ž˜ ์žกํ˜€ ์žˆ์œผ์‹œ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ๋ณธ ๊ฐ•์˜๋ฅผ ๋“ค์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. ๊ฐ•์˜ ์ˆ˜๊ฐ•์„ ์œ„ํ•ด RDBMS SQL๊ฒฝํ—˜์ด ์žˆ์–ด์•ผ ํ•˜๋‚˜์š”?

๋ณธ ๊ฐ•์˜์˜ ๋งŽ์€ ์‹ค์Šต์ด ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ RDBMS SQL ๊ตฌ๋ฌธ ๋ฐ Group by์™€ Join์— ๋Œ€ํ•œ ํ™œ์šฉ ๊ฒฝํ—˜์ด ์žˆ์œผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • KSQLDB์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ์‰ฝ๊ณ  ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์›ํ•˜๋Š” ๋ชจ๋“  ๋ถ„๋“ค

  • Kafka ๊ธฐ๋ฐ˜์—์„œ ๋Œ€๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ Streaming ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต/๋ณ€ํ™˜ ๋ถ„์„ ์‹œ์Šคํ…œ์„ ๋น ๋ฅด๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด

  • ์‹ค์‹œ๊ฐ„ Streaming ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ™œ์šฉ์ด ํ•„์š”ํ•œ ๋ถ„์„๊ฐ€์™€ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ

  • ๊ธฐ์กด Producer/Consumer๊ธฐ๋ฐ˜ ๋˜๋Š” Kafka Streams ๊ธฐ๋ฐ˜์—์„œ KSQLDB ๊ธฐ๋ฐ˜์œผ๋กœ Application์„ Migrationํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • (์นดํ”„์นด ์™„๋ฒฝ ๊ฐ€์ด๋“œ - ์ฝ”์–ดํŽธ์„ ์ˆ˜๊ฐ•ํ•˜์…จ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ) ํ† ํ”ฝ/ํ”„๋กœ๋“€์„œ/์ปจ์Šˆ๋จธ์— ๋Œ€ํ•œ ํ™•์‹คํ•œ ๊ธฐ๋ณธ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

  • ์นดํ”„์นด Connect์— ๋Œ€ํ•œ ๊ธฐ๋ฐ˜ ์ง€์‹

  • ๋งŽ์€ ์‹ค์Šต์ด ์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์กฐ์ธ๊ณผ Group By๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ธฐ๋ณธ SQL ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š”
๊ถŒ ์ฒ ๋ฏผ์ž…๋‹ˆ๋‹ค.

27,750

๋ช…

์ˆ˜๊ฐ•์ƒ

1,485

๊ฐœ

์ˆ˜๊ฐ•ํ‰

4,063

๊ฐœ

๋‹ต๋ณ€

4.9

์ 

๊ฐ•์˜ ํ‰์ 

15

๊ฐœ

๊ฐ•์˜

(์ „) ์—”์ฝ”์•„ ์ปจ์„คํŒ…

(์ „) ํ•œ๊ตญ ์˜ค๋ผํด

AI ํ”„๋ฆฌ๋žœ์„œ ์ปจ์„คํ„ดํŠธ

ํŒŒ์ด์ฌ ๋จธ์‹ ๋Ÿฌ๋‹ ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ €์ž

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

139๊ฐœ โˆ™ (21์‹œ๊ฐ„ 31๋ถ„)

ํ•ด๋‹น ๊ฐ•์˜์—์„œ ์ œ๊ณต:

์ˆ˜์—…์ž๋ฃŒ
๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

20๊ฐœ

5.0

20๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

  • rino980715๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    rino980715

    ์ˆ˜๊ฐ•ํ‰ 2

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    60% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    • ๊ถŒ ์ฒ ๋ฏผ
      ์ง€์‹๊ณต์œ ์ž

      ์ข‹์€ ์ˆ˜๊ฐ•ํ‰ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ^^

  • ํ”ผ๊ณคํ•œ๊ฐœ๋ฐœ์ž๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ํ”ผ๊ณคํ•œ๊ฐœ๋ฐœ์ž

    ์ˆ˜๊ฐ•ํ‰ 81

    โˆ™

    ํ‰๊ท  ํ‰์  4.9

    5

    7% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    • ๊ถŒ ์ฒ ๋ฏผ
      ์ง€์‹๊ณต์œ ์ž

      ์ข‹์€ ์ˆ˜๊ฐ•ํ‰ ๊ฐ์‚ฌ ๋“œ๋ ค์š” ^^

  • ์ •์ง„๋ฌต๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ์ •์ง„๋ฌต

    ์ˆ˜๊ฐ•ํ‰ 2

    โˆ™

    ํ‰๊ท  ํ‰์  4.5

    4

    30% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    • jongho97.han๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
      jongho97.han

      ์ˆ˜๊ฐ•ํ‰ 15

      โˆ™

      ํ‰๊ท  ํ‰์  5.0

      5

      30% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

      • yjkim93๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
        yjkim93

        ์ˆ˜๊ฐ•ํ‰ 2

        โˆ™

        ํ‰๊ท  ํ‰์  5.0

        5

        100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

        • ๊ถŒ ์ฒ ๋ฏผ
          ์ง€์‹๊ณต์œ ์ž

          ์ข‹์€ ์ˆ˜๊ฐ•ํ‰ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

      ๊ถŒ ์ฒ ๋ฏผ๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

      ์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

      ๋น„์Šทํ•œ ๊ฐ•์˜

      ๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

      ์‹ ๊ทœ ๊ฐ•์˜ ์˜คํ”ˆ ๊ธฐ๋… ์ „ ๊ฐ•์˜ 30% ํ• ์ธ ์ค‘ (1์ผ ๋‚จ์Œ)

      ์›” โ‚ฉ291,953

      5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

      29%

      โ‚ฉ99,000

      โ‚ฉ1,459,764