Design E-Wallet
์๊ตฌ์ฌํญ
์ด์ฒด ๊ธฐ๋ฅ ์ง์(๋ค๋ฅธ ๊ธฐ๋ฅ์ ์๋ค๊ณ ๊ฐ์ )
์ด๋น ํธ๋์ญ์ ์(TPS): 1,000,000
์ฌํ์ฑ์ ๊ฐ์ถ ์์คํ
๊ฐ์ฉ์ฑ 99.99%
1,000,000 ํธ๋์ญ์ ์ ์ง์ํ๊ธฐ ์ํด, ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ ์ ์๋ค.
ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ธ๋์ ์ฒ๋ฆฌ๋: 1,000 TPS์ผ๋ก ๊ฐ์
1,000,000 * 2(์ ๊ธ + ์ถ๊ธ) / 1,000 = 2,000 ๋ ธ๋
API ๋จ์ ๊ธฐ๋ฅ ์ ์
POST /wallet/transfer
POST /wallet/transfer
์ด์ฒด๋ฅผ ์ํํ๋ API, ์์ฒญ ๋งค๊ฐ๋ณ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
from_account_id
: ์ถ๊ธ ๊ณ์ข IDto_account_id
: ์ ๊ธ ๊ณ์ข IDamount
: ์ด์ฒด ๊ธ์กcurrency
: ํตํ ๋จ์transaction_id
: ํธ๋์ญ์ ID(์ค๋ณต ๋ฐฉ์ง์ฉ)
์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋ฉ๊ณผ ๋ถ์ฐ ํธ๋์ญ์
์ด์ฒด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด, ์ธ๋ฉ๋ชจ๋ฆฌ ์ค๋ฉ์ ์ฌ์ฉํ์ฌ ๊ณ์ข ์ ๋ณด๋ฅผ ๋ถ์ฐ ์ ์ฅํ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๋ฅผ ์ค์ด๊ณ , ๋น ๋ฅธ ์กฐํ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ ๋์ค์ ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ข ์ ๋ณด๋ฅผ ์ ์ฅ(
<์ฌ์ฉ์, ์์ก>
ํํ)1,000,000 TPS๋ฅผ ์ง์ํ๊ธฐ ์ํด, ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ท ๋ฑํ๊ฒ ์ค๋ฉ
์ด ๋ ์ฌ์ฉ์์ ๊ณ์ข ์ ๋ณด๊ฐ ๋ค๋ฅธ ์ค๋์ ์ ์ฅ๋ ์ ์์ผ๋ฏ๋ก, ์ด์ฒด ์ ๋ ์ ๋ฐ์ดํธ๊ฐ ํ๋์ ์์์ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
2PC(2-Phase Commit)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด์ ์์กดํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ ๋จ๊ณ๋ก ์ปค๋ฐ์ ์งํํ๋ค.
๋ฝ ํ๋ ๋จ๊ณ: ๋ชจ๋ ๊ด๋ จ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ธ๋์ ํธ๋์ญ์ ์ ์ค๋น ์ํ๋ก ์ค์ ํ๊ณ , ๋ฝ์ ํ๋
์ค๋น ๋จ๊ณ: ๋ฝ์ ํ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ธ๋๋ค์ด ์ปค๋ฐ์ด ๊ฐ๋ฅํ์ง ํ์ธ
์ปค๋ฐ ๋จ๊ณ: ๋ชจ๋ ๋ ธ๋๊ฐ ์ค๋น ์ํ๋ผ๋ฉด ์ปค๋ฐ์ ์ํ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋กค๋ฐฑ
์ด ๋ฐฉ๋ฒ์ ์์ ํ๊ฒ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ด ์กด์ฌํ๋ค.
์ฑ๋ฅ ์ ํ: ๋ฝ์ ํ๋ํ๊ณ ์ปค๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ฒด์์ ๋ฝ ์ ์ ์๊ฐ์ด ๊ธธ์ด์ ธ ์ฑ๋ฅ์ด ์ ํ๋จ
SPoF: ๋ฝ์ ํ๋ํ๊ณ ์ปค๋ฐ์ ์ฒ๋ฆฌํด์ฃผ๋ ์กฐ์ ์์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด, ๋ฝ์ด ํ๋ํ ์ํ๋ก ๊ณ์ ์ ์ง๋จ
TCC(try-confirm-cancel)
TCC๋ ์๋ -> ํ์ / ์ทจ์๋ก ๊ตฌ์ฑ๋ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
์กฐ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ ํ์ํ ์์ ์์ฝ ์์ฒญ(=Try)
์กฐ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ํ์ ์ ๋ฐ์
๋ชจ๋ ์ฑ๊ณต ํ์ : ํ์ ์์ฒญ(=Confirm)
ํ๋ ์ด์์ ์คํจ ํ์ : ์ทจ์ ์์ฒญ(=Cancel)
์ด ์ฒ๋ฆฌ ๋ฐฉ์์ 2PC๊ฐ ๋ ๋จ๊ณ๋ฅผ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์ ๋นํด, ๊ฐ ๋จ๊ณ๋ฅผ ๋ณ๋ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค.
๋คํธ์ํฌ ์ง์ฐ์ด๋ ์ค๊ฐ ๋จ๊ณ ์คํจ ์ ๋ณต๊ตฌ ๋ก์ง์ด ๋ณต์กํด์ง
๋น์ฆ๋์ค ๋ก์ง์์ ๊ฐ ๋จ๊ณ(Try, Confirm, Cancel)์ ๋ํ ๋ณ๋ ๊ตฌํ์ด ํ์ํด ๊ฐ๋ฐ ๋ถ๋ด์ด ์ฆ๊ฐ
Saga ํจํด
Saga ํจํด์ ๋ถ์ฐ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจํด์ผ๋ก, MSA ํ๊ฒฝ์์๋ ํ์ค์ผ๋ก ์๋ฆฌ์ก๊ณ ์๋ค.
๋ชจ๋ ์ฐ์ฐ์ ์์๋๋ก ์ ๋ ฌ๋์ด, ๊ฐ ์ฐ์ฐ์ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ๋ฆฝ ํธ๋์ญ์ ์ผ๋ก ์คํ
์ฐ์ฐ์ ์์๋๋ก ์คํ๋๊ณ , ๊ฐ ์ฐ์ฐ์ด ์ฑ๊ณตํ๋ฉด ๋ค์ ์ฐ์ฐ์ด ์คํ
๋ง์ฝ ์ฐ์ฐ์ด ์คํจํ๋ฉด, ์ด์ ์ฐ์ฐ๋ค์ ์ทจ์ํ๊ธฐ ์ํด ์ญ์์ผ๋ก ๋ณด์ ํธ๋์ญ์ ์ ํตํด ๋กค๋ฐฑ
์ฌ๊ธฐ์ ์ฐ์ฐ ์ํ ์กฐ์จ์ ์ํ ๋ฐฉ๋ฒ์ ๋ค์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
์ค๋ช
๊ฐ ์๋น์ค๊ฐ ์์ ์ ์ํ ๋ณ๊ฒฝ์ ์ด๋ฒคํธ๋ก ๋ฐํํ๊ณ , ๋ค๋ฅธ ์๋น์ค๊ฐ ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ์ฌ ์ฒ๋ฆฌ
์ค์ ์กฐ์ ์๊ฐ ๋ชจ๋ ์ฐ์ฐ์ ์กฐ์จํ๊ณ , ๊ฐ ์๋น์ค์ ๋ช ๋ น์ ์ ๋ฌ
์ฅ์
์๋น์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์ ์ฐ์ฑ ์ฆ๊ฐ, ์๋น์ค ํ์ฅ ์ฉ์ด
์ค์ ์ง์ค์ ๊ด๋ฆฌ๋ก ๋ณต์กํ ๋ก์ง ์ฒ๋ฆฌ ์ฉ์ด
๋จ์
์๋น์ค ๊ฐ ์์กด์ฑ์ด ์๊ธธ ์ ์์ด ๋ณต์ก์ฑ ์ฆ๊ฐ
์ค์ ์กฐ์ ์๊ฐ SPoF๊ฐ ๋ ์ ์์
์ด๋ฒคํธ ์์ฑ
์ ์ ์ง๊ฐ ์๋น์ค์ ๊ฐ์ด ๊ธ์ต ๊ฑฐ๋๋ฅผ ๋ค๋ฃจ๋ ์์คํ ์์๋ ์ฌํ์ฑ(reproducibility)๊ณผ ๊ฐ์ฌ(audit) ๊ฐ๋ฅ์ฑ์ด ํ์์ ์ด๋ค.
ํน์ ์์ ์ ๊ณ์ ์์ก
๊ณผ๊ฑฐ ๋ฐ ํ์ฌ ๊ณ์ ์์ก์ด ์ ํ์ฑ
์ด๋ฌํ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ ค๋ฉด, ๋จ์ํ ํ์ฌ ์ํ๋ง ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก๋ ๋ถ์กฑํ๋ฉฐ, ๋ชจ๋ ์ํ ๋ณํ๋ฅผ ๊ธฐ๋กํ๊ณ ํ์ ์ ์ฌ๊ตฌ์ฑํ ์ ์๋ ์ด๋ฒคํธ ์์ฑ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ฒคํธ ์์ฑ ๊ฐ๋
์ด๋ฒคํธ ์์ฑ์ ์์คํ ์ ์ํ๋ฅผ ์ด๋ฒคํธ๋ก ๊ธฐ๋กํ๊ณ , ์ด ์ด๋ฒคํธ๋ค์ ์ฌ์ํ์ฌ ํ์ฌ ์ํ๋ฅผ ๋์ถํ๋ ๋ฐฉ์์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ง๋ค.
Command(๋ช ๋ น)
์ธ๋ถ์์ ์ ๋ฌ๋ ์๋๊ฐ ๋ช ํํ ์์ฒญ
์์๊ฐ ์ค์ํ๋ฏ๋ก FIFO์ ์ ์ฅ
Event(์ด๋ฒคํธ)
๋ช ๋ น์ ์ํด ๋ฐ์ํ ์ํ ๋ณํ์ ๊ธฐ๋ก
ํ๋์ ๋ช ๋ น์ผ๋ก ์ฌ๋ฌ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ์์
์์๊ฐ ์ค์ํ๋ฏ๋ก FIFO์ ์ ์ฅ
State(์ํ)
์ด๋ฒคํธ๋ฅผ ์ฌ์ํ์ฌ ๋์ถํ ํ์ฌ ์ํ
ํน์ ์์ ์ผ๋ก์ ๋ณต์์ด ๊ฐ๋ฅ
State Machine(์ํ ๊ธฐ๊ณ)
์ด๋ฒคํธ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋
๋ช ๋ น์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ์ด๋ฒคํธ ์์ฑํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝ
๋ช
๋ น -----> ์ํ ๊ธฐ๊ณ ------> ์ด๋ฒคํธ -----> ์ํ ๊ธฐ๊ณ
| |
| |
์ฝ๊ธฐ --------> ์ํ < ------ ์ ์ฉ
์ง๊ฐ ์๋น์ค ์์
์ง๊ฐ ์๋น์ค์ ๊ฒฝ์ฐ ๋ช ๋ น์ ์ด์ฒด ์์ฒญ์ด ๋ ๊ฒ์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ด ๋์ํ ์ ์๋ค.
์ฌ์ฉ์๊ฐ ์ด์ฒด ์์ฒญ
์ด์ฒด ์์ฒญ(๋ช ๋ น)์ FIFO ํ์ ๊ธฐ๋ก๋๊ณ , ์์๋๋ก ์ง๊ฐ ์๋น์ค(์ํ ๊ธฐ๊ณ)์ ์ ๋ฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์์ก(์ํ)๋ฅผ ์กฐํ
์ง๊ฐ ์๋น์ค(์ํ ๊ธฐ๊ณ)๋ ์์ก์ด ์ถฉ๋ถํ์ง ์ ํจ์ฑ ๊ฒ์ฌ
์์ก์ด ์ถฉ๋ถํ๋ค๋ฉด, ์ด์ฒด(์ด๋ฒคํธ) ์์ฑํ์ฌ FIFO ํ์ ๊ธฐ๋ก
์ด๋ฒคํธ๋ ์ํ ๊ธฐ๊ณ์ ์ ๋ฌ๋์ด, ์์ก์ ์ ๋ฐ์ดํธํ๊ณ ์๋ก์ด ์ํ๋ฅผ ์์ฑ
์ฌํ์ฑ
์ด๋ฒคํธ ์์ฑ์ด ๋ค๋ฅธ ์ํคํ ์ฒ์ ๋นํด ๊ฐ์ฅ ์ค์ํ ์ฅ์ ์ ์ฌํ์ฑ์ด๋ค.
์ผ๋ฐ์ ์ธ ์ํ ๋ณ๊ฒฝ์ ๊ฒฝ์ฐ ์ต์ข ์ํ๋ง ์ ์ฅ๋๋ฉฐ, ๊ณผ๊ฑฐ ์ํ๋ฅผ ๋ณต์ํ๊ธฐ ์ด๋ ค์
์ด๋ฒคํธ ์์ฑ์ ๋ชจ๋ ์ํ ๋ณํ๋ฅผ ๊ธฐ๋กํ๋ฏ๋ก, ํน์ ์์ ์ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์
+------------------------------ Commands -------------------------------+
| [ A -$1 -> C ] [ A -$1 -> B ] [ A -$1 -> D ] |
+-----------------------------------------------------------------------+
| | |
+------------------------------- Event Stream --------------------------+
| [A:-$1] [C:+$1] [A:-$1] [B:+$1] [A:-$1] [D:+$1] |
+-----------------------------------------------------------------------+
| | |
+--------------------+ +--------------------+ +--------------------+
| Snapshot t0 | | Snapshot t1 | | Snapshot t2 |
| A:5 B:4 C:3 D:2 | | A:4 B:4 C:4 D:2 | | A:3 B:5 C:4 D:2 |
+--------------------+ +--------------------+ +--------------------+
CQRS(๋ช
๋ น-์ฟผ๋ฆฌ ์ฑ
์ ๋ถ๋ฆฌ)
๋ช ๋ น(Command)๊ณผ ์ง์(Query)๋ฅผ ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ ๊ฒฝ๋ก์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ก ๋ถ๋ฆฌํ๋ ์ํคํ ์ฒ๋ก, ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ ๋ ์์ฃผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ค.
์ฐ๊ธฐ ๋ชจ๋ธ์ ๋๋ฉ์ธ ๊ท์น๊ณผ ํธ๋์ญ์ ์ผ๊ด์ฑ์ ๋ง๊ฒ ์ฒ๋ฆฌ
์ฝ๊ธฐ ๋ชจ๋ธ์ ์กฐํ ์ฑ๋ฅ๊ณผ ์ฟผ๋ฆฌ ์ต์ ํ์ ๋ง์ถฐ ๋ณ๋ ๊ตฌ์ฑ
์ด๋ฒคํธ ์์ฑ๊ณผ ๊ฒฐํฉํ๋ฉด ์ฐ๊ธฐ ์ธก์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๊ธฐ ๋ชจ๋ธ(ํ๋ก์ ์ )์ ๊ฐฑ์
์ด ๋ฐฉ์์ ๋จ์ DB ์ฌ๋ณธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์๋ค.
๋ชฉ์
์ฝ๊ธฐ ๋ถํ ๋ถ์ฐ
์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ธ ๋ถ๋ฆฌ
์คํค๋ง
์๋ณธ DB ์คํค๋ง ๋ณต์
์ฝ๊ธฐ ๋ชจ๋ธ ์ต์ ํ ๊ฐ๋ฅ
๋ฐ์ดํฐ ๋ฐ์ ์๊ฐ
์ค์๊ฐ ๋๋ ์ง์ฐ
์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฐ์
์์ธ ์ค๊ณ
๊ณ ์ ๋ขฐ์ฑ ์๋ฃจ์
์ด๋ฒคํธ ์์ฑ ์ํคํ ์ฒ์์ ๋ํํธ ๋ ธ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ SPOF ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
+------------------------------------------------------------+
| ํ๋ก์ ์ด๋ฒคํธ -> ์ํ ๊ธฐ๊ณ -> ์ํ ์ ์ฅ์ |
+------------------------------------------------------------+
|
๋ํํธ
|
+------------------------------------------------------------+
์์ฒญ ----> | ๋ฆฌ๋ ์ด๋ฒคํธ -> ์ํ ๊ธฐ๊ณ -> ์ํ ์ ์ฅ์ |
+------------------------------------------------------------+
|
๋ํํธ
|
+------------------------------------------------------------+
| ํ๋ก์ ์ด๋ฒคํธ -> ์ํ ๊ธฐ๊ณ -> ์ํ ์ ์ฅ์ |
+------------------------------------------------------------+
๋ํํธ ๊ตฌ์กฐ๋ ๋ถ์ฐ ์์คํ ์์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
๊ฐ ๋ ธ๋๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง
๋ฆฌ๋ / ํ๋ก์ ๊ตฌ์กฐ๋ก, ๋ฆฌ๋๊ฐ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํ๋ก์๋ ๋ฆฌ๋์ ๋ก๊ทธ๋ฅผ ๋ณต์
๊ณผ๋ฐ์ ๋ ธ๋๊ฐ ์๋ํ๋ ํ ์์คํ ์ ์์ ์ ์ผ๋ก ๋์ ๊ฐ๋ฅ
๋ฐ์ดํฐ ๋ฐ์ ์ง์ฐ ์ต์ํ
CQRS ์์คํ ์์๋ ์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์ด ๋ถ๋ฆฌ๋์ด ์์ด ์ ๋ฐ์ดํธ ์์ ์ ์ ํํ ์ ์ ์๊ธฐ ๋๋ฌธ์, ํด๋ง ๋ฐฉ์์ผ๋ก ์ํ๋ฅผ ํ์ธํ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค.
๋ฐ์์ด ์ง์ฐ๋ ์ ์์ผ๋ฉฐ, ์ธ์ ๋ฐ์๋ ์ง ์ ์ ์์
์ฃผ๊ธฐ๋ฅผ ์งง๊ฒ ์ค์ ํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์
์ด ๋ฌธ์ ๋ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ์ ํ ์ ์๋ค.
+---------------------- ์ด๋ฒคํธ ์์ ํ ์คํ ์ํ๋ฅผ ์ญ๋ฐฉํฅ ํ๋ฝ์์ ํธ์ ------------------------------+
์๋ต | |
<---- | +---------------------------------------------------+ |
์์ฒญ ----> ๋ฆฌ๋ฒ์ค ํ๋ก์ ---> | ์ด๋ฒคํธ -> ์ํ ๊ธฐ๊ณ -> ์ด๋ฒคํธ -> ์ํ ๊ธฐ๊ณ -> ์ํ ์ ์ฅ์ | +--> ์ํ ๊ธฐ๊ณ --> ์ํ ์ ์ฅ์
+---------------------------------------------------+ |
| |
+---------------------------- ------+
์์ฒญ์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก ์ ๋ฌ
๋ฆฌ๋ฒ์ค ํ๋ก์๋ ์ฐ๊ธฐ ๋ชจ๋ธ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ
์ฐ๊ธฐ ๋ชจ๋ธ์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ฝ๊ธฐ ์ ์ฉ ์ํ ๊ธฐ๊ณ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ
์ฝ๊ธฐ ์ ์ฉ ์ํ ๊ธฐ๊ณ๋ ์ํ๋ฅผ ๊ฐฑ์ ํ๊ณ , ๋ฆฌ๋ฒ์ค ํ๋ก์์ ์ํ๋ฅผ ํธ์
ํด๋ผ์ด์ธํธ๋ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก๋ถํฐ ์ํ๋ฅผ ๋ฐ์ ์๋ต
์ฐธ๊ณ ์๋ฃ
Last updated
Was this helpful?