๐Ÿ“
[2025/10/27-2025/11/02] ์•„ํ‹ฐํด ๊ณต๋ถ€ ์ •๋ฆฌ
2025๋…„ 11์›” 4์ผ

ํ•ด๋‹น ์•„ํ‹ฐํด ์ •๋ฆฌ๋Š” ๊ท€๋กœ ๋“ค์œผ๋ฉฐ ์ •๋ฆฌํ•˜๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.
๊ตฌ๊ธ€์˜ NotebookLM์œผ๋กœ ์š”์•ฝํ•œ ๋‚ด์šฉ์„
๋ผ๋””์˜ค์ฒ˜๋Ÿผ ์žฌ์ƒํ•ด ๋“ค์œผ๋ฉฐ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๐ŸŽง


ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ค‘์š”์„ฑ, ํšจ๊ณผ์ ์ธ ํ…Œ์ŠคํŠธ ์ „๋žต

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฐ ๊ธฐ์—…์˜ ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๐ŸŽ ์• ํ”Œ

๊ธฐ๋Šฅ ๊ฒ€์ฆ, ๋ฒ„๊ทธ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌ, ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ˜‘์—… ๋„์›€, ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์•ˆ์ •์„ฑ ํ™•๋ณด ๋ฉด์—์„œ ์ข‹๋‹ค.

๐Ÿ’™ ํ† ์Šค

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ๋•Œ ๊ฒ€์ฆํ•˜๊ณ , ๊ธฐ์กด ๊ธฐ๋Šฅ ์ˆ˜์ • ์‹œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํ•„์š”ํ•˜๋‹ค.

ํ˜„์‹ค์—์„œ๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ์ด ์™œ ์–ด๋ ค์šธ๊นŒ?

๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์ž‘์„ฑํ•ด์•ผํ•  ํ…Œ์ŠคํŠธ์˜ ์ ˆ๋Œ€์ ์ธ ์–‘์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ. ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ตฌํ˜„ ์ฝ”๋“œ๋ž‘ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฎ์—ฌ์„œ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ํ…Œ์ŠคํŠธ(fragile test)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ .

๐Ÿ’› ์นด์นด์˜คํŽ˜์ด

์„œ๋น„์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์˜์กด์„ฑ์ด ๋Š˜์–ด๋‚˜๋ฉด์„œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ ธ์„œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ์˜คํžˆ๋ ค ๋–จ์–ด์ง„๋‹ค๋Š” ์ .

๊ทธ๋ ‡๋‹ค๋ฉด ์ข‹์€ ํ…Œ์ŠคํŠธ๋ž€, ์–ด๋–ค ์กฐ๊ฑด์„ ๊ฐ–์ถฐ์•ผํ• ๊นŒ?

ํ† ์Šค์—์„œ๋Š” FIRST ๊ทœ์น™์„ ์†Œ๊ฐœํ•œ๋‹ค.

  • Fast: ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ
  • Indenpendant: ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ธฐ
  • Repeatable: ๋ฐ˜๋ณตํ•ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋‚ด๊ธฐ
  • Self-Validating: ์Šค์Šค๋กœ ๊ฒ€์ฆํ•˜๊ธฐ
  • Timely: ์ ์‹œ์— ์ž‘์„ฑ๋˜๊ธฐ

์• ํ”Œ์—์„œ๋„ ๋…๋ฆฝ์„ฑ, ๋ฐ˜๋ณต๊ฐ€๋Šฅ์„ฑ, ๋ช…ํ™•์„ฑ, ๋น ๋ฅธ ์‹คํ–‰, ์ง€์†์ ์ธ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค.

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

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์›์น™๋ณด๋‹ค ๋”์šฑ ์ค‘์š”ํ•œ ๊ฒƒ์€

๊ทธ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณผ์—ฐ ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ๊ฐ€์น˜์žˆ๋Š”๊ฐ€?(Valuable Test)๊ฐ€ ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค.

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ˆซ์ž๋งŒ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ์ž‘์„ฑ๋œ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ ๋ฐœ๊ฒฌ์ด๋‚˜ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ์— ๊ธฐ์—ฌํ•˜์ง€ ๋ชปํ•œ ํ…Œ์ŠคํŠธ๋Š” ๊ทธ์ € ์‹œ๊ฐ„ ๋‚ญ๋น„์ผ ๋ฟ์ด๋ผ๋Š” ๊ฑฐ๋‹ค.

ํ† ์ŠคํŒ€์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฐ€์น˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ „๋žต์ด๋ž€?

  1. ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค ํ•˜์ง€ ์•Š๊ณ  ์ž‘์„ฑ ๊ฐ€์น˜๋ฅผ ๋”ฐ์ ธ์„œ ์„ ํƒ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. => ํ•ต์‹ฌ ๊ธฐ๋Šฅ 20%์— ์ง‘์ค‘ํ•ด์„œ 80%์˜ ์‹ ๋ขฐ๋„ ํ™•๋ณดํ•˜๊ธฐ!
  2. ์ตœ๋Œ€ํ•œ ์‹ค์šฉ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. => ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ด๋Ÿ‰ ์ค„์ด๊ธฐ!
  3. ํ…Œ์ŠคํŠธ์˜ ํ™•์‹คํ•œ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•ด์„œ ์ž‘์„ฑํ•˜๊ธฐ

๊ทธ๋Ÿผ ์‹ค์ œ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์ „๋žต์„ ๋‹ค๋ฃจ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

ํ† ์ŠคํŒ€์—์„œ ๋„๋ฉ”์ธ ์ •์ฑ… ํ…Œ์ŠคํŠธ๋ฅผ ๋‹จ์œ„/์œ ๋‹› ํ…Œ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ex) ๋งŒ 19์„ธ ๋ฏธ๋งŒ์€ ํŠน์ • ์ด๋ฒคํŠธ์— ์ฐธ์—ฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค

