
์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ ๊ณจ์นซ๊ฑฐ๋ฆฌ '๊ธ๋ฆฌ์น(Glitch)', ์ ์ค์ํ ๊น?
์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ ๊ณจ์นซ๊ฑฐ๋ฆฌ '๊ธ๋ฆฌ์น(Glitch)', ์ ์ค์ํ ๊น? ๊ด๋ จ
์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๊ด๊ณ์์ด ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ ์์์ ์์ ํ๋ค ๋ณด๋ฉด ์์ํ์ง ๋ชปํ ๋ฌธ์ ๋ค์ ์์ฃผ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. ์ง๊ด์ ์ผ๋ก๋ ์ด์ํ ๊ฒ ์์ด ๋ณด์ด๋ ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋์์ ๋ ์ ๊น ์ด์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ฑฐ๋, ๋ถ๋ช ๋ฌธ์ ๊ฐ ์์๋๋ฐ ๋ค์ ํ์ธํ๋ ค๊ณ ํ๋ฉด ํ์ ๋ ์์ด ์ฌ๋ผ์ ธ ๋ฒ๋ฆฌ๋ ์ผ๋ค์ด ์์ต๋๋ค. ํนํ ์ด๋ฐ ๋ฌธ์ ๋ค์ ์ฌํ ์์ฒด๊ฐ ๋งค์ฐ ๊น๋ค๋ก์์ ๋ฒ๊ทธ๋ก ๋ณด๊ณ ํ๊ธฐ์กฐ์ฐจ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด์ด ์ข์ ๋ฌธ์ ๋ฅผ ๋ค์ ๊ด์ฐฐํ๋ค ํ๋๋ผ๋ ์ ํํ ์ด๋ค ์ํฉ์์ ๋ฐ์ํ๋์ง ๊ทธ ์กฐ๊ฑด์ ๋ช ํํ๊ฒ ์ ์ํ๋ ๊ฒ ์ญ์ ์ฌ์ด ์ผ์ด ์๋๋๋ค.

