
๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ ์ผ์ด ๋ง์ต๋๋ค. ํ์ง๋ง ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ณผ์ ์์ ๋์์ฑ ๋ฌธ์ ๊ฐ ์๋กญ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ์ ๊ฐ ์ค์ ๋ก ๊ฒช์๋ ๋ฐ๋๋ฝ ๋ฌธ์ ์ ๊ทธ ํด๊ฒฐ ๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ๋จ์ํ “์ด๋ ๊ฒ ํด๊ฒฐํ๋ค”๊ฐ ์๋๋ผ, ์ ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ค ์ ํ์ง๋ฅผ ๊ณ ๋ฏผํ๋์ง๊น์ง ํฌํจํด ์์ฑํ์ต๋๋ค.
1๏ธโฃ ๋ฐ๋๋ฝ์ด๋ ๋ฌด์์ธ๊ฐ?
๋ฐ๋๋ฝ(Deadlock)์ ๋จ์ํ “๋ฝ์ด ๊ฑธ๋ ค์ ๋ฉ์ถ ์ํ”๊ฐ ์๋๋๋ค.
๋ณด๋ค ์ ํํ๋ ๋ค์๊ณผ ๊ฐ์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ ๊ฐ ์ด์์ ์์ ์ด ์๋ก๊ฐ ๊ฐ์ง ์์์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์์ํ ์งํํ ์ ์๋ ์ํ
์ด๋ฅผ ์กฐ๊ธ ๋ ์ผ๋ฐ์ ์ธ ์ปดํจํฐ ๊ณตํ ๊ด์ ์์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ ์์ (์ค๋ ๋, ํ๋ก์ธ์ค, ํธ๋์ญ์ )์ ์์์ ์ ์ ํ ์ํ์์
- ๋ค๋ฅธ ์์ ์ด ์ ์ ํ ์์์ ์ถ๊ฐ๋ก ์์ฒญํ๊ณ
- ๊ทธ ์์ฒญ์ด ์๋ก ๊ผฌ์ด๋ฉด์
- ์๋ฌด๋ ์์์ ๋ด๋ ค๋์ง ์๋ ์ํ
์ฆ, “์๋ก ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์๋ฌด๋ ๋๋์ง ์๋ ์ํ”์ ๋๋ค.
์ด๊ฑด DB์๋ง ๊ตญํ๋ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ ์์ญ์์ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ
- OS ๋ฆฌ์์ค ๊ด๋ฆฌ
- ๋ถ์ฐ ์์คํ (๋ฝ ์๋น์ค)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์
ํนํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ Row Lock, Table Lock ๊ฐ์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค.
๋๋ถ๋ถ์ RDBMS (PostgreSQL ํฌํจ)๋ ๋ฐ๋๋ฝ์ ๊ฐ์งํ๋ฉด “๋ ์ค ํ๋์ ํธ๋์ญ์ ์ ๊ฐ์ ๋ก ๋กค๋ฐฑ”ํฉ๋๋ค. ์ผ์ ์๊ฐ (deadlock_timeout, ๊ธฐ๋ณธ 1์ด) ๋๊ธฐ ํ ํธ๋์ญ์ ๋ค์ ๊ฒ์ฌํฉ๋๋ค. PostgreSQL์ โ ๋ด๋ถ์ ์ผ๋ก ๋น์ฉ์ด ๋ ์ ์ ํธ๋์ญ์ , โก๋กค๋ฐฑ ๋น์ฉ์ด ๋ฎ์ ์ชฝ์ ํฌ์์๋ก ์ ํํด์ ์ฃฝ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
DB๋ ๋ฐ๋๋ฝ์ “ํด๊ฒฐ”ํ์ง ์๊ณ , ๋จ์ง ํ๋๋ฅผ ์ฃฝ์ฌ์ ์ํ๋๊ธฐ ์ํฉ์ ๋๋ผ ๋ฟ์ ๋๋ค.
2๏ธโฃ ๋ฐ๋๋ฝ ๋ฐ์ ์กฐ๊ฑด
๋ฐ๋๋ฝ์ ์๋ฌด ๋๋ ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ, ๋ค์ 4๊ฐ์ง ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์กฑ๋ ๋ ๋ฐ์ํฉ๋๋ค.
1. ์ํธ ๋ฐฐ์ (Mutual Exclusion)
์์์ ๋์์ ํ๋์ ์์
๋ง ์ฌ์ฉํ ์ ์์
→ DB์์๋ row lock
2. ์ ์ ๋๊ธฐ (Hold and Wait)
์์์ ๊ฐ์ง ์ํ์์ ๋ค๋ฅธ ์์์ ๊ธฐ๋ค๋ฆผ
3. ๋น์ ์ (No Preemption)
์์์ ๊ฐ์ ๋ก ๋บ์ ์ ์์
→ DB์์๋ lock์ ๊ฐ์ ๋ก ํ์ํ์ง ์์
4. ์ํ ๋๊ธฐ (Circular Wait)
์๋ก๊ฐ ์๋ก์ ์์์ ๊ธฐ๋ค๋ฆฌ๋ ๊ตฌ์กฐ
A → B๊ฐ ๊ฐ์ง ์์ ๊ธฐ๋ค๋ฆผ
B → A๊ฐ ๊ฐ์ง ์์ ๊ธฐ๋ค๋ฆผ
์ด 4๊ฐ์ง ์กฐ๊ฑด์ด ๋์์ ๋ง์กฑ๋๋ฉด ๋ฐ๋์ ๋ฐ๋๋ฝ์ด ๋ฐ์ํฉ๋๋ค.
3๏ธโฃ ์ค๋ฌด์์ ๋ฐ์ํ ๋ฐ๋๋ฝ
3-1. JSON VIEWER ๊ธฐ๋ฐ UPDATE์์ ๋ฐ๋๋ฝ
์ด๋ฒ ๋ฌธ์ ๋ ์ฑ๋ฅ ๊ฐ์ ๊ณผ์ ์ดํ ๋ฐ์ํ ๋ฌธ์ ์์ต๋๋ค. ๊ธฐ์กด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์์ต๋๋ค.
- ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์
- DB UPDATE๋ฅผ N๋ฒ ์ํ
O(N) ์ผ๋ก DB I/O ํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค
- JSON VIEWER ํํ๋ก ๋ณํ
- JOIN์ ํ์ฉํ์ฌ UPDATE๋ฅผ ํ ๋ฒ์ ์ํ
| sno | progress_status | success_count | fail_count |
| 1 | NEW | 0 | 1 |
| 2 | CONFIRM | 1 | 0 |
| 3 | CANCEL | 0 | 1 |
| 4 | RETRUN | 0 | 0 |
์์๋ฅผ ์ํด ์๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ํ ๋, ๋งค ํ ํฝ๋ง๋ค count ๋ฅผ ์ฆ๊ฐ ์์ผ์ฃผ๋ update ํด์ค์ผ ํ์ต๋๋ค. progress_status ๋ฅผ ๊ธฐ์ค์ผ๋ก update ํ count ๋ค์ ๋ฆฌ์คํธ์ ๋ด์, ์ด๋ฅผ JSON VIERER ๋ฅผ ๋ง๋ค์ด JOIN ์ฌ์ฉํด ํ๋ฒ์ UPDATE ํ๋ ๋ฐฉ์์ ๋๋ค.
O(N) → O(1) ๋ก ๊ฐ์ ์ด ๋์ง๋ง, ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ฌธ์ ์ ํต์ฌ์ ์ด๊ฒ์ ๋๋ค.
DB ์ตํฐ๋ง์ด์ ๋ UPDATE ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
DB ๋ด๋ถ ์คํ ์์ง์ row ์ ๊ทผ ์์๋ ๋ณ๊ฐ์
๋๋ค ์ฆ, ์ฐ๋ฆฌ๊ฐ JSON VIEWER๋ฅผ ํตํด ์ฌ๋ฌ row๋ฅผ ํ ๋ฒ์ UPDATEํ๋๋ผ๋
์ค์ ๋ก DB ๋ด๋ถ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์คํ๋ ์ ์์ต๋๋ค.
- ํธ๋์ญ์ A → row 1 → row 2 ์์๋ก ์ ๊ธ
- ํธ๋์ญ์ B → row 2 → row 1 ์์๋ก ์ ๊ธ
๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํธ๋์ญ์
A๊ฐ row 1 lock
2. ํธ๋์ญ์
B๊ฐ row 2 lock
3. A๊ฐ row 2๋ฅผ ๊ธฐ๋ค๋ฆผ
4. B๊ฐ row 1์ ๊ธฐ๋ค๋ฆผ
→ ์ํ ๋๊ธฐ ๋ฐ์ → ๋ฐ๋๋ฝ
ํต์ฌ์ “๋์ผํ ์ฟผ๋ฆฌ”๋ผ๋ ์คํ ์์๊ฐ ํธ๋์ญ์ ๋ง๋ค ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ ์ ๋๋ค.
3-2. ๋์ผ ์กฐ๊ฑด UPDATE์์๋ ๋ฐ์ํ ๋ฐ๋๋ฝ
๋ ๋ค๋ฅธ ์ผ์ด์ค๋ ์์์ต๋๋ค.
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
์๋ฅผ ๋ค์ด
- row 1, 2, 3 ๋ชจ๋ data_sid = 'abc'
- ์ด๋ฅผ ํ ๋ฒ์ success๋ก UPDATE
| sno | data_sid | progress_status | result |
| 1 | abc | NEW | NULL → success |
| 2 | abc | CONFIRM | NULL → success |
| 3 | abc | CANCEL | NULL → success |
UPDATE target_table
SET status = 'success'
WHERE data_sid = 'abc';
์ด ๊ฒฝ์ฐ๋ ๋์ผํ๊ฒ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ตํฐ๋ง์ด์ ๊ฐ row ์ ๊ทผ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์
1. ํธ๋์ญ์
A → row 1 lock
2. ํธ๋์ญ์
B → row 2 lock
3. A → row 2 ๊ธฐ๋ค๋ฆผ
4. B → row 1 ๊ธฐ๋ค๋ฆผ
→ ๋์ผํ๊ฒ ๋ฐ๋๋ฝ ๋ฐ์
4๏ธโฃ ํด๊ฒฐ ๋ฐฉ์ ๋ฐ ๊ณ ๋ฏผ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ์ต๋๋ค.
4-1. ๋ค์ N๋ฒ UPDATE (Rollback)
๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ์๋ ๋ฐฉ์์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ๋๋ค.
- ๋ฐ๋ณต๋ฌธ์ ํตํด
- UPDATE N๋ฒ ์ํ
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๋ช ํํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ํฌ ์๋น์ค๋ I/O Bound ์๋น์ค์๊ณ , DB round-trip time์ด ์ง์ฐ์๊ฐ์ ๊ฐ์ฅ ํฐ ์์ธ์ ๋๋ค. ๋ฐ๋ผ์ DB I/O ๋ฅผ ์ต์ํ ํ๋ ๊ฒ์ด ์๋น์ค ํ์ง์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ์ ์ํด ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ๋ง๋ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๋๋๋ฆฌ๋ ๊ฒ์ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ด ์๋๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ ์ ์ธํ์ต๋๋ค.
4-2. SELECT → VIEW → JOIN UPDATE
๋ค์์ผ๋ก ์๊ฐํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋จผ์ SELECT๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ
- ์ ๋ ฌ๋ VIEW๋ฅผ ๋ง๋ ๋ค
- ๊ทธ VIEW๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UPDATE ์ํ
์ด ์ ๊ทผ์ ํต์ฌ์ ์ด๊ฒ์ ๋๋ค.
“UPDATE ๋์์ ์์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํต์ ”
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ๋ถํ์ํ JOIN ์ฆ๊ฐ
- ์ฟผ๋ฆฌ ๋ณต์ก๋ ์ฆ๊ฐ
- ์คํ ๊ณํ์ด ๋ ๋น์ธ์ง ๊ฐ๋ฅ์ฑ
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ DB๊ฐ ORDER BY ๋ SELECT VIEWER ๋ฅผ ํตํด UPDATE ํ๋ค๊ณ ํด๋ ์์๋ฅผ 100% ๋ณด์ฅํ๋ค๊ณ ํ์ ํ๊ธฐ ์ด๋ ค๋ค๋ ์ ์ ๋๋ค. ๊ฒฐ๊ตญ ๋ฌธ์ ์ ์ด ํด๊ฒฐ ๋์ง ์์ต๋๋ค.
SELECT *** FOR UPDATE ๋ก ROW LOCK ์ ๊ฑธ๊ณ , ์ด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ์์๋๋ก UPDATE ํ์ฌ ํ ํธ๋์ญ์ ๋ด์ ์ง์ ํ๋ ๊ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ์์ด ๋ฉ๋๋ค.
ํ์ง๋ง ROW LOCK ์ ์ก๊ณ ๋๋ฌด ์ค๋ ์๋ ์ ๊ณผ, ์ฌ๋ด ORM ์์ ์ด๋ฅผ ์ ๋ฐ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์๋๋ค๋ ์ ์ด ์์ต๋๋ค.
๊ทธ๋์ ์ด ๋ฐฉ๋ฒ๋ ํ์คํ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ณด์ง ์์์ต๋๋ค.
4-3. UPDATE ์์๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ์ (์ต์ข ํด๊ฒฐ)
๊ฒฐ๊ตญ ๋ฌธ์ ์ ๋ณธ์ง์ ํ๋์์ต๋๋ค.
“UPDATE ์์๋ง ๋ณด์ฅ๋๋ฉด ๋ฐ๋๋ฝ์ ๋ฐ์ํ์ง ์๋๋ค”
๊ทธ๋์ ์ ๊ทผ์ ์์ ํ ๋ฐ๊ฟจ์ต๋๋ค. ์ฌ๋ด์์ ESQL์ด๋ผ๋ ORM์ ์ฌ์ฉํ๊ณ ์์๊ณ , ์ฌ๊ธฐ์๋ AFTER๋ผ๋ ๊ธฐ๋ฅ์ด ์์์ต๋๋ค. ํ SELECT , UPDATE ๋ฑ ๊ตฌ๋ฌธ ๋ค์ ๋ฐ๋ก ๋ค์ ๊ตฌ๋ฌธ์ ์คํํ ์ ์๋ ๋ฐฉ์์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด
- ์ฌ๋ฌ UPDATE๋ฅผ
- ์์ฐจ์ ์ผ๋ก ์คํ๋๋๋ก ์ฒด์ด๋ ๊ฐ๋ฅ
์ฆ, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์์ต๋๋ค.
UPDATE QUERY
.after(UPDATE QUERY)
.after(UPDATE QUERY)
.after(UPDATE QUERY)
์ด๋ฅผ ์ค์ SQL ํํ๋ก ๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
BEGIN
UPDATE1
UPDATE2
UPDATE3
UPDATE4
UPDATE5
UPDATE6
COMMIT
์ด ๊ตฌ์กฐ์ ํต์ฌ์ ๋ค์์ ๋๋ค.
- ํ๋์ ํธ๋์ญ์
- ํ๋์ DB round-trip
- ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์์ฐจ ์คํ
์ฆ, O(1) I/O๋ฅผ ์ ์งํ๋ฉด์ UPDATE ์์๋ฅผ ์์ ํ ํต์ ํ ์ ์์์ต๋๋ค.
UPDATE ๊ตฌ๋ฌธ์ AFTER ๋ก ๋ฌถ๊ธฐ ์ํด ๋น์ฆ๋์ค ์ฝ๋ ๋ ๋ฒจ์์ ์ฝ๊ฐ์ ๋ก์ง์ด ์กฐ๊ธ ์ถ๊ฐ ๋์ด์ผ ํ์ง๋ง, ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ด๋ ์๊ฐํ์ต๋๋ค. AFTER ๋ก ์ฒด์ด๋ ํด์ผํ UPDATE QUERY ๊ฐ ๋ช ์ญ๊ฐ๊ฐ ์๋ 5๊ฐ๋ก ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
5๏ธโฃ ๊ฒฐ๊ณผ ๋ฐ ๋ฐฐ์ด์
์ด ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ ์ดํ ์๋๊ณผ ๊ฐ์ ์ฑ๊ณผ๋ฅผ ์ด๋ค๋์ต๋๋ค.
- ๋ฐ๋๋ฝ ์์ ์ ๊ฑฐ
- DB round-trip ์ ์ง (์ฑ๋ฅ ์ ์ง)
- ํธ๋์ญ์ ์์ ์ฑ ํ๋ณด
๊ฒฐ๋ก ์ ์ผ๋ก “์ฑ๋ฅ ์ต์ ํ์ ๋์์ฑ ์์ ์ฑ์ ๋์์ ์ก์ ๊ตฌ์กฐ” ๋ฅผ ๋ง๋ค ์ ์์์ต๋๋ค.
๋ํ, ์ด๋ฒ ๊ฒฝํ์์ ๊ฐ์ฅ ์ค์ํ ํฌ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. DB๋ ์คํ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค
- ์ตํฐ๋ง์ด์ ๋ ํญ์ ์ต์ ์ ์คํ ๊ณํ์ ์ ํํ๋ฉฐ, ๊ทธ ๊ณผ์ ์์ row ์ ๊ทผ ์์๋ ๋ฐ๋ ์ ์์ต๋๋ค.
2. ๋ฐ๋๋ฝ์ ๋ณธ์ง์ ์ํ ๋๊ธฐ๋ค
- ๋ฝ์ด ๋ง์์๊ฐ ์๋๋ผ ๋ฝ ์์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์
3. ํด๊ฒฐ์ ๋จ์ํ๋ค — ์์๋ฅผ ํต์ ํ๋ผ
- ๋์ผํ ์์๋ก lock์ ์ก์ผ๋ฉด, ๋ฐ๋๋ฝ์ ๋ฐ์ํ์ง ์๋๋ค
4. ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํธ๋ ์ด๋์คํ๊ฐ ์๋๋ค
- ์ ์ค๊ณํ๋ฉด ๋ ๋ค ์ก์ ์ ์๋ค.
๋ฐ๋๋ฝ์ ๋จ์ํ DB ๋ฌธ์ ๊ฐ ์๋๋ผ ๋์์ฑ ์ ์ด์ ๋ณธ์ง์ ์ธ ๋ฌธ์ ์ ๋๋ค. ํนํ ๋๊ท๋ชจ ํธ๋ํฝ์ด๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ๊ฒฝ์์๋ “์ธ์ ๊ฐ๋ ๋ฐ๋์” ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด ์ป์ ๊ฒฐ๋ก ์ ๋ช ํํฉ๋๋ค. “๋ฝ์ ์ค์ด๋ ๊ฒ๋ณด๋ค, ๋ฝ์ ์์๋ฅผ ํต์ ํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค”
์ด ๊ธ์ด ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ๋ถ๋ค์๊ฒ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
๋๊ธ