์™ธ๋ถ€ํ™˜๊ฒฝ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜์กด์„ฑ ์—†์ด ํ•ด๋‹น ๋กœ์ง๋งŒ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๋Š”๋ฐ ๋ชฉ์ ์ด ์žˆ๋‹ค. ํ† ์Šค๋Š” ์ด๋Ÿฐ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์„ SUT(System-Under-Test) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. SUT์™€ ํ˜‘๋ ฅ์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ ์ด๋ฅผ ํ˜‘๋ ฅ์ž ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์—ญ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์‹ค์ œ ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋Œ€์—ญ์˜ ์ข…๋ฅ˜

  • Dummy(์ธ์ž๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์•ˆ๋˜๋Š”)
  • Spy(ํ˜ธ์ถœ๋๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š”)
  • Stub(์ •ํ•ด์ง„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”)
  • Mock(ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ํ˜ธ์ถœ๋˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š”)
  • Fake(์‹ค์ œ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ ์šด์˜์—์„œ๋Š” ์“ฐ์ง€ ์•Š๋Š”)

์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๋‘๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ž => ๊ณ ์ „ํŒŒ(Classicist) ํ…Œ์ŠคํŠธ ๋Œ€์—ญ(ํŠนํžˆ Mock ๊ฐ์ฒด)์„ ๋‘๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ž => ๋Ÿฐ๋˜ํŒŒ(London School, Mockist)

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

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

๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์ „, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ค€๋น„์‹œํ‚ค๊ณ (set-up) ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„์—๋Š” ๊นจ๋—ํ•˜๊ฒŒ ์ •๋ฆฌ(tear-down)ํ•œ๋‹ค.

ํ† ์ŠคํŒ€์—์„œ๋Š” JSON ํŒŒ์ผ์„ ์ด์šฉํ•˜๋Š”๋ฐ ์ดˆ๋ฐ˜์—๋Š” SQL์„ ์‚ฌ์šฉํ•  ๋•Œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ๋” ์œ ์—ฐํ•˜๊ณ  ์šฉ์ดํ•œ JSON ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋Œ€์—ญ ํ™œ์šฉ ์‹œ

ํ† ์Šค ์™ธ๋ถ€ ์„œ๋น„์Šค์ธ ๊ฒฝ์šฐ

  • Fake ๊ฐ์ฒด ๊ตฌํ˜„

ํ† ์Šค ๋‚ด๋ถ€ ์„œ๋น„์Šค์ธ ๊ฒฝ์šฐ

  • ๋น„์ฆˆ๋‹ˆ์Šค ์™ธ์ ์ธ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ: Dummy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ํ™•๋ณด๊ฐ€ ์–ด๋ ค์šด ๊ฒฝ์šฐ: ๋ชจ์˜ ๊ฐ์ฒด ํ”„๋ ˆ์ž„์›Œํฌ(Mockito)๋ฅผ ํ†ตํ•ด Stub ์‚ฌ์šฉ
  • ๊ทธ ์™ธ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ: ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

ํ† ์Šค์˜ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ํ…Œ์ŠคํŠธ

ํ† ์Šค์—์„œ๋Š” ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ ์ „๋žต์„ ์ทจํ•˜๊ณ  ์žˆ๋‹ค.

์นด๋‚˜๋ฆฌ ๋ฐฐํฌ๋ž€? ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋จผ์ € ๋ฐฐํฌํ•˜๊ณ  ์ ์ง„์ ์œผ๋กœ ํ™•๋Œ€ํ•˜๋Š” ๋ฐฐํฌ ๋ฐฉ์‹

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ์ƒˆ๋กœ์šด ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์บ์‹œ ๋ฒ„์ €๋‹ ์ „๋žต์ด ํ•„์š”ํ•œ๋ฐ ์ด๊ฑธ ๊ผผ๊ผผํ•˜๊ฒŒ ๋งค๋ฒˆ ์ฑ™๊ธฐ๊ธฐ ์–ด๋ ต๋‹ค.

ํ† ์Šค์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ํ•˜๋‚˜์˜ ์‹ ํ˜ธ๋กœ ๊ฐ€์ ธ๊ฐ€ ๊ฒ€์ฆํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์นด์นด์˜คํŽ˜์ด๋Š” ์™ธ๋ถ€ ํŒŒํŠธ๋„ˆ ์„œ๋น„์Šค์™€์˜ http ํ†ต์‹ ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Mock ์„œ๋ฒ„๋ฅผ ๋„์›Œ ์ง์ ‘ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์—ฐ๋™ํ•˜๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ์‘๋‹ต ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ๋˜์ž ๋น„ํšจ์œจ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋Œ€์•ˆ์œผ๋กœ, ์Šคํ”„๋ง๋ถ€ํŠธ์˜ @MockBean์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰, Bean ์ž์ฒด๋ฅผ mockingํ•˜๋Š” ๊ฒƒ!

ํ•˜์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์Šคํ”„๋ง์€ ํ…Œ์Šคํ‹‘ ์‹คํ–‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๊ฐ„์—๋Š” Application context , ์ฆ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  Bean ๊ฐ์ฒด์™€ ์„ค์ • ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋งŒ๋“ค์–ด์„œ ์บ์‹ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉ(Context Caching)ํ•œ๋‹ค @MockBean์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋งˆ๋‹ค ๊ณ ์œ ํ•œ Mock ์„ค์ •์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋‹ˆ๊นŒ ์Šคํ”„๋ง์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ณ„์† ๋Š˜์–ด๋‚˜๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋•Œ๋ฌธ์— ์ปจํ…์ŠคํŠธ ๋กœ๋”ฉ ์‹œ๊ฐ„ ๋ˆ„์ ์ด ๋˜๊ณ  ์ „์ฒด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์นด์นด์˜คํŽ˜์ด๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ „์šฉ ์„ค์ • ํด๋ž˜์Šค, @TestConfiguration์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— Mock ๊ฐ์ฒด๋ฅผ ์ •์‹ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์Šคํ”„๋ง์€ Mock ๊ฐ์ฒด๋ฅผ ์ผ๋ฐ˜ Bean์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ปจํ…์ŠคํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ™˜๊ฒฝ์€ ์šด์˜ํ™˜๊ฒฝ๊ณผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค!

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

