1. ๋์์ฑ ์ ์ด ์ ์
๋์์ฑ ์ ์ด(Concurrency Control)๋,ย ์ฌ๋ฌ ์ฌ์ฉ์๋ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ด ํธ๋์ญ์
์ ์์๋๋ก ์คํํ๋ ๊ฒ์ด ์๋๋ผ, ํธ๋์ญ์
์ด ๋์์ ์คํ๋ ์ ์๋๋ก ํ์ฉํ๋ฉด์๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ ์ ์๋๋ก ํ๋ ๊ธฐ์ ์ด๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ค ํ๋์ด๋ค.
2. ๋์์ฑ ์ ์ด ๋ชฉ์
- ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ DB์ ์ ๊ทผํ๋๋ผ๋ย ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์ง
- ์๋ฅผ ๋ง์กฑํ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ์ ์งํ๋ ๊ฒ
- ๋ถ์ค๋ ๊ฐฑ์ (Lost Update)
- ๋๊ฐ์ ํธ๋์ญ์
์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ์์
์ ์งํํ๊ฒ ๋๋ฉด์ ํ๋์ ์์
์ด ์งํ๋์ง ์๋ ๊ฒฝ์ฐ
- ๋ชจ์์ฑ(Inconsistency)
- ๋๊ฐ์ ํธ๋์ญ์
์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๊ฐฑ์ ํ๊ฒ๋์ด ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฒฐ๊ณผ์ ์ผ์นํ์ง ์์ ์ํ๊ฐ ๋๋ ๊ฒฝ์ฐ
- ์ฐ์๋ณต๊ท(Cascading Rollback)
- ๋๊ฐ์ ํธ๋์ญ์
์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ์์
์ ์งํํ๋ ๊ณผ์ ์์ ํ๋์ ํธ๋์ญ์
์ด ์คํจํ๋ฉด ์์์ฑ์ ์ํด ๋ ํธ๋์ญ์
๋ชจ๋ ๋ณต๊ทํ๋ ๊ฒฝ์ฐ
- ๋น์๋ฃ ์์กด์ฑ(Uncommitted Dependency)
- ํ๊ฐ์ ํธ๋์ญ์
์ด ์คํจํ์์๋, ์ด ํธ๋์ฌ์
์ด ํ๋ณตํ๊ธฐ์ ์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ์คํจํ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ
3. ๋์์ฑ ์ ์ด ๋ฐฉ๋ฒ
3-1. Locking
Locking์ด๋?
- Locking์ ๊ณต์ ์์์ ๋ํ ๋์ ์ก์ธ์ค๋ฅผ ์ ์ดํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
- ๋จ์ผ ์ค๋ ๋ ๋๋ ๋จ์ผ ํ๋ก์ธ์ค์์๋ง ๋์ํ๋ฉฐ, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ์์์ ์ก์ธ์คํ ์ ์๋ค.
- ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ด ๋์ผ๋ฉฐ, ์ด๋ค ์์ค์ locking์ ์ ์ฉํ๋๋์ ๋ฐ๋ผ ๊ต์ฐฉ ์ํ๋ ๊ฒฝ์ ์กฐ๊ฑด๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- ํ์ง๋ง ๋์์ฑ ์ฒ๋ฆฌ ์๋๊ฐ ์ ํ๋ ์ ์๊ณ , ๋๊ธฐ ์๊ฐ์ด ๋ฐ์ํ ์ ์๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก lock ์ฐ์ฐ๊ณผ unlock ์ฐ์ฐ์ ์ฌ์ฉํ๋ค.
Locking์ ์ข
๋ฅ
- ๊ณต์ ์ ๊ธ (shared lock/s-lock): ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉํ๋ ๋ฝ
- ๊ณต์ ์ ๊ธ์ ์ค์ ํ ํธ๋์ญ์
์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด ์ฝ๊ธฐ ์ฐ์ฐ(read)๋ง ๊ฐ๋ฅํ๋ค.
- T1์์ x์ ๋ํด S-lock์ ์ค์ ํ๋ค๋ฉด, T1์ read(x) ์ฐ์ฐ๋ง ๊ฐ๋ฅํ๋ค.
- ํ๋์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ๊ณต์ ์ ๊ธ์ด(S-lock) ๊ฐ๋ฅํ๋ค.
- T1์์ x์ ๋ํด S-lock์ ์ค์ ํ ๊ฒฝ์ฐ, ๋์์ T2์์๋ x์ ๋ํด S-lock์ ์ค์ ํ ์ ์๋ค.
- ๋ค๋ฅธ ํธ๋์ญ์
๋ ์ฝ๊ธฐ ์ฐ์ฐ(read) ๋ง์ ์คํํ ์ ์๋ค.
- T1์์ x์ ๋ํด S-lock์ ์ค์ ํ๋ค๋ฉด, T2์์๋ T1์ด S-lock(x)์ ์คํํ๋ ๋์ read(x) ์ฐ์ฐ๋ง ๊ฐ๋ฅํ๋ค.
- ๋ฐฐํ ์ ๊ธ (exclusive lock/x-lock): ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ ๋ฝ
- ๋ฐฐํ์ ๊ธ์ ์ค์ ํ ํธ๋์ญ์
์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด์ ์ฝ๊ธฐ ์ฐ์ฐ(read)๊ณผ ์ฐ๊ธฐ ์ฐ์ฐ(write) ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
- T1์์ x์ ๋ํด S-lock์ ์ค์ ํ๋ค๋ฉด, T1์ read(x) ์ฐ์ฐ๊ณผ write(x) ์ฐ์ฐ ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
- ํ๋์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ํด์๋ ํ๋์ ๋ฐฐํ์ ๊ธ(X-lock)๋ง ๊ฐ๋ฅํ๋ค.
- ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐฐํ์ ๊ธ์ ๋ถ๊ฐ๋ฅํ๋ค.
- T1์์ x์ ๋ํด X-lock์ ์ค์ ํ๋ค๋ฉด, T1์์ unlock(x)๋ฅผ ํ๊ธฐ ์ ๊น์ง T2์์ x์ ๋ํด X-lock์ ์ค์ ํ ์ ์๋ค.
- ๋ค๋ฅธ ํธ๋์ญ์
์ ์ฝ๊ธฐ ์ฐ์ฐ(read)์ ์ฐ๊ธฐ ์ฐ์ฐ(write) ๋ชจ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- T1์์ x์ ๋ํด X-lock์ ์ค์ ํ๋ค๋ฉด, T2์์๋ T1์์ unlock(x)๋ฅผ ํ๊ธฐ ์ ๊น์ง read(x), write(x) ์ฐ์ฐ์ด ๋ชจ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ถ๊ฐ) ๊ต์ฐฉ์ํ (deadlock)
- ๋ชจ๋ transaction์ด ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ ์๋ฌด๋ฐ ์งํ์ด ์ผ์ด๋์ง ์๋ ์ํ๋ฅผ ๊ต์ฐฉ์ํ๋ผ๊ณ ํ๋ค. ๊ต์ฐฉ์ํ์ ๋น ์ง๋ฉด ์ธ๋ถ์์ ๊ฐ์ ๋ก ํธ๋์ญ์
์ ์ค๋จํ๊ฑฐ๋ ์ ๊ธ์ ํด์ ํ์ง ์๋ ์ด์ ๋ฌดํ์ ๋๊ธฐ ์ํ๋ก ๋จ๊ฒ ๋๋ค.
Locking์ ํ์ฉํ ๋์์ฑ ์ ์ด ๊ธฐ๋ฒ
- ๋๊ด์ ๋ฝ (optimistic lock)
- ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ๋์์ฑ ์ ์ด ๊ธฐ๋ฒ์ด๋ค.
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ฌ์๋ ๋๋ ๋ณํฉ์ ํตํด ์ถฉ๋์ ํด๊ฒฐํ๋ค.
- ์ค์ ๋ก lock์ ์ฌ์ฉํ์ง ์๊ณ version์ ์ด์ฉํจ์ผ๋ก์ ์ ํฉ์ฑ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ lock์ ์ฌ์ฉํ์ง ์๊ณ , ์
๋ฐ์ดํธ ์ ๋ด๊ฐ ์ฝ์ version์ด ๋ง๋์ง ์ถฉ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ฒ๋ฆฌํ๋ค.
- ์ฆ, ์์์ lock์ ์ง์ ๊ฑธ์ด์ ์ ์ ํ์ง ์๊ณ , ๋์์ฑ ๋ฌธ์ ๊ฐ ์ค์ ๋ก ๋ฐ์ํ๋ฉด ๊ทธ๋๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
- ๋น๊ด์ ๋ฝ (pessimistic lock)
- ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ๋์์ฑ ์ ์ด ๊ธฐ๋ฒ์ด๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ๊ธฐ ์ ์ lock์ ํ๋ํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ก์ธ์ค๋ฅผ ์ฐจ๋จํ๊ณ , lock์ ๊ฐ์ง ์ค๋ ๋๋ง ์ ๊ทผํ๋๋ก ์ ์ดํ๋ค.
- ๋ฐ์ดํฐ์ ๋ํ ๋ฐฐํ์ ์ธ ์ก์ธ์ค ๊ถํ์ ๋ณด์ฅํ์ฌ ์ถฉ๋์ ๋ฐฉ์งํ๋ค.
- ์ค์ ๋ก ๋ฐ์ดํฐ์ lock์ ๊ฑธ์ด์ ์ ํฉ์ฑ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์์ ์์ฒญ์ ๋ฐ๋ฅธ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ณ lock์ ๊ฑธ์ด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ฆ, ํธ๋์ ์
์ด ์์ํ ๋ s-lock์ด๋ x-lock์ ์ค์ ๋ก ๊ฑธ๊ณ ์์ํ๋ค.
- ๋๊ด์ ๋ฝ vs. ๋น๊ด์ ๋ฝ
| ๋๊ด์ ๋ฝ | ๋น๊ด์ ๋ฝ |
---|
์ฅ์ | ํธ๋์ ์
์ ํ์๋ก ํ์ง ์๊ณ , ๋ณ๋์ lock์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ์ผ๋ก ์ข๋ค. | ๋์์ฑ ๋ฌธ์ ๊ฐ ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ค๋ฉด rollback์ ํ์๋ฅผ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ผ๋ก ์ข๋ค. |
๋จ์ | ๋์์ฑ ๋ฌธ์ ๊ฐ ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ฉด ๊ณ์ rollback ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ฉฐ, ์
๋ฐ์ดํธ๊ฐ ์คํจํ์ ๋ ์ฌ์๋ ๋ก์ง๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํด์ผ ํ๋ค. | ๋ชจ๋ ํธ๋์ ์
์ lock์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, lock์ด ํ์ํ์ง ์์ ์ํฉ์ด๋๋ผ๋ ๋ฌด์กฐ๊ฑด lock์ ๊ฑธ์ด์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ํนํ read ์์
์ด ๋ง์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ๋จ์ ์ด ๋ ์ ์๋ค. ๋ํ, ์ ์ฐฉ์ ์ด๋ฒคํธ๊ฐ์ด ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ์ํฉ์ด๋ ์ฌ๋ฌ ํ
์ด๋ธ์ lock์ ๊ฑธ๋ฉด์ ์๋ก ์์์ด ํ์ํ ๊ฒฝ์ฐ, ๋ฐ๋๋ฝ์ด ๋ฐ์ํ ์ ์๊ณ ์ด๋ ๋น๊ด์ ๋ฝ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ถ๋ถ์ด๋ค. |
- ๋ถ์ฐ๋ฝ (distributed lock)
- ์ฌ๋ฌ ์ปดํจํฐ ๋๋ ํ๋ก์ธ์ค ๊ฐ์ ๊ณต์ ๋ ์์์ ๋ํ ๋์ ์ก์ธ์ค๋ฅผ ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- ๋ถ์ฐ ์์คํ
์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๋ถ์ฐ๋ ์๋ฒ ๋๋ ํด๋ฌ์คํฐ ๊ฐ์ ์ํธ์์ฉ์ด ํ์ํ๋ค.
- ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฉ์์ง ํ ๋ฑ์ ๋ถ์ฐ ์์คํ
์์ ์ฌ์ฉ๋๋ค.
- ๋ํ์ ์ธ ๋ถ์ฐ๋ฝ ๊ธฐ๋ฒ์ผ๋ก๋ ZooKeeper, Redis ๋ฑ์ด ์๋ค.
- Redis๋ RedLock์ด๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๋ฉฐ 3๊ฐ์ง ํน์ฑ์ ๋ณด์ฅํด์ผํ๋ค๊ณ ํ๋ค.
- ์ค์ง ํ ์๊ฐ์ ํ๋์ ์์
์๋ง์ด ๋ฝ(lock) ์ ๊ฑธ ์ ์๋ค.
- ๋ฝ ์ดํ, ์ด๋ ํ ๋ฌธ์ ๋ก ์ธํด ๋ฝ์ ํ์ง ๋ชปํ๊ณ , ์ข
๋ฃ๋ ๊ฒฝ์ฐ๋ผ๋ ๋ค๋ฅธ ์์
์๊ฐ ๋ฝ์ ํ๋ํ ์ ์์ด์ผํฉ๋๋ค.
- Redis ๋
ธ๋๊ฐ ์๋ํ๋ํ, ๋ชจ๋ ์์
์๋ ๋ฝ์ ๊ฑธ๊ณ ํด์ฒดํ ์ ์์ด์ผํฉ๋๋ค.
- ๋ถ์ฐ ๋ฝ์ ๊ตฌํํ๊ธฐ ์ํด lock์ ๋ํ ์ ๋ณด๋ฅผ Redis์ ์ ์ฅํ๊ณ ์์ด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ์ฐํ๊ฒฝ์์ ์ฌ๋ฌ๋์ ์๋ฒ๋ค์ ๊ณตํต๋ Redis๋ฅผ ๋ฐ๋ผ๋ณด๋ฉฐ, ์์ ์ด ๊ณต์ ์์์ ์ ๊ทผํ ์ ์๋์ง ํ์ธํ๋ค.
- ์คํ๋ฝ (spin lock)
- ์์์ ๋ํ ์ ๊ทผ์ด ํ์ํ ๋ ๋ฌดํ๋ฃจํ๋ฅผ ๋๋ฉด์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๊ฐ lock์ ํด์ ํ ๋๊น์ง ๋๊ธฐํ๋ค.
- ๊ฒฝ์ ์ํ (2๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ๋์์ ์ฝ๊ฑฐ๋ ์ฐ๋ ์ํฉ)๊ฐ ์งง๊ณ ์์ ์ ์ ์๊ฐ์ด ๊ธธ์ง ์์ ๊ฒฝ์ฐ์ ํจ๊ณผ์ ์ด๋ค.
- ์ฃผ๋ก ๋ฉํฐ์ฝ์ด ์์คํ
์์ ์ฌ์ฉ๋๋ฉฐ, ๋ฝ ํ๋์ ์ํด CPU๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ฒ์ ๋ง์ ๋ถํ๋ฅผ ์ฃผ์ด ์ฃผ์ํด์ผ ํ๋ค.
- ์ฐธ๊ณ ์๋ฃ
3-2. MVCC (Multi-Version Concurrency Control)
MVCC ๋ฑ์ฅ ๋ฐฐ๊ฒฝ: Locking์ ํ๊ณ
- lock์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ์ lock์ ํด์ ํ๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กคํ๋๋ฐ ์ ์ฝ์ด ์๋ค
- ํ ๋ฐ์ดํฐ์ ๋ํด s-lock์ด ๊ฑธ๋ ธ์ผ๋ฉด ๋ค๋ฅธ ํธ๋์ ์
์ read๋ ํ ์ ์์ง๋ง write๋ ํ ์ ์๋ค.
- ํ ๋ฐ์ดํฐ์ ๋ํด x-lock์ด ๊ฑธ๋ ธ์ผ๋ฉด ๋ค๋ฅธ ํธ๋์ ์
์ read์ write ๋ชจ๋ ํ ์ ์๋ค.
- MVCC๋ ์ด๋ฐ locking์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค.
MVCC๋?
- ํ๋์ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ์ด ๊ด๋ฆฌ๋๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
- ์ฆ, MVCC๋ ๋ฐ์ดํฐ์ ์
๋ฐ์ดํธ๋ฅผ ํ ๋ ๊ธฐ์กด์ ๋ด์ฉ์ ๋ฎ์ด์ฐ์ง ์๊ณ , ๊ทธ ๋ฐ์ดํฐ์ ์๋ก์ด ๋ฒ์ ์ ๋ง๋ ๋ค.
- Versioning (๋ฒ์ ๊ด๋ฆฌ): ๊ฐ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ ๋ ํด๋น ๋ฐ์ดํฐ์ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ค. ์ฆ, ํธ๋์ญ์
์ด ์์๋ ๋์ ๋ฐ์ดํฐ ์ํ๋ฅผ ์ ์งํ๋ค.
- Snapshot Isolation (์ค๋
์ท ๊ฒฉ๋ฆฌ): ํธ๋์ญ์
์ ๋์์ ์คํ๋์ง๋ง ์๋ก ๊ฒฉ๋ฆฌ๋ ์ค๋
์ท์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. ๊ฐ ํธ๋์ญ์
์ ์์ ์ด ์์๋ ์์ ์ ๋ฐ์ดํฐ ์ค๋
์ท์ ์ฌ์ฉํ๋ฏ๋ก ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ํน์ง
- MVCC์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ธ์ ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ RDBMS๋ณด๋ค ๋งค์ฐ ๋น ๋ฅด๊ฒ ์๋ํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์์ํ ๋, ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์์ ํ๋๋ผ๋ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋์ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ์์ด๊ฒ ๋๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ์์คํ
์ด ํ์ํ๋ค.
- MVCC ๋ชจ๋ธ์ ํ๋์ ๋ฐ์ดํฐ์ ๋ํ ์ฌ๋ฌ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ฒ์ ์ด ์ถฉ๋๋ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์์ญ์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค.
- UNDO ๋ธ๋ก I/O, CR Copy ์์ฑ, CR ๋ธ๋ก ์บ์ฑ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ์์
์ ์ค๋ฒํค๋ ๋ฐ์ํ๋ค.
- ์ฐธ๊ณ ์๋ฃ
3-3. BullQueue
BullQueue๋?
- Nest.js์์ ์ ๊ณตํ๋ Redis ๊ธฐ๋ฐ ๋ถ์ฐ ์์
ํ๋ก ๋ถ์ฐ ํ๊ฒฝ์์ ์์
์ ์ฒ๋ฆฌํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
- Queue Design Pattern์ ํ์ฉํด ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ ์์
๋ค์ ํ์ ์ถ๊ฐํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด ์์
๋ค์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ฉฐ, ํ์ ์ถ๊ฐ๋ ์์
๋ค์ FIFO ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- Nest์์๋
@nestjs/bull
package๋ฅผ ์ ๊ณตํ๋ค.
- ์์
๊ด๋ฆฌ: ํ์ ์์
์ ์ถ๊ฐํ๊ณ , ์์
์ ์ํ๋ฅผ ์ถ์ ํ๊ณ , ์์
์ ์คํ ๋ฐ ์๋ฃํ ์ ์๋ค. ์์
์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๊ฒฐ๊ณผ๋ ์ํ ๋ณ๊ฒฝ์ ์ด๋ฒคํธ๋ฅผ ํตํด ์ฒ๋ฆฌํ ์ ์๋ค.
- ์์
์ฐ์ ์์: ์์
์๋ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์๋ค. ์ฐ์ ์์์ ๋ฐ๋ผ ํ์์ ์ฒ๋ฆฌ๋๋ ์์๊ฐ ๋ฌ๋ผ์ง ์ ์์ด, ์ค์ํ ์์
์ด ๋จผ์ ์ฒ๋ฆฌ๋๋๋ก ์กฐ์ ํ ์ ์๋ค.
- ์์
์ฌ์๋ ๋ฐ ์คํจ ์ฒ๋ฆฌ: ์์
์ด ์คํจํ ๊ฒฝ์ฐ, BullQueue๋ ์ฌ์๋ ๋ฐ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค. ์ฌ์๋ ํ์๋ ์คํจ ์ฒ๋ฆฌ ์ ๋ต์ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ค๋ฅ์ ๋์ฒํ๊ณ ์์ ์ ์ธ ์์
์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
- ์์
์ํ ๋ชจ๋ํฐ๋ง: BullQueue๋ ์์
์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ถ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์์
์ ์งํ ์ํฉ์ ํ์ธํ๊ณ , ์๋ฃ ๋๋ ์คํจ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.
BullQueue๋ฅผ ์ ํํ ์ด์
- ์ ์ฐํ ์์
ํ ๋ฐ ์์
์ฒ๋ฆฌ: ์์
๋ค์ ํ์ ์ถ๊ฐํ๊ณ ์์ปค ํ๋ก์ธ์ค๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋์์ฑ์ ์ ์ดํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์์
์ ์ฒ๋ฆฌํ๊ณ ์์
์ฒ๋ฆฌ์ ์ ์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
- ๋ถ์ฐ ํ๊ฒฝ์์์ ๋์์ฑ ์ ์ด: ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ๋ถ์ฐ ์๋ฒ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ์ํฉ์ด ์๊ธธ ๊ฒฝ์ฐ, ์ฌ๋ฌ ์๋ฒ ๋๋ ํด๋ฌ์คํฐ ๊ฐ์ ์์
์ ๊ณต์ ํ๊ณ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค.
- ์ํ ๊ด๋ฆฌ ๋ฐ ์ด๋ฒคํธ ์๋ฆผ: ์์
์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ด๋ฒคํธ ์๋ฆผ์ ์ ๊ณตํ๋ค. ์์
์ ์งํ ์ํฉ์ ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ์์
์ ์๋ฃ, ์ค๋ฅ ๋๋ ๋ค๋ฅธ ์ํ ๋ณ๊ฒฝ์ ๋ํ ์๋ฆผ์ ๋ฐ์ ์ ์๋ค. ์ด๋ฅผ ํตํด ์์
์ ์ํ ๋ณํ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ๊ณ ํ์ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ค.
- ๋ฒ์ธ) Apache Kafka: ์ค์๊ฐ ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ถ์ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ (microservice)
- ๋์์ฑ ์ ์ด๋ MSA์์ ์๋น์ค ๊ฐ์ ๋์์ ์คํ๋๋ ์์
๋ค์ ์ ์ดํ๊ณ ๋๊ธฐํํ๋ ๊ณผ์ ์ ์๋ฏธ. ๋์์ฑ ์ ์ด๋ ๋ถ์ฐ ์์คํ
์์ ์ค์ํ ์์์ด์ง๋ง, Kafka ์์ฒด๋ ๋์์ฑ ์ ์ด๋ฅผ ๋ชฉ์ ์ผ๋ก ๋์์ธ๋ ํด์ ์๋. Kafka๋ ๋ฉ์์ง ์ ๋ฌ๊ณผ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ ์์คํ
์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋์์ฑ ์ ์ด๋ฅผ ์ํด์๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ๊ณผ ๋๊ตฌ๋ค์ ์ฌ์ฉํด์ผ ํจ.
- Kafka๋ ๋ถ์ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ์ผ๋ก์, ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ ์กํ๊ณ ์ ์ฅํ๊ธฐ ์ํ ์์คํ
.
- Kafka๋ ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ถ ๋ฉ์์ง ํ ์์คํ
์ผ๋ก, ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ฒ ์ ์กํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค. MSA(Microservices Architecture)์์๋ Kafka๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๊ฐ์ ๋
๋ฆฝ์ ์ธ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ๋ฉ์์ง ๊ธฐ๋ฐ ํต์ ์ ์ํํ ์ ์์. ์ด๋ฅผ ํตํด ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ๋ฅผ ๊ตฌํํ๊ณ , ์๋น์ค ๊ฐ์ ๋์จํ ๊ฒฐํฉ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ถ ์ ์์.
4. ๋์์ฑ ์ ์ด ํ
์คํธ ๋ชจ๋ํฐ๋ง ํด
Artillery
- Artillery๋ฅผ ์ ํํ ์ด์
- JavaScript ๊ธฐ๋ฐ: Artillery๋ JavaScript๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ํ
์คํธ๋ฅผ ์ํํ๋ค.
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฒฐ๊ณผ ๋ถ์: Artillery๋ ํ
์คํธ ์งํ ์ค์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋ง ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ์ฑ๋ฅ ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ
์คํธ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ์ฑ๋ฅ ์ด์๋ฅผ ์ ์ํ๊ฒ ํ์
ํ ์ ์๋ค.
- ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ: Artillery๋ ๋ค์ํ ๋์์ฑ ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ๊ณ , ํ
์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฐํ๊ฒ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ค์ํ ๋์ ์ฌ์ฉ์ ์, ์์ฒญ ํจํด ๋ฐ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์
ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์์ฑ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํจ๊ณผ์ ์ผ๋ก ํ๊ฐํ ์ ์๋ค.
- ๋ค๋ฅธ ์ ํ์ง: Apache JMeter
- JMeter๋ ๋ค์ํ ํ๋กํ ์ฝ๊ณผ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๊ฐ๋ ฅํ ์ฑ๋ฅ ํ
์คํธ ๋๊ตฌ์ด๋ค. ๋ค์ํ ํ
์คํธ ์๋๋ฆฌ์ค, ์์ฒญ ์ ํ, ๋ฐ์ดํฐ ์กฐ์ ๋ฐ ์ถ์ถ, ๋ณด๊ณ ์ ์์ฑ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ง์ฝ ๋ค์ํ ํ๋กํ ์ฝ ์ง์์ด ํ์ํ๊ฑฐ๋ ๋ณต์กํ ํ
์คํธ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ค๋ฉด JMeter๊ฐ ๋ ์ข์ ์ ์์ง๋ง, ์ฐ๋ฆฌ์ ๋์์ฑ ์ ์ด ์ฒ๋ฆฌ ๋ถ๋ถ์ ํฌ๊ฒ ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์ง์ง ์๊ธฐ ๋๋ฌธ์ Artillery๊ฐ์ด ๊ฐ๋ฒผ์ด ๋ชจ๋ํฐ๋ง ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ๋ค๊ณ ํ๋จํ์๋ค.