๋์ฑ์ด ์ต๊ทผ **์ ์ธํ ํ๋ก๊ทธ๋๋ฐ(Declarative Programming)**์ ์ธ๊ธฐ์ ํจ๊ป ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ง์ ์ ์ธ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์์์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ฌํ ์ผ์์ ์ค๋ฅ ํ์์ธ โ๊ธ๋ฆฌ์น(Glitch)โ ๋ฌธ์ ๋ ์ฌ์ ํ ์ฌ๋ผ์ง์ง ์๊ณ ์์ต๋๋ค. ์คํ๋ ค ๋น๋๊ธฐ ์ด๋ฒคํธ์ ๋ณ๋ ฌ, ๋ถ์ฐ ํ๊ฒฝ์ด ์ผ๋ฐํํ๋ฉด์ ๊ธ๋ฆฌ์น๋ ๋ ์์ฃผ ๋ฐ์ํ๋ฉฐ ๊ฐ๋ฐ์๋ค์ ๊ดด๋กญํ๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ก ๋ ์ฌ๋์ต๋๋ค.
์ด ๊ธ์์๋ ์ ๊ฐ ๊ฒฝํํ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์ ๊ฐ์ฅ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต๊ณ ๊ณจ์น ์ํ ๋ ๋ฌธ์ , ๋ฐ๋ก **โ๊ธ๋ฆฌ์น(Glitch)โ**์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ ํฉ๋๋ค. ๊ธ๋ฆฌ์น๊ฐ ์ ํํ ๋ฌด์์ด๋ฉฐ ์ ๋ฐ์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ์์คํ ์์ ๊ธ๋ฆฌ์น๊ฐ ์ผ๋ง๋ ์น๋ช ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋์ง ํ๋์ฉ ์ง์ด๋ณด๊ฒ ์ต๋๋ค. ๋ ๋์๊ฐ ์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ต์ํํ๊ธฐ ์ํ ํ์ค์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ๊น์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ธ๋ฆฌ์น๋ ๋ฌด์์ธ๊ฐ?
์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐยท์ด์ํ๋ค ๋ณด๋ฉด ์์คํ ์์ ๊ฐํน ์๊ฐ์ ์ผ๋ก ์๋ชป๋ ์ํ๊ฐ ๊ด์ธก๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ๋ฐ์ํ๋ ์๊ฐ์ ์ธ ์ค๋ฅ ์ํ๋ฅผ ํํ โ๊ธ๋ฆฌ์นโ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ํคํผ๋์์์๋ ๊ธ๋ฆฌ์น๋ฅผ โ์งง์ ์๊ฐ ๋์ ๋ฐ์ํ๊ณ ์ ์ ๋ก ์ฌ๋ผ์ง๋ ๊ธฐ์ ์ ๊ฒฐํจโ์ผ๋ก ์ ์ํฉ๋๋ค. ์ค์ ๋ก ๊ธ๋ฆฌ์น๋ ๋ณดํต ์์คํ ์ด ์ต์ข ์ํ๋ก ์๋ ดํ๊ธฐ ์ ์ ์์ฃผ ์งง์ ์๊ฐ์๋ง ๋ํ๋๋ฉฐ, ๊ณง๋ฐ๋ก ๋ณต์๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ๊ฐ๊ณผ๋๊ธฐ ์ญ์์ ๋๋ค. ์ฌ์ง์ด ์ฌ์ฉ์๊ฐ ํ๋ฉด(UI)์์ ์ ์ ์๋ชป๋ ์ ๋ณด๋ฅผ ๋ณด์๋๋ผ๋, ์๋ก๊ณ ์นจ์ด๋ ์ฌ์๋ ๋ช ๋ฒ์ผ๋ก ์ฝ๊ฒ ์ ์ ๋๋ค๋ฉด ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด์ฃ .
๋ฌผ๋ก ๋น๋์ค ๊ฒ์์์๋ ๋ณด๋ ๊ธ๋ฆฌ์น๋ฅผ ๊ฐ์๊ธฐ ์? ๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ค๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋ก ํ๊ณ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๊ฐ ์ฃผ๋ชฉ๋ฐ์ผ๋ฉด์ ๊ธ๋ฆฌ์น๋ ์๊ฐ๋ณด๋ค ํํ ๊ด์ธกํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋์๊ณ , ์ํฉ์ ๋ฐ๋ผ์๋ ๊ธ๋ฆฌ์น๊ฐ ์ํํธ์จ์ด๋ฅผ ๋ง๊ฐ๋จ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ค ์ํฉ์์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ ์ ์๋์ง๋ ์ด์ด์ง๋ ๊ธ์์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๊ธ๋ฆฌ์น๋ ์ ๋์น๊ธฐ ์ฌ์ด๊ฐ?
๊ธ๋ฆฌ๋ ๋ณดํต ์ด๋ฒคํธ๊ฐ ์ต์ข ์์๋ก ๋ฐ์๋๊ธฐ ์ ์ ์๊ฐ์ ์ผ๋ก ๋ํ๋๋ ์ํ ๋ถ์ผ์น ํ์์ ๋๋ค. ํนํ ๋ถ์ฐ ์์คํ , ๋ณ๋ ฌ ์ฒ๋ฆฌ, ๋คํธ์ํฌ ์ง์ฐ ๋ฑ์ผ๋ก ์ธํด ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์๊ฐ ๋ค์ํค๊ฑฐ๋ ์ค๊ฐ ์ํ๋ค์ด ๊ฒน์ณ ๋ฐ์ํ๋ฉด์ ์๊ฒจ๋์ฃ . ๊ธ๋ฆฌ์น๋ฅผ ๋์น๊ธฐ ์ฌ์ด ์ด์ ๋ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
1) ์์ฐจ์ ์ฒ๋ฆฌ์ ๋ํ ์๋ชป๋ ๊ธฐ๋
๊ฐ๋ฐ์๋ ์ฌ์ฉ์ ๋ชจ๋ "์์ ์ด๋ฒคํธ๊ฐ ๋จผ์ ๋ฐ์๋๊ณ , ๊ทธ๋ค์ ์ด๋ฒคํธ๊ฐ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค"๋ ์ ํ์ ํ๋ฆ์ ์ฝ๊ฒ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ๋น๋๊ธฐ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ์ํคํ ์ฒ์์๋ ์ด๋ฒคํธ๊ฐ ๋์์ ๋๋ ์์ธกํ ์ ์๋ ์์๋ก ๋ค์ด์ฌ ์ ์์ต๋๋ค. ํ ์คํธ ๊ณผ์ ์์ ์ด๋ ๊ฒ ๋น์ง๊ด์ ์ผ๋ก ๋ค์ํจ ์ด๋ฒคํธ ์์๋ฅผ ์ฌํํ์ง ๋ชปํ๋ฉด, ๊ธ๋ฆฌ์น๋ ๋์ ์ ๋์ง ์์ต๋๋ค.
2) ๋ณ๋ ฌยท๋ถ์ฐ ํ๊ฒฝ์์์ ์์ฐจ ๋ณด์ฅ ์ด๋ ค์
๋ถ์ฐ ํ๊ฒฝ์ด๋ ๋ณ๋ ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์กฐ์์๋ ํน์ ์์ ์ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋จผ์ ์ฒ๋ฆฌ๋ ์ง ์ ํํ ํต์ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ํนํ ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์๋ฒ ๋ถํ, ๋ฉ์์ง ํ์ ํน์ฑ ๋ฑ์ผ๋ก ์ธํด ์ด๋ฒคํธ๊ฐ ๋์ฐฉํ๊ฑฐ๋ ์คํ๋๋ ์์ ์ด ์์ธก ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ธ๋ฆฌ์น์น๋ฅผ ์ ๋ฐํ๋ ํน์ ์ด๋ฒคํธ ์กฐํฉ์ด ์ฐ์ฐํ ๊ฒน์ณ์ผ ๋ฐ์ํ๋๋ฐ, ์ด๋ ๋ก์ปฌ์ด๋ ํ ์คํธ ํ๊ฒฝ์์ ๋ฐ๊ฒฌํ๊ธฐ ๋์ฑ ์ด๋ ต์ต๋๋ค.
3) ๊ธ๋ฆฌ์น๋ ์ผ์์ ์ด๋ฉฐ ๊ธ๋ฐฉ ์ฌ๋ผ์ง
๊ธ๋ฆฌ๋ ์์คํ ์ด ์ฌ๊ณ์ฐํ์ฌ ์ฌ๋ฐ๋ฅธ ์ต์ข ์ํ๋ก ๋์๊ฐ๊ธฐ ์ ์์ฃผ ์งง์ ์๊ฐ์๋ง ๊ด์ธก๋๋ ์ค๋ฅ์ ๋๋ค. ๋ฐ๋ฆฌ์ด ๋๋ ๋ช ์ด ๋ด๋ก ์๋ ๋ณต๊ตฌ๋์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๋ก๊ทธ๋ ๋ชจ๋ํฐ๋ง ํด์์ ๊ทธ ์์ ์ ์ ํํ ํฌ์ฐฉํ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค. ์ด์ ํ๊ฒฝ์์ ์์ฒญ๋ ์์ ์ด๋ฒคํธ๊ฐ ์ค๊ฐ๋ ์ํฉ์์ ์ด ์งง์ ์ค๋ฅ๋ฅผ ์ก์๋ด๋ ค๋ฉด, ๊ณ ๋ํ๋ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ๋ฐํ ๋ก๊ทธ ์์ง์ด ํ์์ ์ ๋๋ค.
4) ํํ์ ๋ฌธ์
์ต๊ทผ์๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋ค์ํ ํจํด๊ณผ ์ด๋ฅผ ์ง์ํ๋ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ๋ฑ์ฅํ๊ณ ์์ต๋๋ค. ๊ทธ์ค์์๋ **๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ(Reactive Programming)**์ ๋ํ์ ์ธ ์์ด๋ฉฐ, ๋น์ทํ ๋ชฉ์ ์ ๊ฐ์ง ๋๊ตฌ๋ค๋ ๊ณ์ํด์ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ํ์ง๋ง ๋์ ์์ค์ ์ถ์ํ ๋ค์๋ ์ธ์ ๋ ํจ์ ์ด ์๊ธฐ ๋ง๋ จ์ ๋๋ค.
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋จ๊ณผ ๊ด๋ จ๋ ๋๊ตฌ๋ค์๋ ์ด๋ฌํ ํจ์ ์ด ์กด์ฌํฉ๋๋ค. ํนํ ์ด ๋ถ์ผ์์๋ ๊ธ๋ฆฌ์น ํ๋ฆฌ(Glitch-Free)๋ผ๋ ๊ฐ๋ ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๋๊ตฌ๋ ๊ตฌํ์ ๋ณต์ก์ฑ์ด๋ ์ฑ๋ฅ์์ ์ด์ ๋ก ๊ธ๋ฆฌ์น ํ๋ฆฌ๋ฆฌ๋ฅผ ์๋ฒฝํ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
t = seconds +1
g = (t > seconds)
์ด ์ฝ๋๊ฐ ๋ฆฌ์กํฐ๋ธํ๊ฒ ๋์ํ๋ฉฐ ๊ธ๋ฆฌ์น ํ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ ๋, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๊ด์ ์์๋ ์ด ์ฝ๋์ ๋ณ์g๊ฐ ํญ์ True
์ผ ๊ฒ์ผ๋ก ์๊ฐํ๊ธฐ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ํจ์ ์ด ์กด์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ณดํต seconds
๊ฐ ๋จผ์ ์
๋ฐ์ดํธ๋๊ณ , ๊ทธ ํ์ t
์ g
๊ฐ ์ฐจ๋ก๋ก ์
๋ฐ์ดํธ๋๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ฆฌ์กํฐ๋ธ ์์คํ
์์๋ seconds
๊ฐ ์
๋ฐ์ดํธ๋๋ ์ด๋ฒคํธ๊ฐ t
์ g
์ ๊ฐ๊ฐ ์ ํ๋ฉ๋๋ค. ์ฆ, ๋ ๊ฐ์ง ์ ํ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒ์
๋๋ค.
์ด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ง์ฝ g
๊ฐ seconds
์ ์
๋ฐ์ดํธ๋ฅผ t
์ ์
๋ฐ์ดํธ๋ณด๋ค ๋จผ์ ์ ๋ฌ๋ฐ๊ฒ ๋๋ค๋ฉด, ์ผ์์ ์ผ๋ก g
์ ๊ฐ์ด False
๊ฐ ๋๋ ๊ธ๋ฆฌ์น ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ฆ, ๋ณ์ ์
๋ฐ์ดํธ์ ์ ํ ์์์ ๋ฐ๋ผ ์ ๊น ๋์ ์๋ชป๋ ์ํ๊ฐ ๊ด์ฐฐ ์ ์๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๊ธ๋ฆฌ์น ํ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๋ ๋ฆฌ์กํฐ๋ธ ๋๊ตฌ์์ ํํ ๋ฐ์ํ ์ ์๋ ํํ์ ๋ฌธ์ ์ ๋๋ค.