๐Ÿ”— https://d2.naver.com/helloworld/9921217
๐Ÿ”— https://toss.tech/article/test-strategy-server
๐Ÿ”— https://f-lab.kr/insight/backend-test-code-writing-20240716
๐Ÿ”— https://tech.kakaopay.com/post/mock-test-code/


Kafka ๋ฐ์ดํ„ฐ ์œ ์‹ค, ์ค‘๋ณต ๋ฐฉ์ง€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์นดํ”„์นด๋ž‘ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋˜ ๊ทธ ๊ณผ์ •์—์„œ ์•ˆ์ •์„ฑ์€ ์–ด๋–ป๊ฒŒ ํ™•๋ณดํ• ๊นŒ?์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค.

๋งˆ์ผ“์ปฌ๋ฆฌ์™€ ์˜ฌ๋ฆฌ๋ธŒ์˜์˜ ์‚ฌ๋ก€๋ฅผ ๋ณด๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด์ž.

๐Ÿ’œ ๋งˆ์ผ“์ปฌ๋ฆฌ

์ปฌ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์“ฐ๋ฉด์„œ ํ†ตํ•ฉ์— ์–ด๋ ค์›€์„ ๊ฒช์–ด ์นดํ”„์นด์˜ ์ปค๋„ฅํŠธ๋ฅผ ๋„์ž…ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

Kafka Connect๋ž€?

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ์†Œ์Šค(RDBMS, NoSQL, File System ๋“ฑ)๋“ค์„ ์นดํ”„์นด๋ž‘ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฆฌ ์—ญํ• ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š๊ณ  JSON ํ˜•์‹์˜ ์„ค์ • ํŒŒ์ผ ๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ !

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š”๊ฑธ๊นŒ?

alt text ์ถœ์ฒ˜: ๋งˆ์ผ“ ์ปฌ๋ฆฌ ํ…Œํฌ ๋ธ”๋กœ๊ทธ

์นดํ”„์นด ์ปค๋„ฅํŠธ๋ผ๋Š” ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์œ„์— Worker๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ์•„๊ฐ„๋‹ค.

Worker๋Š” ์„ค์ • ํŒŒ์ผ์„ ๋ฐ›์•„๋‚ด๊ณ  Connector๋ผ๋Š” ์นดํ”„์นด ์ปค๋„ฅํŠธ ๋‚ด๋ถ€์˜ ์‹ค์ œ ๋ฉ”์‹œ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•œ๋‹ค.(์นดํ”„์นด ์ปค๋„ฅํŠธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„ ๋˜๋Š” ์ธ์Šคํ„ด์Šค)

Connector๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ์ž‘์—…์˜ task(thread ๋ ˆ๋ฒจ๋กœ ์ˆ˜ํ–‰)๋ผ๋Š” ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณ‘๋ ฌ๋กœ ๋Œ๋ฆฐ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—… ์‹œ์—๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š” ๊ฑธ๊นŒ?

Converter์™€ TransForm

Converter ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์“ฐ๋Š” ์–ธ์–ด๋ฅผ ๋ฐ”๊พธ๋Š” ์—ญํ• .(DB์—์„œ ๋‚˜์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์นดํ”„์นด๊ฐ€ ์•Œ์•„๋“ฃ๊ธฐ ์‰ฝ๊ฒŒ json์ด๋‚˜ avro ๋“ฑ ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜)

Transform ์€ ๋‹ค๋ฅธ ๋ง๋กœ SMT(Single Message Transform) ์ด๋ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ฐ”๊พผ๋‹ค.(ํŠน์ • ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋นผ๊ฑฐ๋‚˜, ๊ฐ’์˜ ํ˜•์‹์„ ๋ฐ”๊พธ๋Š” ๋“ฑ)

๋งˆ์ผ“ ์ปฌ๋ฆฌ๋Š” JDBC ์†Œ์Šค ์ปค๋„ฅํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ SQL ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•œ๋‹ค.

์ฆ๋ถ„ ์ฟผ๋ฆฌ ๋ชจ๋“œ(Incremental Query Mode)

์ปค๋„ฅํ„ฐ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋˜ ๋ฐ์ดํ„ฐ ํŠน์ • ๊ฐ’(ex. ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ID, PK, ํƒ€์ž„ ์Šคํƒฌํ”„)์„ offset์œผ๋กœ ๊ธฐ์–ตํ•œ๋‹ค. ์ดํ›„ ์ด์ „์— ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•˜๋„๋ก ํ•œ๋‹ค.

์ปฌ๋ฆฌ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ CDC(Change Data Capture)๋กœ ํ™œ์šฉํ•œ๋‹ค.

CDC(Change Data Capture)๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ ์„ ๋ชจ๋‘ ์ถ”์ ํ•˜์—ฌ ์ด๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ์ˆ 

๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๋กœ๊ทธ ๊ธฐ๋ฐ˜
    • DB ๋‚ด๋ถ€์˜ ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์„œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€
    • ์žฅ์ : ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ์  ์žก์•„๋ƒ„. DB ๋ถ€ํ•˜ ์ ์Œ. ์‚ญ์ œ ๋ฐ ๋ณ€๊ฒฝ ๋“ฑ์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ๋†“์น˜์ง€ ์•Š์Œ.
    • ๋‹จ์ : ๊ตฌํ˜„ ๋ณต์žกํ•จ. DB์˜ ๋†’์€ ๊ถŒํ•œ ํ•„์š”. ์„ค์ • ๊นŒ๋‹ค๋กœ์›€. DB ์ข…๋ฅ˜๋งˆ๋‹ค ๋กœ๊ทธ ๋ถ„์„ ๋ฐฉ์‹ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ.
  • ์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜
    • ์žฅ์ : ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ๊ฐ„๋‹จ. ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ๊ธฐ ๊ถŒํ•œ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๋กœ๊ทธ ์˜์กด๋„ ๋‚ฎ์Œ. ๊ตฌ์ถ• ๋น„์šฉ ๋‚ฎ์Œ.
    • ๋‹จ์ : ๋ฐ์ดํ„ฐ ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.(์‚ญ์ œ, ๊ฐฑ์‹ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ์ง€์—ฐ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ˆœ์„œ์™€ ์‹ค์ œ DB์— ๋ฐ˜์˜๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ)

์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜์ธ ์ˆœ์„œ๊ฐ€ ๊ผฌ์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปฌ๋ฆฌ์—์„œ๋Š” timestamp.delay.interval.ms ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฆ‰, ์ง€์—ฐ์‹œ๊ฐ„์„ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.(ex. 5๋ถ„์— ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜๋ฉด, ์ง€์—ฐ์‹œ๊ฐ„์„ 2๋ถ„์œผ๋กœ ์žก์•˜์„ ๋•Œ 3๋ถ„๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๋งŒ ์นดํ”„์นด์— ์ ์žฌ์‹œํ‚ค๋Š” ๊ฒƒ)

์ด ์˜ต์…˜์„ ์ ์šฉํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ์€ ์ด ๊ฐ’์ด ํด์ˆ˜๋ก ๊ทธ๋งŒํผ์˜ ์ ์žฌ๊นŒ์ง€์˜ ์ง€์—ฐ๋„ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.(์‹ค์‹œ๊ฐ„์„ฑ ์ €ํ•˜)

์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ท ํ˜• ์žˆ๋Š” ์„ค์ •์„ ํ•˜๋„๋ก ํ•˜์ž!

๐Ÿซ’ ์˜ฌ๋ฆฌ๋ธŒ์˜

์˜ฌ๋ฆฌ๋ธŒ์˜์€ ๋Œ€๊ทœ๋ชจ ์ฃผ๋ฌธ ๊ด€๋ฆฌ์‹œ์Šคํ…œ OMS๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ๊ธฐ์กด์˜ ๋ณต์žกํ–ˆ๋˜ EAI ์™€ Batch ๋ฐฉ์‹ ๋Œ€์‹  Kafka๋ฅผ ์ „๋ฉด ๋„์ž…ํ•ด์„œ ์„ฑ๋Šฅ์„ 3๋ฐฐ์—์„œ 45๋ฐฐ๋กœ ์ฆ๊ฐ€์‹œ์ผฐ๋‹ค๊ณ  ํ•œ๋‹ค.

Kafka์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ Exactly-once guarantees์ด ์žˆ๋Š”๋ฐ, Kafka๋Š” Delivery Semantics๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

Message Delivery Semantics

  • At most once: ์ตœ๋Œ€ ํ•œ ๋ฒˆ์€ ๋ฉ”์„ธ์ง€๊ฐ€ ์ค‘๊ฐ„์— ์œ ์‹ค๋  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ค‘๋ณต์€ ์•ˆ๋œ๋‹ค.
  • At least once: ์ตœ์†Œํ•œ ํ•œ ๋ฒˆ์€ ์œ ์‹ค์€ ์—†์ง€๋งŒ, ์ค‘๋ณต์€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.(Kafka์˜ ๊ธฐ๋ณธ๊ฐ’)
  • Exactly once: ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์€ ์œ ์‹ค๋„ ์—†๊ณ  ์ค‘๋ณต๋„ ์—†์ด ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ „๋‹ฌ๋œ๋‹ค. ๊ตฌํ˜„์ด ๊ฐ€์žฅ ๊นŒ๋‹ค๋กœ์›€.

์˜ฌ๋ฆฌ๋ธŒ์˜์€ ์‚ฌ์šฉ์ž์˜ ๊ฑฐ๋ž˜ ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Exactly once ์ˆ˜์ค€์˜ ์‹ ๋ขฐ์„ฑ์„ ํ™•๋ณดํ•˜๋Š”๊ฒŒ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ณผ์ œ์˜€๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉ”์‹œ์ง€์˜ ์œ ์‹ค๊ณผ ์ค‘๋ณต์€ ์–ด๋А ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•˜๊ณ , ์˜ฌ๋ฆฌ๋ธŒ์˜์€ ์–ด๋–ป๊ฒŒ ์ด ํ•ต์‹ฌ ๊ณผ์ œ์— ๋Œ€ํ•œ ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์„๊นŒ?

alt text ์ถœ์ฒ˜: ์˜ฌ๋ฆฌ๋ธŒ์˜ ํ…Œํฌ ๋ธ”๋กœ๊ทธ

๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ(Producer)์™€ Kafka Broker ์‚ฌ์ด, ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ์ชฝ(Consumer)์™€ Kafka Broker ์‚ฌ์ด ๋‘ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณด์ž.

๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ(Producer)์™€ Kafka Broker ์‚ฌ์ด

์—ฌ๊ธฐ์„œ ์œ ์‹ค์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ๋„์ฐฉ์„ ์ œ๋Œ€๋กœ ๋ชปํ–ˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด acks=all๊ณผ retry ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ acks=all์€ ๋ชจ๋“  ์‘๋‹ต์„ ๋‹ค ํ™•์ธํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋Š” ์ค‘๊ฐ„์˜ Broker ํ•˜๋‚˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋œ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. retry ์„ค์ •์„ ํ†ตํ•ด ์‹คํŒจํ•˜๋ฉด ์žฌ์‹œ๋„๋„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