๊ธ๋ฆฌ์น, ์ ๋ง ์ค์ํ ๋ฌธ์ ์ธ๊ฐ?
๊ธ๋ฆฌ์น๋ฅผ ๋จ์ง UI๊ฐ ์ ๊น ์๋ชป ํ์๋๋ ์ ๋์ ๋ฌธ์ ๋ก ์๊ฐํ๋ฉด ์ค์ฐ์ ๋๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์๋ ๋ค์ํ ์ด๋ฒคํธ์ ์ ํ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฉฐ, ๋ชจ๋ ํต์ ์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฝ์ฐ, ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๊ณผ์ ์์ ์๋์น ์์ **์ปค๋ฐ(commit)**์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์ผ์ด๋ ์ ์์๊น์?
์์ ์ดํด๋ณธ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์์ ์์ ๋ณ์ g
๊ฐ ์ผ์์ ์ผ๋ก False
๊ฐ ๋๋๋ผ๋ ๊ณง t
๋ก ์ธํด ๋ค์ true
๋ก ๋ณต๊ตฌ๋๊ธฐ์ ํฐ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ค์ ํญ์ ์ฐ๋ฆฌ์ ์์๋ณด๋ค ๋ณต์กํ๊ณ , ์์ธกํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๋ฅผ ๋๋ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ณ์ข์์ ์ถ๊ธ์ ํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. account
๋ผ๋ ๋ณ์์ ์๊ณ ๊ฐ ๋ด๊ฒจ ์๊ณ , ์ถ๊ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ณ์๋ฅผ isWithdrawable
, ์ถ๊ธ ์์ฒญ๋ ๊ธ์ก์ requestedWithdrawalAmount
๋ผ๊ณ ์ ์ํ๊ฒ ์ต๋๋ค.
isWithdrawable = account >= requestedWithdrawalAmount
ifisWithdrawable {
account -= requestedWithdrawalAmount
}
์ ์ฝ๋๋ก 1,000์์ ๋ ๋ฒ ์ถ๊ธํ๋ ์ํฉ์ ๋จ๊ณ์ ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.