retry ์‹œ๋„๋กœ ์ค‘๋ณต ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์†ก๋  ๊ฒฝ์šฐ, ๋ฉฑ๋“ฑ์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ง‰์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. enable.idempotence=true ์„ค์ •์„ ํ†ตํ•ด Producer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๊ณ ์œ ํ•œ id๋ž‘ ์ˆœ์„œ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์—ฌ์„œ ๋ณด๋‚ธ๋‹ค. Broker๋Š” ์ด id์™€ ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ณด๊ณ  ์ค‘๋ณต ์ €์žฅ์„ ์•Œ์•„์„œ ๋ง‰์•„๋‚ธ๋‹ค. => ์ด๋Š” Kafka 3.0 ๋ถ€ํ„ฐ๋Š” ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ์ชฝ(Consumer)์™€ Kafka Broker ์‚ฌ์ด

์œ ์‹ค(ex. Consumer๊ฐ€ ์žฌ๊ธฐ๋™ ๋  ๋•Œ, Broker์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ ์žฌ๋˜๋Š” ๊ฒฝ์šฐ => auto.offset.reset=earliest ์‚ฌ์šฉ, spring.kafka.listener.immediate-stop=false ์šฐ์•„ํ•œ ์ค‘๋‹จ ์‚ฌ์šฉ)

์ค‘๋ณต(ex. Consumer๋Š” ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•œ ์ •๋ณด๋ฅผ ์˜คํ”„์…‹์— ์ •๋ฆฌํ•ด์„œ Broker์— ์ปค๋ฐ‹์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์–ด๋– ํ•œ ๋ฌธ์ œ๋กœ ์ปค๋ฐ‹์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด? Broker๋Š” Consumer๊ฐ€ ์•ˆ๋ฐ›์€ ์ค„ ์•Œ๊ณ  ๋‹ค์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ, ์ด๋ฏธ Consumer๋Š” ์ฒ˜๋ฆฌ๋œ ๋ฉ”์‹œ์ง€์ด๋ฏ€๋กœ ์ค‘๋ณต ๋ฌธ์ œ ๋ฐœ์ƒ! => AcksMode=MANUAL_IMMEDIATE(์ฆ‰์‹œ ์ˆ˜๋™ ์ปค๋ฐ‹) ์‚ฌ์šฉ, spring.kafka.listener.immediate-stop=false ์šฐ์•„ํ•œ ์ค‘๋‹จ ์‚ฌ์šฉ )

์ด ์™ธ์—๋„ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ๊ธธ์–ด ์ค‘๋ณต์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

Consumer๊ฐ€ Broker๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ๋ฒˆ ๊ฐ€์ ธ๊ฐ„ ๋’ค์—(poll) ๋‹ค์Œ poll ์š”์ฒญ๊นŒ์ง€ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(max.poll.interval.ms)์ด ์žˆ๋‹ค. ์ด๋ฅผ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ, Broker๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ•ด๋‹น Consumer๋ฅผ ์ œ์™ธํ•ด๋ฒ„๋ฆฐ๋‹ค.(kicked out) ์ดํ›„ ๋‹ค๋ฅธ Consumer์—๊ฒŒ ๋„˜๊ฒจ์ค€๋‹ค.(Rebalancing)

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฒ„์ „ ์—…์ด๋‚˜ session.timeout.ms, heartbeat.interval.ms, max.poll.interval.ms ์„ค์ •๊ฐ’์„ ์กฐ์ •ํ•ด์„œ ์ปจ์Šˆ๋จธ์—๊ฒŒ ์—ฌ์œ ๋ฅผ ์ฃผ๋Š” ๋ฐฉ์‹, ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ตœ์ ํ™”ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Kafka ๊ณ ๊ฐ€์šฉ์„ฑ ๋ณด์žฅ๊ณผ MSK ๋ณด์•ˆ์„ฑ ํŒจ์น˜ ์ด์Šˆ

  1. Broker ๋‹ค์ค‘ํ™”(Multi-AZ): ๋ธŒ๋กœ์ปค ์„œ๋ฒ„๋“ค์„ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ๊ฐ€์šฉ ์˜์—ญ์— ๋‚˜๋ˆ ์„œ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ
  2. Replication Factor: ๋ฐ์ดํ„ฐ ๋ณต์ œ๋ณธ ์ˆ˜
  3. Min In-Sync Replicas: Producer๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ ๋ช‡ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์ด ๋™๊ธฐํ™” ๋˜์–ด์•ผ ํ•˜๋Š”์ง€

Min In-Sync Replicas + acks=all ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๋ฉ”์‹œ์ง€ ์œ ์‹ค ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค!

CooperativeSticky Strategy -> Rebalancing ์‹œ์— ๊ธฐ์กด Partition ํ• ๋‹น์„ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋‹ค๋ฅธ Consumer์—๊ฒŒ ์˜ฎ๊ธด๋‹ค.

DLQ(Dead Letter Queue) ์ž๋™ ๋ฐฑ์—… ์‹œ์Šคํ…œ ๊ตฌ์ถ•

  1. DLQ ๋ฐ์ดํ„ฐ ์ ์žฌ
  2. AWS Kinesis Data Firehose ๋ฐ์ดํ„ฐ ์บก์ณ
  3. S3 ์— Json ํŒŒ์ผ๋กœ ์ €์žฅ
  4. AWS Lambda ํ•จ์ˆ˜๋กœ Json ํŒŒ์ผ์„ Xlsx ํŒŒ์ผ๋กœ ๋ณ€ํ™˜
  5. ๋ฐฑ์—… ์„ฑ๊ณต ์‹œ SNS ํ˜ธ์ถœ
  6. Slack ์„ ํ†ตํ•ด DLQ ์ ์žฌ ๋ฐ ๋ฐฑ์—… ์ƒํƒœ ์•Œ๋žŒ

alt text ์ถœ์ฒ˜: ์˜ฌ๋ฆฌ๋ธŒ์˜ ํ…Œํฌ ๋ธ”๋กœ๊ทธ

๋А๋‚€์ : ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•ˆ์ •์„ฑ ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ๋“ค์„ ์ƒˆ๋กญ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๋“ค์„ ์žƒ์ง€ ์•Š๋„๋ก ๋‹จ๋‹จํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ณ ๋ฏผ์™ ๊ณผ์ •์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค!

๐Ÿ”— https://helloworld.kurly.com/blog/kafka-connect-pipeline/ ๐Ÿ”— https://oliveyoung.tech/2024-10-16/oliveyoung-scm-oms-kafka/


Vite

์™œ Webpack์—์„œ Vite๋กœ ๋ฐ”๊ฟจ๋Š”๊ฐ€?

์นด์นด์˜ค MY๊ตฌ๋… ์„œ๋น„์Šค๋Š” 5๋…„์ „ ๋ฆฌ์•กํŠธ 16๋ฒ„์ „, ์›นํŒฉ 4๋ฒ„์ „์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๋ฆฌ์•กํŠธ 19๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜์–ด์žˆ๋‹ค. ์Šคํ† ๋ฆฌ๋ถ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์ง„ํ–‰ํ–ˆ๋‹ค.

์ตœ์‹  ๊ธฐ์ˆ  ๋„์ž… ๊ณผ์ •(๋ฆฌ์•กํŠธ 19 ์ •์‹ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ)์—์„œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ์˜์กด์„ฑ์ด ๊ผฌ์—ฌ๋ฒ„๋ฆฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

์›นํŒฉ ๊ทธ๋Œ€๋กœ ์จ๋„ ๋˜๋Š”๊ฐ€?

HMR๋„ ๋น ๋ฅด๊ณ  ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋„ ์•ˆ์ •์ ์ด์—ˆ๋Š”๋ฐ ์™œ ๋ฐ”๊พธ๋Š” ๊ฑธ ๊ณ ๋ คํ•ด์•ผ ํ• ๊นŒ?

5๋…„๊ฐ„ ์—…๋ฐ์ดํŠธ ์ž‘์—…์ด ๋งŽ์•„์ง€๋ฉด์„œ ์›นํŒฉ ์„ค์ • ํŒŒ์ผ์ด ์ ์  ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ ธ์„œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์กŒ๋‹ค.

์„ค์ • ๋ณต์žก๋„, ํ˜ธํ™˜์„ฑ, ์ƒํƒœ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋นŒ๋“œ ๋„๊ตฌ ์„ ์ •ํ–ˆ๋‹ค.(์„ฑ๋Šฅ ๋ฐ ์†๋„ ๋ณด๋‹ค๋Š” ์ƒํƒœ๊ณ„์˜ ํž˜์„ ์ค‘์‹œ)

Vite์˜ ํŠน์ง•

  1. ์„ค์ • ํŒŒ์ผ์ด ์›นํŒฉ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค!
  2. ์›นํŒฉ์€ ๋ฒˆ๋“ค๋ง์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, vite๋Š” esm ๋ฐฉ์‹์œผ๋กœ ํ•„์š”ํ•œ ํŒŒ์ผ๋กœ ๊ทธ๋•Œ๊ทธ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.(์ดˆ๊ธฐ ๋กœ๋”ฉ์ด๋‚˜ hmr ์†๋„ ๋น ๋ฅธ ์ด์œ )
  3. rollup ์‚ฌ์šฉ๊ณผ ์ƒํƒœ๊ณ„ ํฌ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.
  4. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํด ์ˆ˜๋ก ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

Parcel์˜ ํŠน์ง•

  1. ์ œ๋กœ config => ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ์•ˆ ๋งž์„ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ƒํƒœ๊ณ„ ์ž‘๋‹ค.

RsBuild์˜ ํŠน์ง•

  1. rust ๊ธฐ๋ฐ˜ => ์„ฑ๋Šฅ ์ข‹๊ณ  ๋นŒ๋“œ ์†๋„ ๋น ๋ฅด๋‹ค.
  2. ์›นํŒฉ ํ˜ธํ™˜์„ฑ good
  3. ๊ฐ€์žฅ ํฐ ์•ฝ์ ์€ ์ƒํƒœ๊ณ„ ๋ถ€์กฑ..

์—„์ฒญ๋‚œ ์†๋„ ํ–ฅ์ƒ vs ๊ฒ€์ฆ๋˜๊ณ  ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„์™€ ์•ˆ์ •์„ฑ

์™œ Vite๋ฅผ ํƒํ–ˆ์„๊นŒ?

  1. ์„ค์ •์˜ ๋ณต์žก๋„ -> ์ค‘๊ฐ„ ์ •๋„์˜ vite ์Šน
  2. ํ˜ธํ™˜์„ฑ -> ์Šคํ† ๋ฆฌ๋ถ๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๊ณ ๋ ค
  3. ์ƒํƒœ๊ณ„ -> llm๋„ ์ถ”์ฒœํ•  ์ •๋„์˜ ์ƒํƒœ๊ณ„(์˜ค..)
  4. ์„ฑ๋Šฅ -> RsBuild๋ณด๋‹จ ๋А๋ฆฌ์ง€๋งŒ ์›นํŒฉ๋ณด๋‹จ ๋น ๋ฅด๋‹ค

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ํ›„ ๊ฒฐ๊ณผ๋Š”? ๊ฐ„ํŽธํ•ด์ง„ ์„ค์ • , ๋นจ๋ผ์ง„ ์ปดํŒŒ์ผ ์‹œ๊ฐ„๊ณผ hmr