์ ํ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์
จ๋์? 3๋ฒ ํ์์ ์ดํด๋ณด๋ฉด, ์๊ณ ๊ฐ ์ด๋ฏธ 0์์ด ๋์์์๋ ๋ถ๊ตฌํ๊ณ ์ ๊น ๋์ isWithdrawable
์ด True
๋ก ์ ์ง๋๋ ์ํ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ์๊ฐ ์ถ๊ฐ ์ถ๊ธ ์์ฒญ์ด ์ฒ๋ฆฌ๋๋ฉด, ์๋์ ๊ฐ์ด ๋ง์ด๋์ค ์๊ณ ๊ฐ ๋๋ ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.

๊ทผ๋ณธ์ ์ธ ์์ธ์ account
, requestedWithdrawalAmount
, isWithdrawable
๊ฐ์ด ๊ฐ๊ฐ ๋ณ๋์ ์ด๋ฒคํธ๋ก ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ค์ ํ๋์ ์์์ ์ฐ์ฐ์ผ๋ก ๋ฌถ์ฌ ๋์์ ๋ณ๊ฒฝ๋์์ด์ผ ํ์ต๋๋ค.
๊ธ๋ฆฌ์น ๋ฌธ์ ์ ๋์ ๋ฐฉ๋ฒ
์ฌ๊ธฐ๊น์ง ๋ด์ฉ์ ์ดํด๋ณด๊ณ ๋๋ฉด "์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ๊ธ๋ฆฌ์น๋ฅผ ์๊ธฐํ๋ค๊ฐ ์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์๊ธฐ๊ฐ ๋์ค์ง?" ํน์ "๋จ์ํ ๋์์ฑ ๋ฌธ์ ์๋?"๋ผ๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค. ๋จผ์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ์์๋ฅผ ์ฌ์ฉํ ์ด์ ๋, ์ค์ ์๋ฒ ํ๊ฒฝ์์๋ ํด๋ผ์ด์ธํธ-์๋ฒ, ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํต์ ๊น์ง ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค๊ณ๊ฐ ์ ์ ๋ณดํธํ๋๊ณ ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์์ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ํ, ๊ธ๋ฆฌ์น๋ ๋จ์ํ ๋์์ฑ ๋ฌธ์ ๋ผ๊ณ ๋ณด๊ณ ๋๊ธฐ๊ธฐ์๋ ๋ณด๋ค ๋ฏธ๋ฌํ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋์์ฑ ๋ฌธ์ ๋ ์ฃผ๋ก ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋์์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ (์: race condition, deadlock)๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๋ฐ๋ฉด ๊ธ๋ฆฌ์น๋ ์ด๋ฒคํธ์ ์์, ํ์ด๋ฐ, ์ผ์์ ์ธ ์ํ ๋ถ์ผ์น์ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ก์ง ์ค๊ณ์ ๊ฒฐํจ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ค์์ ๊ธ๋ฆฌ์น๋ฅผ ๋ฐฉ์งํ๊ณ ๋ณด๋ค ์์ ์ ์ธ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํต์ฌ ์ ๊ทผ๋ฒ๊ณผ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
1) ์์์ ์ฐ์ฐ(Atomic Operations)๊ณผ ํธ๋์ญ์
๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๊ด๋ จ๋ ์ํ ๋ณํ๋ฅผ ์์์ ์ฐ์ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ์์ ์ถ๊ธ ์์์์ account
, requestedWithdrawalAmount
, isWithdrawable
์ธ ๋ณ์์ ๋ณ๊ฒฝ์ ๋จ์ผ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ด ์ฒ๋ฆฌํ๋ค๋ฉด ๊ธ๋ฆฌ์น์น๋ฅผ ๋ฐฉ์งํ ์ ์์์ ๊ฒ์
๋๋ค.
๋ฌผ๋ก ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ ์ฒ(Microservices Architecture) ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋น์ค๊ฐ ์๋ก ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์ด๋ ต์ต๋๋ค. ํด๋ผ์ด์ธํธ ํ๊ฒฝ ์ญ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค๊ณ๋ฅผ ์ฑํํ๋ฏ๋ก ์์์ ์ฒ๋ฆฌ๊ฐ ์ฝ์ง ์์ต๋๋ค. ๋ค๋ง ์ต๊ทผ์๋ ํด๋ผ์ด์ธํธ ์ธก์์๋ ํธ๋์ญ์ ์ ์ง์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฑ์ฅํด, ๋ฌธ์ ํด๊ฒฐ์ด ๋น๊ต์ ์ฌ์์ง๊ณ ์์ต๋๋ค. ํ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค๊ณ๋ฅผ ์ฑํํ ์ด์, ํธ๋์ญ์ ์์ด๋ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌ๋๊ธฐ๋ฅผ ๊ธฐ๋ํ๊ฒ ๋ฉ๋๋ค.
2) ์ด๋ฒคํธ ์์ ๋ณด์ฅ ๋ฐ ์ฌ์ ๋ ฌ
์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์๋ ์ด๋ฒคํธ์ ์์๋ฅผ ์๊ฒฉํ ๊ด๋ฆฌํด์ผ ๊ธ๋ฆฌ์น ๋ฐ์์ ์ต์ํํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์์ค์์ ์์ ๋ณด์ฅ: Kafka ํํฐ์ ์ด๋ RabbitMQ์ FIFO ํ ๋ฑ์ ํ์ฉํ์ฌ ์ด๋ฒคํธ ์์๋ฅผ ์ ์งํฉ๋๋ค.
- ์ํ์ค ๋ฒํธ ๋๋ ํ์์คํฌํ ์ฌ์ฉ: ์ด๋ฒคํธ๋ง๋ค ๊ณ ์ ๋ฒํธ๋ ํ์์คํฌํ๋ฅผ ํฌํจํ์ฌ ์์ ์ธก์์ ์์๋ฅผ ๋ณต์ํ ์ ์๋๋ก ํฉ๋๋ค.
3) ๋ฉฑ๋ฑ์ฑ(Idempotency)
์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์์๋ ์ค๋ณต ์ด๋ฒคํธ๊ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฉฑ๋ฑ์ฑ์ ํ๋ณดํ์ฌ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
- ๊ณ ์ ID ๋ถ์ฌ: ๊ฐ ์ด๋ฒคํธ์ ๊ณ ์ ID๋ฅผ ๋ถ์ฌํ์ฌ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ๋ง์ต๋๋ค.
- ๋ฉฑ๋ฑ์ฑ ํค ํ์ฉ: ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ์ ๋ฉฑ๋ฑ์ฑ ํค๋ฅผ ๋ณด๋ด ์๋ฒ๊ฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ณต ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
- ์ํ ๊ธฐ๋ฐ ๋ฉฑ๋ฑ์ฑ: ์์คํ ์ํ๋ฅผ ์ ๊ฒํ์ฌ ์ค๋ณต ์์ฒญ์ ์๋ณํฉ๋๋ค.
4) ์ต์ข ์ผ๊ด์ฑ(Eventual Consistency)๊ณผ ๋ณด์ ํธ๋์ญ์ (Saga)
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํญ์ ์๋ฒฝํ ์ผ์น์ํค๋ ๊ฒ์ ํ์ค์ ์ผ๋ก ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ต์ข ์ผ๊ด์ฑ์ ์ฑํํ๋ ๊ฒ์ด ์ข์ ๋์์ด ๋ฉ๋๋ค.
- ๋ณด์ ํธ๋์ญ์ (Saga): ๋ณต์กํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ก์ปฌ ํธ๋์ญ์ ์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ๊ณ , ์คํจ ๋ฐ์ ์ ์ด์ ์์ ์ ๋๋๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ๋ค๋ง ๋ชจ๋ ์ผ์ด์ค์ ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
5) ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ์ ๊ธ๋ฆฌ์น ํ๋ฆฌ ๊ธฐ๋ฅ ํ์ฉ
๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ์ ๊ธ๋ฆฌ์น ํ๋ฆฌ ๊ธฐ๋ฅ, ๋๊ธฐํ๋ ์ ๋ฐ์ดํธ, ์์ ์ ๋ ฌ(Topological Sorting) ๋ฑ์ ํ์ฉํ์ฌ ๊ธ๋ฆฌ์น๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๋ ๋๊ตฌ์ ํน์ฑ์ ์ถฉ๋ถํ ์ดํดํ๊ณ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
์ด๋ฒคํธ ์ธ์์์ ์ด์๋จ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ์ ์ธ๊ณ๋ ๋ง์น ์ค์ผ์คํธ๋ผ์ ์ฐ์ฃผ์ ๊ฐ์ต๋๋ค. ์ด์์ ์ผ๋ก๋ ๋ชจ๋ ์ ๊ธฐ๊ฐ ์๋ฒฝํ๊ฒ ์กฐํ๋ก์ด ํ์์ ๋ง๋ค์ด๋ด๋ ์๋ฆ๋ค์ด ์ธ๊ณ์ ๋๋ค. ํ์ง๋ง ํ์ค์์๋ ์งํ์์ ์ฌ์ํ ์ค์๋ ์ฐ์ฃผ์์ ์์ ํ์ด๋ฐ ์ฐจ์ด ํ๋๋ง์ผ๋ก๋ ๊ณก ์ ์ฒด๊ฐ ์๊ฑฑ๊ฑฐ๋ฆฌ๋ฉฐ ๋ถํํ์์ผ๋ก ๋ฌด๋์ ธ ๋ด๋ฆด ์ ์๋, ๋งค์ฐ ์ฌ์ธํ๊ณ ๊น๋ค๋ก์ด ์์ญ์ ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ ์ต์ํ๊ณ ์์ ์ ์ธ ๋๊ธฐ์ ์ ๊ทผ๋ฒ๋ณด๋ค ํจ์ฌ ๋ณต์กํ ์ํฉ์ ์ผ๊ธฐํฉ๋๋ค. ๊ทธ๋์ ๋ ์ธ๋ฐํ ์ค๊ณ์ ์ง์์ ์ธ ์ฃผ์๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ฉ ์ ์์ด ์ด๋ฒคํธ ์ธ๊ณ์ ๋ฐ์ด๋ค์ด์ผ ํ๋ค๋ฉด, ์ฝ๋ ํ ์ค์ ์์ฑํ๊ธฐ ์ ์ ๋ฐ๋์ ์ด๋ค ์ด๋ฒคํธ๋ค์ด ์กด์ฌํ๋์ง ํ์ ํด์ผ ํฉ๋๋ค. ๋ํ ๊ทธ๊ฒ๋ค์ด ์ด๋ป๊ฒ ์ํธ์์ฉํ๋์ง ์ถฉ๋ถํ ๊ณ ๋ฏผํ๋ฉฐ ์ ๋ณด๋ฅผ ์์ฑํ๋ฏ์ด ์ค๊ณํด์ผ ํฉ๋๋ค.
์๋ฒ ๊ฐ๋ฐ์๋ผ๋ฉด DDD(Domain-Driven Design) ๊ตฌํ ํจํด๊ณผ ๊ฐ์ ์ค๊ณ ํจํด์์ ํํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ๊ธ๋ฆฌ์น ํ๋ฆฌ ๊ตฌํ๋ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฒ์ ๋ฏธ๋ฆฌ ์์งํด ๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌด๋ ์์์์ ์๋ฒฝํ ์ฐ์ฃผ๊ฐ ์น๋ฐํ ์ฐ์ต๊ณผ ๊ณํ ์์ด๋ ๋ถ๊ฐ๋ฅํ๋ฏ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์์๋ ์ค๋น ์์ด ๋ฐ์ด๋ ๋ค๋ฉด ์์๊ฐ์ '๊ธ๋ฆฌ์น'๋ผ๋ ๋ถํํ์์ ๋ฌด๋์ง ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ, ์ด๋ฒคํธ์ ์ธ๊ณ์์ ์ด์๋จ๊ธฐ ์ํด์๋ ์ค์ผ์คํธ๋ผ ์งํ์์ฒ๋ผ ๋ชจ๋ ์ด๋ฒคํธ์ ํ๋ฆ์ ์ฃผ๋๋ฉด๋ฐํ๊ฒ ํ์ ํ๊ณ ํต์ ํ ์ ์์ด์ผ ํฉ๋๋ค. ํญ์ ์์ ๋ฐ์ ์ด๋ฒคํธ๊ฐ ์ฐพ์์ฌ ๊ฒ์ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ด๋ฒคํธ์ ๊ด๊ณ๋ฅผ ๋ช ํํ๊ฒ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๊ทธ๋ฆฌ๋ฉฐ ์ถฉ๋ถํ ๋๋นํ์๊ธฐ ๋ฐ๋๋๋ค.