๋А๋‚€์ : 5๋…„๊ฐ„ ์ด์–ด์˜จ ํ”„๋กœ์ ํŠธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ์‰ฝ์ง€ ์•Š์„ํ…๋ฐ ์ˆœ์ž‘์—… ์‹œ๊ฐ„ 3์ผ๋งŒ์— ๋๋‚ธ ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž๋“ค ๋ฉ‹์žˆ๋‹ค!

๐Ÿ”— https://tech.kakao.com/posts/770


Kafka์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹

Apache Kafka์˜ ์Šคํ† ๋ฆฌ์ง€ ๊ตฌ์กฐ์™€ KRaft ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ Kafka์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ๋””์Šคํฌ ์–ด๋”˜๊ฐ€์— ์ €์žฅ๋ ํ…๋ฐ ์–ด๋””์— ์ €์žฅ๋˜๋Š”๊ฑธ๊นŒ?

Kafka Broker ์„ค์ • ํŒŒ์ผ์˜ log.dirs ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ์นดํ”„์นด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋””์Šคํฌ ์ƒ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์นดํ”„์นด๋ฅผ ์“ธ ๋•Œ topic๊ณผ partition ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋Š”๋ฐ, ๋””์Šคํฌ์—๋„ partition ๋ณ„๋กœ ํŒŒ์ผ์ด ํ•˜๋‚˜์”ฉ ์ƒ๊ธฐ๋Š” ๊ฑธ๊นŒ?

=> ์‹ค์ œ๋กœ๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋” ์ž˜๊ฒŒ ์ชผ๊ฐœ์ ธ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋‰˜์–ด์„œ ์ €์žฅ๋œ๋‹ค.

์™œ ์–ธ์ œ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆŒ๊นŒ?

=> ๊ด€๋ฆฌ์˜ ํšจ์œจ์„ฑ ๋•Œ๋ฌธ์ด๊ณ  ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ์„ธ๊ทธ๋จผํŠธ(ํ™œ์„ฑ ์„ธ๊ทธ๋จผํŠธ)์˜ ํฌ๊ธฐ๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

๊ทธ๋Ÿผ ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ๋“ค์€ ์–ด๋–ค ๊ฑธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฑธ๊นŒ?

=> ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰๊ณผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  1. .log : ์‹ค์ œ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ(๋ฉ”์‹œ์ง€ offset, timestamp, key, value, header ๋“ฑ)
  2. .index : ๋ชจ๋“  offset ์ •๋ณด๊ฐ€ ์•„๋‹Œ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ๋งˆ๋‹ค ์ƒ๋Œ€ offset๊ณผ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๊ฐ€ .log ํŒŒ์ผ ๋‚ด์— ์ €์žฅ๋œ ๋ฌผ๋ฆฌ์  ์œ„์น˜๋ฅผ ๋งคํ•‘ํ•œ ์ •๋ณด๋งŒ ๋“œ๋ฌธ๋“œ๋ฌธ ์ €์žฅํ•œ๋‹ค.
  3. .timeIndex : ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์„ ํšจ์œจํ™”ํ•˜๊ธฐ ์œ„ํ•จ. ๋ฉ”์‹œ์ง€ timestamp์™€ ๊ทธ ์‹œ์ ์˜ offset์„ ๋งคํ•‘ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

DumpLogSegments๋ž€?

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌถ์–ด batch ๋‹จ์œ„๋กœ ์ €์žฅํ•œ๋‹ค. .log file์— ์‹ค์ œ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ batch ๋‹จ์œ„๋กœ ์Œ“์ธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํŠน์ • ๋ฒˆํ˜ธ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

=> index ํŒŒ์ผ์—์„œ targetOffset ์ดํ•˜์˜ ๊ฐ€์žฅ ํฐ ์˜คํ”„์…‹์„ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ ์ ํžŒ position์œผ๋กœ .log๋ฅผ ํƒ์ƒ‰ํ•œ ๋’ค ์•ž์œผ๋กœ ์ˆœ์ฐจ ์Šค์บ”ํ•ด์„œ targetOffset ๋ ˆ์ฝ”๋“œ์— ๋„๋‹ฌํ•˜๋ฉด ์ฝ๋Š”๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ๋„ˆ๋ฌด ๋“œ๋ฌผ๊ฒŒ ํ•˜๋ฉด ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ , ์ธ๋ฑ์Šค๋ฅผ ๋งŽ์ด ์„ค์ •ํ•˜๋ฉด ์ €์žฅ๊ณผ ์บ์‹œ ๋น„์šฉ๊ณผ ๋ถ€ํ•˜๋ผ๋Š” ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. ์„œ๋น„์Šค ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์ ˆ ํ•„์š”!

์ด๋ ‡๋“ฏ ์นดํ”„์นด๋Š” ๋””์Šคํฌ ๊ธฐ๋ฐ˜์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค์šฐ ํšจ์œจ์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!

KRaft ํ”„๋กœํ† ์ฝœ

Kafka๋Š” ์˜ค๋žซ๋™์•ˆ Zookeeper ๋ฅผ ์ด์šฉํ–ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ค‘์š”ํ•œ ์ •๋ณด(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค(topic ์ •๋ณด Broker ์ƒํƒœ ๋“ฑ))๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํŒŒํ‹ฐ์…˜๋งˆ๋‹ค ๋ฆฌ๋”๋ฅผ ๋ฝ‘๋Š” ์—ญํ• ์„ Zookeeper์—๊ฒŒ ๋งก๊ฒผ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์™ธ๋ถ€์‹œ์Šคํ…œ์˜ ์˜์กด์„ฑ์—์„œ ๋ฒ—์–ด๋‚˜๊ณ ์ž ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด KRaft์ด๋‹ค.

์นดํ”„์นด๊ฐ€ ์ž์ฒด์ ์œผ๋กœ Raft ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ๋งŒ๋“  ๊ฒƒ์ด๋‹ค. ๊ฐ€์žฅ ํฐ ์žฅ์ ์œผ๋กœ, ์šด์˜์ด ํ›จ์”ฌ ๋‹จ์ˆœํ•ด์กŒ๊ณ , ์ž ์žฌ์  ๋ณ‘๋ชฉ ํ˜„์ƒ์ด๋‚˜, ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํƒœ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐ๋œ ์ ์ด๋‹ค.

Raft ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•ฉ์˜๋ฅผ ๋ณด๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

  1. ๋ฆฌ๋” ์„ ์ถœ(Leader Election): ์—ฌ๋Ÿฌ ๋…ธ๋“œ ์ค‘์—์„œ ๋ˆ„๊ฐ€ ๋ฆฌ๋” ์—ญํ• ์„ ํ•  ์ง€ ๋ฏผ์ฃผ์ ์œผ๋กœ ์ •ํ•˜๋Š” ๊ณผ์ •.
  2. ๋กœ๊ทธ ๋ณต์ œ(Log Replication): ๋ฆฌ๋”๊ฐ€ ์ •ํ•ด์ง„ ํ›„, ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ƒˆ๋กœ์šด topic์„ ๋งŒ๋“ ๋‹ค๊ฑฐ๋‚˜ ์„ค์ •์„ ๋ฐ”๊พธ๋Š” ๋“ฑ)์€ ๋ฐ˜๋“œ์‹œ ๋ฆฌ๋”๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋ฆฌ๋”๋Š” ์ด ๋ณ€๊ฒฝ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ๋จผ์ € ์ž์‹ ์˜ ๋กœ๊ทธ์— ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋กํ•œ๋‹ค. ์ดํ›„, ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์—๊ฒŒ ๋กœ๊ทธ์— ์ ์œผ๋ผ๊ณ  ์ „๋‹ฌํ•œ๋‹ค.
  3. ์•ˆ์ „์„ฑ ๊ทœ์น™(Safety Rule): ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์—์„œ๋„ ์ด์ƒํ•˜๊ฒŒ ๋Œ์•„๊ฐ€์ง€ ์•Š๋„๋ก ์—ฌ๋Ÿฌ ์•ˆ์ „ ์žฅ์น˜๋ฅผ ๋งˆ๋ จํ•ด๋‘”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์–ด๋–ค ๋…ธ๋“œ๋“ค์ด KRaft๋ฅผ ์ˆ˜ํ–‰ํ• ๊นŒ?

๋ชจ๋“  Broker๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ, KRaft ๋ชจ๋“œ์—์„œ๋Š” ๋ชจ๋‘์˜ ์—ญํ• ์„ ์„ค์ • ํŒŒ์ผ(process.roles)์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ถ€ ๋…ธ๋“œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ๋กœ ํŠน๋ณ„ํžˆ ์ง€์ •ํ•œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ๋…ธ๋“œ๋“ค์ด ๋ชจ์—ฌ Quorum ์ด๋ฃธ => Raft ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ํ™œ์„ฑ ์ปจํŠธ๋กค๋Ÿฌ ์„ ์ถœ

์—ฌ๊ธฐ์„œ ๋ฆฌ๋”๋กœ ์„ ์ถœ๋œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋Š” ํ™œ์„ฑ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ€ ๋œ๋‹ค.

์ผ๋ฐ˜ Broker ๋…ธ๋“œ๋“ค์€ ํ™œ์„ฑ ์ปจํŠธ๋กค๋Ÿฌ๋ถ€ํ„ฐ ์ตœ์ข…์ ์œผ๋กœ ํ™•์ •๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋กœ๊ทธ๋ฅผ ๋ฐ›์•„ ์ž์‹ ์˜ ์ƒํƒœ๋ฅผ ์ตœ์‹ ์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.

Kraft์—์„œ๋Š” ์˜ต์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” Broker ๋…ธ๋“œ๋‚˜ ํŒ”๋กœ์›Œ ์ƒํƒœ์ธ ์ปจํŠธ๋กค๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•  ๋•Œ pull ๊ธฐ๋ฐ˜ ๋ณต์ œ ๋ฐฉ์‹ ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ pull ๋ฐฉ์‹์ด๋ž€?

Broker๋‚˜ ํŒ”๋กœ์›Œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™œ์„ฑ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ fetch RPC ๋ผ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ โ€œ๋กœ๊ทธ ์ง€๊ธˆ ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฐ›์•˜๋Š”๋ฐ ํ˜น์‹œ ์ตœ์‹  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋‚˜์˜จ ๊ฑฐ ์žˆ์Œ ์ฃผ์„ธ์š”~โ€œํ•˜๊ณ  ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ! ๊ทธ๋Ÿฌ๋ฉด ํ™œ์„ฑ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‘๋‹ต์„ ํ•ด์ค€๋‹ค.

๋™์  Quorum ๊ด€๋ฆฌ ์ง€์›

Kraft๋Š” ๋™์  Quorum ๊ด€๋ฆฌ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์นดํ”„์นด ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ ๋„ ์ปจํŠธ๋กค๋Ÿฌ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค! Quorum์ด ๋‘˜ ์ด์ƒ์œผ๋กœ ์ชผ๊ฐœ์ ธ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ๋”๋ฅผ ์„ ์ถœํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ(split brain)๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ•œ๋‹ค!

๋А๋‚€์ : ๋ฐฉ๋Œ€ํ•˜๋‹ค..! ์นดํ”„์นด์— ๋Œ€ํ•ด ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ๋งค์šฐ ์œ ์ตํ–ˆ๋‹ค. ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์›๋ฆฌ๋“ค์ด ์ •๋ง ์„ธ์„ธํ•˜๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ž˜ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ”— https://rohithsankepally.github.io/Kafka-Storage-Internals/
๐Ÿ”— https://developers.redhat.com/articles/2025/09/17/deep-dive-apache-kafkas-kraft-protocol