2019๋
๊ฐ์, Mail.ru Cloud iOS ํ์์ ์ค๋ซ๋์ ๊ธฐ๋ค๋ ค์จ ์ด๋ฒคํธ๊ฐ ์ด๋ ธ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ํ์ ์๊ตฌ ์ ์ฅ์ ์ํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ชจ๋ฐ์ผ ์ธ๊ณ์์ ๋งค์ฐ ์ด์์ ์
๋๋ค.
๋ด์ฉ
์ถ์ง๋๊ธฐ LMDB ํฌ์ง์ ๋ ์ธ๋ง๋ฆฌ ๊ณ ๋ LMDB
3.1.๊ณ ๋ #1. ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ
3.2.๊ณ ๋ #2. B+-ํธ๋ฆฌ
3.3.๊ณ ๋ #3. ๊ธฐ๋ก ์ค ๋ณต์ฌ ํค-๊ฐ API ์์ ๋ฐ์ดํฐ ์คํค๋ง ์ค๊ณ
4.1.๊ธฐ๋ณธ ์ถ์ํ
4.2.ํ ์ด๋ธ ๋ชจ๋ธ๋ง
4.3.ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ ๋ชจ๋ธ๋ง
1. ์ถ์ง๋๊ธฐ
2015๋
์ XNUMX๋
์ ํ ๋ฒ, ์ฐ๋ฆฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ธํฐํ์ด์ค๊ฐ ์ผ๋ง๋ ์์ฃผ ์ง์ฐ๋๋์ง ์ธก์ ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ํ์ง ์์์ต๋๋ค. ๋๋๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ์ ์์
์ ์๋ตํ์ง ์๋๋ค๋ ์ฌ์ค์ ๋ํด ์ ์ ๋ ๋ง์ ๋ถ๋ง์ด ์์ต๋๋ค. ๋ฒํผ์ ๋๋ฅด์ง ์๊ณ ๋ชฉ๋ก์ ์คํฌ๋กคํ์ง ์๋ ๋ฑ์
๋๋ค. ์ธก์ ์ญํ ์ ๋ณด
์ธก์ ๊ฒฐ๊ณผ๋ ์ฐ๋ฆฌ์๊ฒ ๋์ ์ค์๊ฐ ๋์์ต๋๋ค. ๋๊ฒฐ๋ก ์ธํ ๋ฌธ์ ๊ฐ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ์ด ์ฌ์ค์ ๊นจ๋ซ๊ธฐ ์ ์ ํ์ง์ ์ฃผ์ ๊ธฐ์ ์งํ๊ฐ ์ถฉ๋์ด ์๋ ๊ฒฝ์ฐ ์ด์ ์ ๋ง์ถ ํ์
๊ตฌ์ถํ
์์คํ ๊ตฌ์ฑ์ ์กํฐ ๋ชจ๋ธ์ ๋ฉํฐ์ค๋ ๋ฉ์ด ๋ ๋ฒ์งธ ๋ณธ์ง์ด ๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ ์์ ์๋ ๋ชจ๋ธ ๊ฐ์ฒด๋ ์ค๋ ๋ ๊ฒฝ๊ณ๋ฅผ ๊ต์ฐจํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋๋๋ก ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ฅ์์์๊ฐ ์๋๋ผ ๊ฑฐ์ ๋์์์ด ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ณณ์์ ์ด๊ฒ์ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์๋ ๋ค์ด์ด๊ทธ๋จ์ ์ด์ ๊ตฌ์ฑ ์์ ์ค ํ๋์
๋๋ค. ์ฃผ์ ์์
์ ๋งคํฌ๋ก ํจํด์ ๊ตฌํํ๋ ๊ฒ์
๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ์ ์ํฅ์ ์ค ๋ ๋ฒ์งธ ์ค์ํ ์์๋ ํด๋ผ์ฐ๋ API์์ต๋๋ค. ๋๊ธฐํ์ ๋ํ git ์ ๊ทผ ๋ฐฉ์์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. ๊ทธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๋ฆฌ๋ ๋ชฉํ๋ก
๋ฐ๋ผ์ ํ ๋ช ๋ น์ ์คํํ ๋ ๋ก์ปฌ ์ค๋ ์ท์ ํจ์น๋ฅผ ์ ์ฉํ๋ ๋์ ์ ์ฒด ์ํ๋ฅผ ์ ์ฒด ์๋ฒ ์ํ์ ๋น๊ตํ๋ git์ ์์ํ๋ฉด ๋๊ธฐํ ๋ฐฉ๋ฒ์ ๋ํด ์๋นํ ์ ํํ ์์ด๋์ด๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ํด๋ผ์ฐ๋ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ํฉ๋๋ค. ๊ตฌํ์ ์ํด ๋ชจ๋ ์๋ฒ ๋ฐ ๋ก์ปฌ ํ์ผ์ ๋ํ ๋ฉํ ์ ๋ณด์ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ์ ๋ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํ๋ค๊ณ ์ถ์ธกํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋ผ์ฐ๋์ 500๋ง ๊ฐ์ ํ์ผ์ ์ ์ฅํ ๋ค์ ์ด๋ฅผ ๋๊ธฐํํ๋ ค๋ฉด 1๋ง ๊ฐ์ ๋ ธ๋๊ฐ ์๋ ๋ ๊ฐ์ ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ง๋ค๊ณ ํ๊ดดํด์ผ ํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ ๋ ธ๋๋ ํ์ ๊ฐ์ฒด์ ๊ทธ๋ํ๋ฅผ ํฌํจํ๋ ์ง๊ณ์ ๋๋ค. ์ด๋ฌํ ๊ด์ ์์ ํ๋กํ์ผ๋ง ๊ฒฐ๊ณผ๋ ์์๋์์ต๋๋ค. ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ๋ คํ์ง ์์๋ ์์ฒญ๋ ์์ ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํ๊ดดํ๋ ์ ์ฐจ ์์ฒด์ ์๋นํ ๋น์ฉ์ด ๋ ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ผ๋ฉฐ ๊ธฐ๋ณธ ๋๊ธฐํ ์์ ์ด ๋ง์ ์์ ํฌํจ๋์ด ์ํฉ์ด ์ ํ๋ฉ๋๋ค. ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ์. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ์์ ๋ ๋ฒ์งธ๋ก ์ค์ํ ๊ธฐ์ค์ธ ๊ฐ์ฒด์ ๋์ ํ ๋น ์์ด CRUD ์์ ์ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ์์ ํ์ต๋๋ค.
๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ ๋ณด๋ค ์ ํต์ ์ด๋ฉฐ ์ ์ฒด ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ค๋ ๋ ์์ .
- ๋ค์ค ์ฒ๋ฆฌ. ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ๊ฐ๋ฟ๋ง ์๋๋ผ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ iOS ํ์ฅ ๊ฐ์๋ ์ํ๋ฅผ ๋๊ธฐํํ๋ ค๋ ์๊ตฌ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
- ์ ์ฅ๋ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด๋ก ๋ํ๋ด๋ ๊ธฐ๋ฅ์ ๋๋ค.
- CRUD ์์ ๋ด์์ ๋์ ํ ๋น์ด ๋ถ์กฑํฉ๋๋ค.
- ๊ธฐ๋ณธ ์์ฑ์ ๋ํ ํธ๋์ญ์
์ง์
ACID ํค์๋: ์์์ฑ, ์ผ๊ด์ฑ, ๊ฒฉ๋ฆฌ ๋ฐ ์ ๋ขฐ์ฑ. - ๊ฐ์ฅ ์ธ๊ธฐ์๋ ์ฌ๋ก์ ์๋.
์ด๋ฌํ ์๊ตฌ ์ฌํญ์ผ๋ก ์ธํด SQLite๋ ์ฌ์ ํ ์ข์ ์ ํ์ด์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋์ ์ฐ๊ตฌ์ ์ผํ์ผ๋ก ์ฐ์ฐํ ๋ง๋ ์ฑ
2. LMDB ํฌ์ง์ ๋
LMDB๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฅ ๋ฎ์ ๊ธฐ๋ณธ ๊ณ์ธต์ธ ์คํ ๋ฆฌ์ง๋ฅผ ๊ตฌํํ๋ ๋งค์ฐ ์์(๋จ์ง 10K ๋ผ์ธ) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
์์ ๋ค์ด์ด๊ทธ๋จ์ ๋ ๋์ ์์ค์ ๊ตฌํํ๋ SQLite์ LMDB๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก Core Data๊ฐ ์๋ SQLite๋ณด๋ค ๋ ์ ํํ์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. BerkeleyDB, LevelDB, Sophia, RocksDB ๋ฑ ๋์ผํ ๊ฒฝ์์์ ๋์ผํ ์คํ ๋ฆฌ์ง ์์ง์ ์ธ์ฉํ๋ ๊ฒ์ด ๋ ๊ณต์ ํ ๊ฒ์
๋๋ค. LMDB๊ฐ SQLite์ ์คํ ๋ฆฌ์ง ์์ง ๊ตฌ์ฑ ์์ ์ญํ ์ ํ๋ ๊ฐ๋ฐ๋ ์์ต๋๋ค. 2012๋
์ฒซ ์คํ
LMDB์ ์ฃผ์ ์ฉ๋๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ฉ ์์ง์
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฐ์์๊ฒ ๊ทธ ๋ชจ์ต์ ๋น์ง๊ณ ์์ต๋๋ค.
LMDB๋ ์ข
์ข
์๋ ๊ทธ๋๋ก์ ์คํ ๋ฆฌ์ง๋ก๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, Mozilla Firefox ๋ธ๋ผ์ฐ์
์ด ์์ง์ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ ์ธ๊ณ์์๋ ์ธ๊ธฐ๋ฅผ ๋์์ต๋๋ค. ์ฌ์ฉ ํ์ ์ด ๋จ์ ์ ์์ต๋๋ค
LMDB๋ Oracle์ ํต์ ํ์ ์ ํ ํ BerkeleyDB๊ฐ ๋จ๊ธด ํ์ ์์ฅ์์ ํ์์ ์๋ฆฌ๋ฅผ ๋๊ณ ์ฑ๊ณต์ ์ผ๋ก ์ธ์ฐ๊ณ ์์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ฒด ์ข
๋ฅ์ ๋น๊ตํด๋ ์๋์ ์์ ์ฑ์ผ๋ก ์ฌ๋๋ฐ๊ณ ์์ต๋๋ค. ์์๋ค์ํผ ๊ณต์ง ์ ์ฌ์ ์์ผ๋ฉฐ LMDB์ SQLite ์ค ํ๋๋ฅผ ์ ํํ ๋ ์ง๋ฉดํ๊ฒ ๋ ์ ์ถฉ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ์์ ๋ค์ด์ด๊ทธ๋จ์ ์ด๋ป๊ฒ ์ฆ๊ฐ๋ ์๋๋ฅผ ์ป์ ์ ์๋์ง ๋ช
ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค. ์ฒซ์งธ, ์ฐ๋ฆฌ๋ ๋์คํฌ ์คํ ๋ฆฌ์ง ์์ ์ถ๊ฐ ์ถ์ํ ๊ณ์ธต์ ๋ํด ๋น์ฉ์ ์ง๋ถํ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์ข์ ์ํคํ
์ฒ์์๋ ๊ทธ๊ฒ๋ค ์์ด๋ ์ฌ์ ํ ํ ์ ์์ผ๋ฉฐ ํ์ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ ๋ํ๋ ๊ฒ์ด์ง๋ง ํจ์ฌ ๋ ์์ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด SQL ์ธ์ด์ ์ฟผ๋ฆฌ ์ง์๊ณผ ๊ฐ์ด ํน์ ์์ฉ ํ๋ก๊ทธ๋จ์ ํ์ํ์ง ์์ ๊ธฐ๋ฅ์ ์์ต๋๋ค. ๋์งธ, ๋์คํฌ ์คํ ๋ฆฌ์ง์ ๋ํ ์์ฒญ์ ๋ํ ์ ํ๋ฆฌ์ผ์ด์
์์
์ ๋งคํ์ ์ต์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ๋ง์ฝ SQLite
3. ์ธ๋ง๋ฆฌ ๊ณ ๋ LMDB
์กฐ๊ฐ๋์์ LMDB๋ฅผ ์ดํด๋ณธ ํ ๋ ๊น์ด ๋ค์ด๊ฐ ๋์ ๋๋ค. ๋ค์ ์ธ ์น์ ์ ์คํ ๋ฆฌ์ง ์ํคํ ์ฒ๊ฐ ๊ธฐ๋ฐ์ด ๋๋ ์ฃผ์ ๊ณ ๋ ๋ถ์์ ์ ๋ ํ ๊ฒ์ ๋๋ค.
- ๋์คํฌ ์์ ๋ฐ ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋๊ธฐํ๋ฅผ ์ํ ๋ฉ์ปค๋์ฆ์ผ๋ก์์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ.
- ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์กฐ์ง์ผ๋ก์์ B+-ํธ๋ฆฌ.
- ACID ํธ๋์ญ์ ์์ฑ ๋ฐ ๋ค์ค ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์ ๊ทผ ๋ฐฉ์์ธ Copy-on-write.
3.1. ๊ณ ๋ #1. ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ
๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ด๋ฆ์๋ ๋ํ๋๋ ์ค์ํ ์ํคํ ์ฒ ์์์ ๋๋ค. ์ ์ฅ๋ ์ ๋ณด์ ๋ํ ์บ์ฑ ๋ฐ ๋๊ธฐํ ์ก์ธ์ค ๋ฌธ์ ๋ ์ ์ ์ผ๋ก ์ด์ ์ฒด์ ์ ๋ฌ๋ ค ์์ต๋๋ค. LMDB๋ ์์ฒด์ ์ผ๋ก ์บ์๋ฅผ ํฌํจํ์ง ์์ต๋๋ค. ์ด๋ ์์ฑ์์ ์์์ ์ธ ๊ฒฐ์ ์ ๋๋ค. ๋งคํ๋ ํ์ผ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด ์์ง ๊ตฌํ์์ ๋ง์ ์ฝ๋๋ฅผ ์๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋๋ ๊ทธ๋ค ์ค ์ผ๋ถ์ ์์ ํ ๋ชฉ๋ก๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค.
- ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ์์ ํ ๋ ์คํ ๋ฆฌ์ง์์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ ์ด์ ์ฒด์ ์ ์ฑ ์์ด ๋ฉ๋๋ค. ๋ค์ ์น์ ์์ ์ด ์ญํ์ ๋ํด ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์์ธํ ์ค๋ช ํฉ๋๋ค.
- ์บ์๊ฐ ์์ผ๋ฉด ๋์ ํ ๋น๊ณผ ๊ด๋ จ๋ ์ค๋ฒํค๋๊ฐ LMDB์์ ์์ ํ ์ ๊ฑฐ๋ฉ๋๋ค. ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฐ๋ฅธ ์ฃผ์๋ก ์ค์ ํ๋ ๊ฒ์ผ ๋ฟ ๊ทธ ์ด์์ ์๋๋๋ค. ํ์์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ๋ฆฌํฌ์งํ ๋ฆฌ ์์ค์์ ๋ชจ๋ calloc ํธ์ถ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ ์ง์ค๋์ด ์์ต๋๋ค.
- ์บ์๊ฐ ์๋ค๋ ๊ฒ์ ์บ์์ ์ก์ธ์คํ๊ธฐ ์ํ ๋๊ธฐํ์ ๊ด๋ จ๋ ์ ๊ธ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ๋ ํฉ๋๋ค. ์์์ ์ซ์๊ฐ ๋์์ ์กด์ฌํ ์ ์๋ ํ๋ ๊ธฐ๋ ๋ฐ์ดํฐ๋ก ๊ฐ๋ ๋์ค์ ๋จ์ผ ๋ฎคํ ์ค๋ฅผ ๋ง๋์ง ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฝ๊ธฐ ์๋๋ CPU ์ ์ธก๋ฉด์์ ์ด์์ ์ธ ์ ํ ํ์ฅ์ฑ์ ๊ฐ์ต๋๋ค. LMDB์์๋ ์์ ์์ ๋ง ๋๊ธฐํ๋ฉ๋๋ค. ํ ๋ฒ์ ํ ๋ช ์ ์๊ฐ๋ง ์์ ์ ์์ต๋๋ค.
- ์ต์ํ์ ์บ์ฑ ๋ฐ ๋๊ธฐํ ๋
ผ๋ฆฌ๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์์
ํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋งค์ฐ ๋ณต์กํ ์ ํ์ ์ค๋ฅ๋ก๋ถํฐ ์ฝ๋๋ฅผ ์ ์ฅํฉ๋๋ค. Usenix OSDI 2014 ์ปจํผ๋ฐ์ค์์ ๋ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ตฌ๊ฐ ์์์ต๋๋ค.
"๋ชจ๋ ํ์ผ ์์คํ ์ด ๋์ผํ๊ฒ ์์ฑ๋์ง ์์: ํฌ๋์ ์ผ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ณต์ก์ฑ์ ๋ํด" ะธ์ฌ๋ฏธ์ ์ด์ต์ ์ํ ๊ณ ๋ฌธ ๋ฐ์ดํฐ๋ฒ ์ด์ค . ๊ทธ๋ค๋ก๋ถํฐ LMDB์ ์ ๋ก ์๋ ์์ ์ฑ๊ณผ ๋์ผํ SQLite์์ ์ด๋ฅผ ๋ฅ๊ฐํ๋ ๊ฑฐ์ ์๋ฒฝํ ํธ๋์ญ์ ACID ์์ฑ ๊ตฌํ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค. - LMDB์ ๋ฏธ๋๋ฉ๋ฆฌ์ฆ์ ํตํด ์ฝ๋์ ๊ธฐ๊ณ ํํ์ ๊ฒฐ๊ณผ ์๋ ํน์ฑ๊ณผ ํจ๊ป ํ๋ก์ธ์์ L1 ์บ์์ ์์ ํ ๋ฐฐ์นํ ์ ์์ต๋๋ค.
๋ถํํ๋ iOS์์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋งํผ ์ฅ๋ฐ๋น์ด ์๋๋๋ค. ๊ทธ๋ค๊ณผ ๊ด๋ จ๋ ๋จ์ ์ ๋ํด ๋ ์์์ ์ผ๋ก ์ด์ผ๊ธฐํ๋ ค๋ฉด ์ด์ ์ฒด์ ์์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๊ธฐ ์ํ ์ผ๋ฐ ์์น์ ์๊ธฐํ ํ์๊ฐ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ๋ํ ์ผ๋ฐ ์ ๋ณด
์คํ ๊ฐ๋ฅํ ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ํจ๊ป ์ด์ ์ฒด์ ๋ ํ๋ก์ธ์ค๋ผ๋ ์ํฐํฐ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ๊ฐ ํ๋ก์ธ์ค์๋ ์์ ์ ํ์ํ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์นํ๋ ์ฐ์๋ ๋ฒ์์ ์ฃผ์๊ฐ ํ ๋น๋ฉ๋๋ค. ์ตํ์ ์ฃผ์์๋ ์ฝ๋์ ํ๋์ฝ๋ฉ๋ ๋ฐ์ดํฐ ๋ฐ ๋ฆฌ์์ค๊ฐ ์๋ ์น์ ์ด ํฌํจ๋ฉ๋๋ค. ๋ค์์ ์ํฅ ์ฑ์ฅํ๋ ๋์ ์ฃผ์ ๊ณต๊ฐ ๋ธ๋ก์ผ๋ก, ์ฐ๋ฆฌ์๊ฒ ํ์ผ๋ก ์ ์๋ ค์ ธ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ ์๋ ์ค์ ๋ํ๋๋ ์ํฐํฐ์ ์ฃผ์๋ฅผ ํฌํจํฉ๋๋ค. ์๋จ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ปค์ง๊ฑฐ๋ ์์์ง๋ ๊ฒ, ์ฆ ๊ทธ ํฌ๊ธฐ ๋ํ ๋์ ์ธ ์ฑ์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์คํ๊ณผ ํ์ด ์๋ก ๋ฐ๊ณ ๊ฐ์ญํ์ง ์๋๋ก ์ฃผ์ ๊ณต๊ฐ์ ์๋ก ๋ค๋ฅธ ๋์์ ๋ถ๋ฆฌ๋๋ฉฐ, ์์ ์๋์ ๋ ๋์ ์น์ ์ฌ์ด์ ๊ตฌ๋ฉ์ด ์์ต๋๋ค. ์ด ์ค๊ฐ ์น์ ์ ์ฃผ์๋ ์ด์ ์ฒด์ ์์ ๋ค์ํ ์ํฐํฐ์ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํนํ ํน์ ์ฐ์ ์ฃผ์ ์งํฉ์ ๋์คํฌ์ ํ์ผ์ ๋งคํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ผ์ด๋ผ๊ณ ํฉ๋๋ค.
ํ๋ก์ธ์ค์ ํ ๋น๋ ์ฃผ์ ๊ณต๊ฐ์ ์์ฒญ๋ฉ๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ฃผ์์ ์๋ ์์คํ ์ ๋นํธ์ ์ํด ๊ฒฐ์ ๋๋ ํฌ์ธํฐ์ ํฌ๊ธฐ์ ์ํด์๋ง ์ ํ๋ฉ๋๋ค. ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ 1-in-1์ ํ ๋น๋ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ํ๋ก์ธ์ค๋ ์ ์ฒด RAM์ ์ก์๋จน๊ณ ๋ฉํฐํ์คํน์ ๋ํด ์๋ฌธ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ต์ ์ด์ ์ฒด์ ๋ ๋์์ ์ํ๋ ๋งํผ ๋ง์ ํ๋ก์ธ์ค๋ฅผ ์คํํ ์ ์๋ค๋ ๊ฒ์ ๊ฒฝํ์ ํตํด ์๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ข ์ด์๋ง ํ๋ก์ธ์ค์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค๋ ์ฌ์ค ๋๋ฌธ์ ๊ฐ๋ฅํ์ง๋ง ์ค์ ๋ก๋ ์ง๊ธ ์ฌ๊ธฐ์์ ์๊ตฌ๋๋ ๋ถ๋ถ ๋ง ๊ธฐ๋ณธ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์๋ก๋ํฉ๋๋ค. ๋ฐ๋ผ์ ํ๋ก์ธ์ค์ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์์ด๋ผ๊ณ ํฉ๋๋ค.
์ด์ ์ฒด์ ๋ ๊ฐ์ ๋ฐ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํน์ ํฌ๊ธฐ์ ํ์ด์ง๋ก ๊ตฌ์ฑํฉ๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ํ์ด์ง๊ฐ ์๊ตฌ๋๋ ์ฆ์ ์ด์ ์ฒด์ ๋ ์ด๋ฅผ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ ์ด๋ค ์ฌ์ด์ ํต์ ์ ํน์ ํ ์ด๋ธ์ ์ ์ฅํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋กฏ์ด ์์ผ๋ฉด ์ด์ ์ ๋ก๋๋ ํ์ด์ง ์ค ํ๋๊ฐ ๋์คํฌ์ ๋ณต์ฌ๋๊ณ ์์ฒญ๋ ํ์ด์ง๊ฐ ๊ทธ ์๋ฆฌ๋ฅผ ์ฐจ์งํฉ๋๋ค. ๊ณง ๋ค์ ์ค๋ช ํ ์ด ์ ์ฐจ๋ฅผ ์ค์ํ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์ ์ค๋ช ๋ ํ๋ก์ธ์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ทธ ์์ ์ฃผ์๊ฐ 0์ธ ํ์ด์ง A๊ฐ ๋ก๋๋์ด ์ฃผ์๊ฐ 4์ธ ์ฃผ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ๋ฐฐ์น๋์์ต๋๋ค. ์ด ์ฌ์ค์ ์ ๋ฒํธ 0์ โโ๋์ํ์ ๋ฐ์๋์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ๊ฒฝ์ฐ ์ด์ผ๊ธฐ๋ ์ ํํ ๋์ผํฉ๋๋ค. ๋
ผ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ค์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์ง์์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์์ ํ ๋ฐฐ์น๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ง ๋จ์๋ก ์์ฒญ ์์๋ง ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๋๋ค. ์ด๋ฌํ ํ์ด์ง์ ์์ ์ ๋์คํฌ์ ํ์ผ๊ณผ ๋๊ธฐํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ๋ก ์์
ํ์ฌ ํ์ผ I/O๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ด์ ์ฒด์ ์ปค๋์ ์ํด ์๋์ผ๋ก ์๋ณธ ํ์ผ๋ก ์ ์ก๋ฉ๋๋ค.
รข โฌ <
์๋ ์ด๋ฏธ์ง๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์์
ํ ๋ LMDB๊ฐ ์ํ๋ฅผ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ผํ ํ์ผ์ ๋งคํํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ฌ์ค์ ์ด์ ์ฒด์ ๊ฐ ์ฃผ์ ๊ณต๊ฐ์ ํน์ ๋ธ๋ก์ ์๋ก ์ ์ด์ ์ผ๋ก ๋๊ธฐํํ๋๋ก ๊ฐ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ LMDB๊ฐ ๋ณด์
๋๋ค.
รข โฌ <
์ค์ํ ์ฐจ์ด์ ์ LMDB๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ธฐ ์์คํ ํธ์ถ ๋ฉ์ปค๋์ฆ์ ํตํด ๋ฐ์ดํฐ ํ์ผ์ ์์ ํ๊ณ ํ์ผ ์์ฒด๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ํ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์๋ ๋ ๊ฐ์ง ์ค์ํ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ ๋ชจ๋ ์ด์ ์ฒด์ ์ ๊ณตํต์ ์
๋๋ค. ๊ทธ ๋ณธ์ง์ ์๋ชป๋ ์ฝ๋๋ก ์ธํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถ์ฃผ์ํ ์์์ ๋ํ ๋ณดํธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์์๋ค์ํผ ํ๋ก์ธ์ค์ ์คํ ๊ฐ๋ฅํ ๋ช
๋ น์ ์ฃผ์ ๊ณต๊ฐ์ ์ด๋์์๋ ๋ฐ์ดํฐ์ ์์ ๋กญ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋์์ ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๊ธฐ์ตํ ๊ฒ์ฒ๋ผ ํ์ผ์ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ชจ๋๋ก ํ์ํ๋ค๋ ๊ฒ์ ๋ชจ๋ ๋ช
๋ น์ด ์ถ๊ฐ๋ก ํ์ผ์ ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ค์ ๋ก ์กด์ฌํ์ง ์๋ ์ธ๋ฑ์ค์์ ๋ฐฐ์ด ์์๋ฅผ ๋ฎ์ด์ฐ๋ ค๊ณ ์๋ํ๋ ๋ฑ ์ค์๋ก ์ด ์์
์ ์ํํ๋ฉด ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ด ์ฃผ์์ ๋งคํ๋ ํ์ผ์ ์ค์๋ก ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ์ด๋ก ์ธํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์๋ ์ ์์ต๋๋ค. ํ์ผ์ด ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ํ์๋๋ ๊ฒฝ์ฐ ํด๋น ์ฃผ์ ๊ณต๊ฐ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด ์ ํธ์ ํจ๊ป ํ๋ก๊ทธ๋จ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. SIGSEGV
, ํ์ผ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
๋ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ ์ด๋ฏธ iOS์๋ง ํด๋น๋ฉ๋๋ค. ์์ฑ์๋ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ช ์์ ์ผ๋ก ์ธ๊ธํ์ง ์์์ง๋ง, ์ด๊ฒ์ด ์์ผ๋ฉด LMDB๋ ์ด ๋ชจ๋ฐ์ผ ์ด์ ์ฒด์ ์์ ์คํํ๊ธฐ์ ์ ํฉํ์ง ์์ต๋๋ค. ๋ค์ ์น์ ์ ์ด์ ๋ํ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
iOS์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ํน์ฑ
2018๋
WWDC์์ ๋ฉ์ง ๋ณด๊ณ ๊ฐ ์์์ต๋๋ค.
ํด๋ฆฐ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์์ ์์ ํ๊ฒ ๊ต์ฒดํ ์ ์๋ ํ์ด์ง ๋ชจ์์
๋๋ค. ํฌํจ๋ ๋ฐ์ดํฐ๋ ํ์์ ๋ฐ๋ผ ์๋ ์์ค์์ ๋ค์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ฝ๊ธฐ ์ ์ฉ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ผ์ด ์ด ๋ฒ์ฃผ์ ์ํฉ๋๋ค. iOS๋ ํ์ผ์ ๋งคํ๋ ํ์ด์ง๊ฐ ๋์คํฌ์ ํ์ผ๊ณผ ๋๊ธฐํ๋๋๋ก ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ ์ง ๋ฉ๋ชจ๋ฆฌ์์ ํ์ผ์ ๋งคํ๋ ํ์ด์ง๋ฅผ ์ธ๋ก๋ํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ์์ต๋๋ค.
รข โฌ <
์์ ๋ ๋ชจ๋ ํ์ด์ง๋ ์๋ ์์น์ ์๊ด์์ด ๋ํฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๋๋ค. ํนํ ์ด์ ๊ด๋ จ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋กํ์ฌ ์์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค. ํ๋๊ทธ๋ก LMDB ์ด๊ธฐ MDB_WRITEMAP
, ๋ณ๊ฒฝ ํ ์ง์ ํ์ธํ ์ ์์ต๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ์ฐจ์งํ๊ธฐ ์์ํ๋ฉด iOS๋ ๋ํฐ ํ์ด์ง๋ฅผ ์์ถํฉ๋๋ค. ๋ํฐ ๋ฐ ์์ถ ํ์ด์ง๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ชจ์์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค. ํน์ ์๊ณ๊ฐ์ ๋๋ฌํ๋ฉด OOM ํฌ๋ฌ ์์คํ ๋ฐ๋ชฌ์ด ํ๋ก์ธ์ค ๋ค์ ์์ ๊ฐ์ ์ข ๋ฃํฉ๋๋ค. ์ด๊ฒ์ ๋ฐ์คํฌํฑ ์ด์ ์ฒด์ ์ ๋น๊ตํ์ฌ iOS์ ํน์ง์ ๋๋ค. ๋ฐ๋ฉด ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋์คํฌ๋ก ํ์ด์ง๋ฅผ ๊ตํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๊ธฐ๋ฅ์ iOS์์ ์ ๊ณต๋์ง ์์ผ๋ฉฐ ๊ทธ ์ด์ ๋ฅผ ์ถ์ธกํ ์ ์์ ๋ฟ์ ๋๋ค. ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ์ง์ค์ ์ผ๋ก ์ด๋ํ๋ ์ ์ฐจ๊ฐ ๋ชจ๋ฐ์ผ ์ฅ์น์ ๋๋ฌด ๋ง์ ์๋์ง๋ฅผ ์๋นํ๊ฑฐ๋ iOS๊ฐ SSD ๋๋ผ์ด๋ธ์ ์ ์ ๋ค์ ์ฐ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๊ฑฐ๋ ์ค๊ณ์๊ฐ ์์คํ ์ ์ ์ฒด ์ฑ๋ฅ์ ๋ง์กฑํ์ง ์์์ ์ ์์ต๋๋ค. ๋์์์ด ๊ตํํ์ต๋๋ค. ์ฌ์ค์ ๋จ์ ์์ต๋๋ค.
์์ ์ธ๊ธํ ์ข์ ์์์ LMDB๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก mmap ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ ๋ฐ์ดํธํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ ๋๋ง๋ ๋ฐ์ดํฐ๋ iOS์์ ํด๋ฆฐ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ๋ฅ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ธฐ์ฌํ์ง ์์ต๋๋ค. ์ด๋ VM Tracker๋ผ๋ Xcode ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค. ์๋ ์คํฌ๋ฆฐ์ท์ ์๋ ์ค iOS Cloud ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฒ์์๋ 2๊ฐ์ LMDB ์ธ์คํด์ค๊ฐ ์ด๊ธฐํ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ํ์ผ์ 1GiB์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ ์ ์์๊ณ ๋ ๋ฒ์งธ๋ 512MiB์์ต๋๋ค. ๋ ์คํ ๋ฆฌ์ง ๋ชจ๋ ์ผ์ ๋์ ์์ฃผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ์ง๋ง ์ด๋ ์ชฝ๋ ๋ํฐ ํฌ๊ธฐ์ ๊ธฐ์ฌํ์ง ์์ต๋๋ค.
์ด์ ๋์ ์์์ ์ ํ ์๊ฐ์
๋๋ค. 64๋นํธ ๋ฐ์คํฌํฑ ์ด์ ์ฒด์ ์ ์ค์ ๋ฉ์ปค๋์ฆ ๋๋ถ์ ๊ฐ ํ๋ก์ธ์ค๋ ์ ์ฌ์ ์ธ ์ค์์ ํ์ฉํ๋ ํ๋ ๋์คํฌ์ ์ฌ์ ๊ณต๊ฐ๋งํผ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ์ฐจ์งํ ์ ์์ต๋๋ค. iOS์์ ์ค์์ ์์ถ์ผ๋ก ๋์ฒดํ๋ฉด ์ด๋ก ์ ์ต๋๊ฐ์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค. ์ด์ ๋ชจ๋ ํ์ฑ ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ(์ฝ๊ธฐ RAM) ๋ฉ๋ชจ๋ฆฌ์ ๋ง์์ผ ํ๋ฉฐ ๋ง์ง ์๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ ๊ฐ์ ์ข
๋ฃ๋ฉ๋๋ค. ์์ ๊ฐ์ด ๊ธฐ์ฌ๋์ด ์์ต๋๋ค
ํด๋ผ์ฐ๋์์์ ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ LMDB์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ํํ ๊ฐ์ 384๋นํธ ์ฅ์น์ ๊ฒฝ์ฐ 32MB, 768๋นํธ ์ฅ์น์ ๊ฒฝ์ฐ 64MB์
๋๋ค. ์ด ๋ณผ๋ฅจ์ด ๋ชจ๋ ์ฌ์ฉ๋ ํ ๋ชจ๋ ์์ ์์
์ ์ฝ๋๋ก ์๋ฃ๋๊ธฐ ์์ํฉ๋๋ค. MDB_MAP_FULL
. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ๋ชจ๋ํฐ๋ง์์ ๊ด์ฐฐํ์ง๋ง ํ ๋จ๊ณ์์ ๋ฌด์ํ ์ ์์ ๋งํผ ์์ต๋๋ค.
์ ์ฅ์์์ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ช ํํ์ง ์์ ์ด์ ๋ ์๋ช ์ด ๊ธด ํธ๋์ญ์ ์ผ ์ ์์ต๋๋ค. ์ด ๋ ํ์์ด ์ด๋ป๊ฒ ๊ด๋ จ๋์ด ์๋์ง ์ดํดํ๋ ค๋ฉด ๋๋จธ์ง ๋ LMDB ๊ณ ๋๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
3.2. ๊ณ ๋ #2. B+-ํธ๋ฆฌ
ํค-๊ฐ ์ ์ฅ์ ์์ ์๋ ํ ์ด๋ธ์ ์๋ฎฌ๋ ์ดํธํ๋ ค๋ฉด API์ ๋ค์ ์์ ์ด ์์ด์ผ ํฉ๋๋ค.
- ์ ์์๋ฅผ ์ฝ์ ํฉ๋๋ค.
- ์ฃผ์ด์ง ํค๋ก ์์๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ์์ ์ญ์ .
- ์ ๋ ฌ ์์์ ๋ฐ๋ผ ํค ๊ฐ๊ฒฉ์ ๋ฐ๋ณตํฉ๋๋ค.
๋ค ๊ฐ์ง ์์ ์ ๋ชจ๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ๋๋ค. ๊ฐ ๋ ธ๋๋ ์์ ํค์ ์ ์ฒด ํ์ ์งํฉ์ ๋ ๊ฐ์ ํ์ ํธ๋ฆฌ๋ก ๋๋๋ ํค์ ๋๋ค. ์ผ์ชฝ์๋ ๋ถ๋ชจ๋ณด๋ค ์์ ๊ฒ์ด ์๊ณ ์ค๋ฅธ์ชฝ์๋ ํฐ ๊ฒ์ด ์์ต๋๋ค. ์ ๋ ฌ๋ ํค ์งํฉ์ ์ป๋ ๊ฒ์ ๊ณ ์ ์ ์ธ ํธ๋ฆฌ ์ํ ์ค ํ๋๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
์ด์ง ํธ๋ฆฌ์๋ ๋์คํฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ํจ๊ณผ์ ์ด์ง ๋ชปํ๊ฒ ํ๋ ๋ ๊ฐ์ง ๊ทผ๋ณธ์ ์ธ ๋จ์ ์ด ์์ต๋๋ค. ์ฒซ์งธ, ๊ท ํ์ ์ ๋๋ฅผ ์์ธกํ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ๊ฐ์ง์ ๋์ด๊ฐ ํฌ๊ฒ ๋ค๋ฅผ ์ ์๋ ํธ๋ฆฌ๋ฅผ ์ป์ ์๋นํ ์ํ์ด ์์ผ๋ฉฐ, ์ด๋ ์์๋ณด๋ค ๊ฒ์์ ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก์ฑ์ ํฌ๊ฒ ์
ํ์ํต๋๋ค. ๋์งธ, ๋
ธ๋ ์ฌ์ด์ ํ๋ถํ ๊ต์ฐจ ๋งํฌ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ด์ง ํธ๋ฆฌ์ ์์น๋ฅผ โโ๋ฐํํฉ๋๋ค.๊ฐ๊น์ด ๋
ธ๋(๋ ์ฌ์ด์ ๋งํฌ ์ธก๋ฉด์์)๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ๋ค๋ฅธ ํ์ด์ง์ ์์นํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํธ๋ฆฌ์์ ์ฌ๋ฌ ์ธ์ ๋
ธ๋๋ฅผ ๋จ์ ์ํํ๋ ๊ฒฝ์ฐ์๋ ๋น์ทํ ์์ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํด์ผ ํ ์ ์์ต๋๋ค. ํ๋ก์ธ์ ์บ์์์ ์ง์์ ์ผ๋ก ํ์ด์ง๋ฅผ ํ์ ์ํค๋ ๊ฒ์ด ์ ๋ ดํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก์ ์ด์ง ํธ๋ฆฌ์ ํจ์จ์ฑ์ ๋ํด ์ด์ผ๊ธฐํ ๋๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๋์คํฌ์์ ๋
ธ๋ ๊ด๋ จ ํ์ด์ง๋ฅผ ์์ฃผ ์ฌ๋ฆฌ๋ฉด ์ํฉ์ด ์ ๋ง ๋๋น ์ง๋๋ค.
์ด์ง ํธ๋ฆฌ์ ์งํ์ธ B-ํธ๋ฆฌ๋ ์ด์ ๋จ๋ฝ์์ ์๋ณ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ฒซ์งธ, ๊ทธ๋ค์ ์๊ธฐ ๊ท ํ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. ๋์งธ, ๊ฐ ๋ ธ๋๋ ํ์ ํค ์งํฉ์ 2๊ฐ ์๋๋ผ M ์์์ ํ์ ์งํฉ์ผ๋ก ๋ถํ ํ๊ณ M์ ์๋ ์๋ฐฑ ๋๋ ์์ฒ ์ ๋๋ก ์๋นํ ํด ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ํ์ฌ:
- ๊ฐ ๋ ธ๋์๋ ์ด๋ฏธ ์ ๋ ฌ๋ ํค๊ฐ ๋ง๊ณ ํธ๋ฆฌ๊ฐ ๋งค์ฐ ๋ฎ์ต๋๋ค.
- ํธ๋ฆฌ๋ ๊ฐ์ด ๊ฐ๊น์ด ํค๊ฐ ํ๋ ๋๋ ์ธ์ ํ ๋ ธ๋์์ ์์ฐ์ค๋ฝ๊ฒ ์๋ก ์์ ์์นํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ญ์ฑ ์์ฑ์ ์ป์ต๋๋ค.
- ๊ฒ์ ์์ ์ค ํธ๋ฆฌ๋ฅผ ๋ด๋ ค๊ฐ ๋ ํต๊ณผ ๋ ธ๋ ์๋ฅผ ์ค์ ๋๋ค.
- ๊ฐ ๋ ธ๋์๋ ์ด๋ฏธ ๋ง์ ์์ ์ ๋ ฌ๋ ํค๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ฒ์ ์ฟผ๋ฆฌ์ ๋ํ ๋์ ๋ ธ๋ ์ฝ๊ธฐ ์๋ฅผ ์ค์ ๋๋ค.
LMDB๋ B+ ํธ๋ฆฌ๋ผ๊ณ ํ๋ B-ํธ๋ฆฌ์ ๋ณํ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์์ ๋ค์ด์ด๊ทธ๋จ์ ์ฌ๊ธฐ์ ํฌํจ๋ ์ธ ๊ฐ์ง ์ ํ์ ๋ ธ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ๋งจ ์์๋ ๋ฃจํธ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ์ฅ์ ๋ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๋ ์ด์์ ๊ตฌ์ฒดํํ์ง ์์ต๋๋ค. ๋จ์ผ LMDB ์ธ์คํด์ค ๋ด์์ ๋งคํ๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ค ๊ฐ๊ฐ์ ์์ ์ ๋ฟ๋ฆฌ์์ ์์ํฉ๋๋ค.
- ๊ฐ์ฅ ๋ฎ์ ์์ค์๋ ์(์)์ด ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํค-๊ฐ ์์ ํฌํจํ๋ ๊ฒ์ ๋ฐ๋ก ๊ทธ๋ค์ ๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด๊ฒ์ด B+-ํธ๋ฆฌ์ ํน์ง์ ๋๋ค. ์ผ๋ฐ B-ํธ๋ฆฌ๊ฐ ๋ชจ๋ ์์ค์ ๋ ธ๋์ ๊ฐ ๋ถ๋ถ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ B+-๋ณํ์ ๊ฐ์ฅ ๋ฎ์ ๋ ธ๋์๋ง ์์ต๋๋ค. ์ด ์ฌ์ค์ ์์ ํ ๋ค์์๋ LMDB์์ ์ฌ์ฉ๋๋ ํธ๋ฆฌ์ ํ์ ์ ํ์ ๋จ์ํ B-ํธ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ ๋๋ค.
- ๋ฃจํธ์ ๋ฆฌํ ์ฌ์ด์๋ ํ์(๋ถ๊ธฐ) ๋ ธ๋๊ฐ ์๋ 0๊ฐ ์ด์์ ๊ธฐ์ ์์ค์ด ์์ต๋๋ค. ๊ทธ๋ค์ ์๋ฌด๋ ๋ฆฌํ ์ฌ์ด์ ์ ๋ ฌ๋ ํค ์ธํธ๋ฅผ ๋๋๋ ๊ฒ์ ๋๋ค.
๋ฌผ๋ฆฌ์ ์ผ๋ก ๋
ธ๋๋ ๋ฏธ๋ฆฌ ๊ฒฐ์ ๋ ๊ธธ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์
๋๋ค. ํฌ๊ธฐ๋ ์์์ ์ธ๊ธํ ์ด์ ์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ํฌ๊ธฐ์ ๋ฐฐ์์
๋๋ค. ๋
ธ๋ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค. ํค๋์๋ ๋ฉํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์๋ฅผ ๋ค์ด ์ฒดํฌ์ฌ์ด ๊ฐ์ฅ ํ์คํ ์ ๋ณด์
๋๋ค. ๋ค์์ ๋ฐ์ดํฐ๊ฐ ์๋ ์
์ด ์๋ ์คํ์
์ ๋ํ ์ ๋ณด์
๋๋ค. ๋ฐ์ดํฐ์ ์ญํ ์ ํ์ ๋
ธ๋์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒฝ์ฐ ํค์ด๊ฑฐ๋ ์์ ๊ฒฝ์ฐ ์ ์ฒด ํค-๊ฐ ์์ผ ์ ์์ต๋๋ค. ์์
์์ ํ์ด์ง ๊ตฌ์กฐ์ ๋ํด ์์ธํ ์ฝ์ ์ ์์ต๋๋ค.
ํ์ด์ง ๋ ธ๋์ ๋ด๋ถ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ์ผ๋ฏ๋ก ๋ค์ ํ์์ผ๋ก ๋จ์ํ๋ ๋ฐฉ์์ผ๋ก LMDB B-ํธ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ๋ํ๋ ๋๋ค.
๋ ธ๋๊ฐ ์๋ ํ์ด์ง๋ ๋์คํฌ์ ์์ฐจ์ ์ผ๋ก ๋ฐฐ์ด๋ฉ๋๋ค. ๋ฒํธ๊ฐ ๋์ ํ์ด์ง๋ ํ์ผ์ ๋ ๋ถ๋ถ์ ์์นํฉ๋๋ค. ์์ ๋ฉํ ํ์ด์ง(meta page)๋ ๋ชจ๋ ํธ๋ฆฌ์ ๋ฃจํธ๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์คํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ํ์ผ์ด ์ด๋ฆฌ๋ฉด LMDB๋ ์ ํจํ ๋ฉํ ํ์ด์ง๋ฅผ ์ฐพ๊ธฐ ์ํด ํ์ผ์ ํ์ด์ง ๋จ์๋ก ๋์์ ์ฒ์๊น์ง ์ค์บํ๊ณ ์ด๋ฅผ ํตํด ๊ธฐ์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐพ์ต๋๋ค.
์ด์ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ๋ ผ๋ฆฌ์ ๋ฐ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ์ ๋ํ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ LMDB์ ์ธ ๋ฒ์งธ ๊ณ ๋๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ๋ชจ๋ ์คํ ๋ฆฌ์ง ์์ ์ด ํธ๋์ญ์ ๋ฐฉ์์ผ๋ก ์๋ก ๊ฒฉ๋ฆฌ๋์ด ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ๋ค์ค ๋ฒ์ ์์ฑ์ ๋ถ์ฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3.3. ๊ณ ๋ #3. ๊ธฐ๋ก ์ค ๋ณต์ฌ
์ผ๋ถ B-ํธ๋ฆฌ ์์ ์๋ ํด๋น ๋ ธ๋์ ๋ํ ์ ์ฒด ์ผ๋ จ์ ๋ณ๊ฒฝ ์์ ์ด ํฌํจ๋ฉ๋๋ค. ํ ๊ฐ์ง ์๋ ์ด๋ฏธ ์ต๋ ์ฉ๋์ ๋๋ฌํ ๋ ธ๋์ ์ ํค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋จผ์ ๋ ธ๋๋ฅผ ๋๋ก ๋ถํ ํ๊ณ ๋ ๋ฒ์งธ๋ก ๋ถ๋ฆฌ๋ ์ ์์ ๋ ธ๋์ ๋ํ ๋งํฌ๋ฅผ ๋ถ๋ชจ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด ์ ์ฐจ๋ ์ ์ฌ์ ์ผ๋ก ๋งค์ฐ ์ํํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก(์ถฉ๋, ์ ์ ๋ฑ) ์๋ฆฌ์ฆ์ ๋ณ๊ฒฝ ์ฌํญ ์ค ์ผ๋ถ๋ง ๋ฐ์ํ๋ฉด ํธ๋ฆฌ๊ฐ ์ผ๊ด์ฑ ์๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ด๊ฒฐํจ์ฑ์ผ๋ก ๋ง๋๋ ํ ๊ฐ์ง ๊ธฐ์กด ์๋ฃจ์ ์ ์ถ๊ฐ ๋์คํฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ ํธ๋์ญ์ ๋ก๊ทธ(WAL(Write-Ahead Log)๋ผ๊ณ ๋ ํจ)๋ฅผ B-ํธ๋ฆฌ ์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. B-ํธ๋ฆฌ ์์ฒด๋ฅผ ์์ ํ๊ธฐ ์ ์ ์๋ํ ์์ ์ด ๊ธฐ๋ก๋๋ ํ์ผ์ ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ ์ง๋จ ์ค์ ๋ฐ์ดํฐ ์์์ด ๊ฐ์ง๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์ค๋ก ์ ๋ฆฌํฉ๋๋ค.
LMDB๋ ๋ด๊ฒฐํจ์ฑ ๋ฉ์ปค๋์ฆ์ผ๋ก copy-on-write๋ผ๊ณ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํํ์ต๋๋ค. ๊ทธ ๋ณธ์ง์ ๊ธฐ์กด ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋์ ๋จผ์ ์ ์ฒด๋ฅผ ๋ณต์ฌํ๊ณ ์ฌ๋ณธ์์ ์ด๋ฏธ ๋ชจ๋ ์์ ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ ค๋ฉด ๊ด๋ จํ์ฌ ์์ ๋ ธ๋์์ ์ต์ ์ด ๋ ๋ ธ๋๋ก์ ๋งํฌ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํ ์์ ๋ ํ์ํ๋ฏ๋ก ๋ฏธ๋ฆฌ ๋ณต์ฌํด๋๋ค. ํ๋ก์ธ์ค๋ ๋ฃจํธ๊น์ง ์ฌ๊ท์ ์ผ๋ก ๊ณ์๋ฉ๋๋ค. ๋ฉํ ํ์ด์ง์ ๋ฐ์ดํฐ๋ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
์ ๋ฐ์ดํธ ์ ์ฐจ ์ค์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์๊ธฐ ์ถฉ๋ํ๋ฉด ์ ๋ฉํ ํ์ด์ง๊ฐ ์์ฑ๋์ง ์๊ฑฐ๋ ๋๋ ๋๊น์ง ๋์คํฌ์ ๊ธฐ๋ก๋์ง ์๊ณ ์ฒดํฌ์ฌ์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ด ๋ ๊ฒฝ์ฐ ์ค ํ๋์์ ์ ํ์ด์ง์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด์ ํ์ด์ง๋ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด LMDB๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฏธ๋ฆฌ ๋ก๊ทธ๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์ฌ์ค์ ์์์ ์ค๋ช ํ ๋์คํฌ์ ๋ฐ์ดํฐ ์ ์ฅ ๊ตฌ์กฐ๋ ๋์์ ๊ทธ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค. ๋ช ์์ ์ธ ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ์๋ ๊ฒ์ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์๋๋ฅผ ์ ๊ณตํ๋ LMDB์ ํน์ง ์ค ํ๋์ ๋๋ค.
์ถ๊ฐ ์ ์ฉ B-ํธ๋ฆฌ๋ผ๊ณ ํ๋ ๊ฒฐ๊ณผ ๊ตฌ์กฐ๋ ์์ฐ์ค๋ฝ๊ฒ ํธ๋์ญ์
๊ฒฉ๋ฆฌ ๋ฐ ๋ค์ค ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. LMDB์์ ์ด๋ ค ์๋ ๊ฐ ํธ๋์ญ์
์๋ ์ฐ๊ฒฐ๋ ์ต์ ํธ๋ฆฌ ๋ฃจํธ๊ฐ ์์ต๋๋ค. ํธ๋์ญ์
์ด ์๋ฃ๋์ง ์๋ ํ ํธ๋์ญ์
๊ณผ ๊ด๋ จ๋ ํธ๋ฆฌ์ ํ์ด์ง๋ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์๋ก์ด ๋ฒ์ ์ ๋ฐ์ดํฐ๋ก ์ฌ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก ํด๋น ์์ ์ ๊ด๋ จ๋์๋ ๋ฐ์ดํฐ ์ธํธ๋ก ์ ํํ ์ํ๋ ๋งํผ ์์
ํ ์ ์์ต๋๋ค. ์ด ์์ ์์ ์ ์ฅ์๊ฐ ๊ณ์ํด์ ํ๋ฐํ๊ฒ ์
๋ฐ์ดํธ๋๋๋ผ๋ ํธ๋์ญ์
์ด ์ด๋ฆฐ ์๊ฐ์
๋๋ค. ์ด๊ฒ์ด ๋ฉํฐ๋ฒ์ ๋์ ํต์ฌ์ด๋ฉฐ, LMDB๋ฅผ ์ฐ๋ฆฌ ์ฌ๋ํ๋ ์ฌ๋์๊ฒ ์ด์์ ์ธ ๋ฐ์ดํฐ ์์ค๋ก ๋ง๋ญ๋๋ค. UICollectionView
. ํธ๋์ญ์
์ ์ด๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ฆด ํ์๊ฐ ์์ผ๋ฉฐ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ตฌ์กฐ๋ก ๊ธํ ํํํ์ฌ ์๋ฌด๊ฒ๋ ๋จ๊ธฐ์ง ์์๊น ๋๋ ค์ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์์ ํ ๊ฒฉ๋ฆฌ๋ฅผ ์๋ํ ์ ์๋ ๋์ผํ SQLite์ LMDB๋ฅผ ๊ตฌ๋ณํฉ๋๋ค. ํ์์์ ๋ ๊ฐ์ ํธ๋์ญ์
์ ์ด๊ณ ๊ทธ ์ค ํ๋์์ ํน์ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ฉด ๋ ๋ฒ์งธ ๋๋จธ์ง ํธ๋์ญ์
์์ ๋์ผํ ๋ ์ฝ๋๋ฅผ ๋ ์ด์ ์ป์ ์ ์์ต๋๋ค.
๋์ ์ ์ด๋ฉด์๋ ์ ์ฌ์ ์ผ๋ก ํจ์ฌ ๋ ๋ง์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์์ต๋๋ค. ์ฌ๋ผ์ด๋๋ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณด๊ณ ์๋ 3๊ฐ์ ์ด๋ฆฐ ์ฝ๊ธฐ ํธ๋์ญ์ ๊ณผ ๋์์ ์์ ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๊ฐ ์ด๋ค ๋ชจ์ต์ธ์ง ๋ณด์ฌ์ค๋๋ค. LMDB๋ ์ค์ ํธ๋์ญ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ฃจํธ์์ ๋๋ฌ ๊ฐ๋ฅํ ๋ ธ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์คํ ๋ฆฌ์ง๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ ๋ค๋ฅธ ๋ค ๋ฒ์งธ ๋ฃจํธ๋ฅผ ํ ๋นํ๊ณ ๊ทธ ์๋์ ์์ ๋ ํ์ด์ง๋ฅผ ๋ค์ ํ ๋ฒ ๋ณต์ ํ ์๋ฐ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ผ์ ๋ํ ์น์ ์ ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ถํ์ํ ์ผ์ด ์๋๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ถ๊ฐ ์๋น๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ธฐ์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ฅผ ํฌ๊ฒ ๊ดด๋กญํ์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์์ iOS๋ ํ ๋น์ ๋งค์ฐ ์ธ์ํ๋ฉฐ ์๋ฒ ๋๋ ๋ฐ์คํฌํฑ์์ 1ํ ๋ผ๋ฐ์ดํธ LMDB ์์ญ์ ๋ง์คํฐ์ ์ด๊นจ์์ ์ ๊ณตํ ์ ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ ๋ํด ์ ํ ์๊ฐํ์ง ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ํธ๋์ญ์ ์๋ช ์ ๊ฐ๋ฅํ ํ ์งง๊ฒ ์ ์งํด์ผ ํฉ๋๋ค.
4. ํค-๊ฐ API ์์ ๋ฐ์ดํฐ ์คํค๋ง ์ค๊ณ
LMDB์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ถ์ํ(ํ๊ฒฝ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํค ๋ฐ ๊ฐ, ํธ๋์ญ์ ๋ฐ ์ปค์)๋ฅผ ์ดํด๋ด์ผ๋ก์จ API ๊ตฌ๋ฌธ ๋ถ์์ ์์ํ๊ฒ ์ต๋๋ค.
์ฝ๋ ๋ชฉ๋ก์ ๋ํ ์ฐธ๊ณ ์ฌํญ
LMDB ๊ณต๊ฐ API์ ๋ชจ๋ ํจ์๋ ์์
๊ฒฐ๊ณผ๋ฅผ ์ค๋ฅ ์ฝ๋ ํํ๋ก ๋ฐํํ์ง๋ง ์ดํ์ ๋ชจ๋ ๋ชฉ๋ก์์๋ ๊ฐ๊ฒฐํจ์ ์ํด ํ์ธ์ ์๋ตํ์ต๋๋ค.์ค์ ๋ก ์ฐ๋ฆฌ๋ ์์ฒด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์ ์ํธ ์์ฉํ์ต๋๋ค.
LMDB๋ฅผ iOS ๋๋ macOS ํ๋ก์ ํธ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก CocoaPod๋ฅผ ์ ๊ณตํฉ๋๋ค.
4.1. ๊ธฐ๋ณธ ์ถ์ํ
ํ๊ฒฝ
๊ตฌ์กฐ MDB_env
is๋ LMDB ๋ด๋ถ ์ํ์ ์ ์ฅ์์
๋๋ค. ์ ๋์ฌ ํจ์ ์ ํ๊ตฐ mdb_env
์ผ๋ถ ์์ฑ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ ์์ง ์ด๊ธฐํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mdb_env_create(env);โ
mdb_env_set_map_size(*env, 1024 * 1024 * 512)โ
mdb_env_open(*env, path.UTF8String, MDB_NOTLS, 0664);
Mail.ru Cloud ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ๋ํด์๋ง ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ์คํ ๋ฆฌ์ง ํ์ผ์ด ๋งคํ๋๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ํฌ๊ธฐ์
๋๋ค. ๋ถํํ๊ฒ๋ ๋์ผํ ์ฅ์น์์๋ ํน์ ๊ฐ์ ์คํ๋ง๋ค ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ต๋๋ค. iOS์ ์ด ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ฌ ์ต๋ ์คํ ๋ฆฌ์ง ์ฉ๋์ ๋์ ์ผ๋ก ์ ํํฉ๋๋ค. ํน์ ๊ฐ์์ ์์ํ์ฌ ํจ์๊ฐ ๋ ๋๊น์ง ์ฐ์์ ์ผ๋ก ๋ฐ๊ฐํฉ๋๋ค. mdb_env_open
์ด์ธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค ENOMEM
. ์ด๋ก ์ ์ผ๋ก๋ ๋ฐ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋จผ์ ์์ง์ ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ค์ ์ค๋ฅ๊ฐ ์์ ๋๋ฉด MDB_MAP_FULL
, ๋๋ฆฌ์ญ์์ค. ๊ทธ๋ฌ๋ ํจ์ฌ ๋ ๊ฐ์์ ์
๋๋ค. ๊ทธ ์ด์ ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ๋งคํํ๋ ์ ์ฐจ๊ฐ mdb_env_set_map_size
์ด์ ์ ์์ง์์ ๋ฐ์ ๋ชจ๋ ์ํฐํฐ(์ปค์, ํธ๋์ญ์
, ํค ๋ฐ ๊ฐ)๋ฅผ ๋ฌดํจํํฉ๋๋ค. ์ฝ๋์์ ์ด๋ฌํ ์ฌ๊ฑด์ ์ ํ์ ์ค๋ช
ํ๋ฉด ์๋นํ ๋ณต์ก์ฑ์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋งค์ฐ ์์คํ๋ค๋ฉด ์ด๊ฒ์ด ํจ์ฌ ์์๊ฐ๋ ํฌํฌ๋ฅผ ์ดํด๋ด์ผ ํ ์ด์ ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ๊ฐ์ด ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ์ค๋ ๋ ์์ ์ ๋ณด์ฅํ๋ ๋ฉ์ปค๋์ฆ์ ๊ท์ ํฉ๋๋ค. ๋ถํํ๋ ์ ์ด๋ iOS 10์์๋ ์ค๋ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ง์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์์ ์์์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ ํ๋๊ทธ์ ํจ๊ป ์ด๋ฆฝ๋๋ค. MDB_NOTLS
. ๋ํ, ๊ทธ๊ฒ์ ๋ํ ์๊ตฌ
๋ฐ์ดํฐ ๋ฒ ์ด์ค
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์์ ์ธ๊ธํ B-ํธ๋ฆฌ์ ๋ณ๋ ์ธ์คํด์ค์ ๋๋ค. ์ฒ์์๋ ์ฝ๊ฐ ์ด์ํ๊ฒ ๋ณด์ผ ์ ์๋ ํธ๋์ญ์ ๋ด๋ถ์์ ์ด๋ฆผ์ด ๋ฐ์ํฉ๋๋ค.
MDB_txn *txn;โ
MDB_dbi dbi;โ
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);โ
mdb_dbi_open(txn, NULL, MDB_CREATE, &dbi);โ
mdb_txn_abort(txn);
์ค์ ๋ก LMDB์ ํธ๋์ญ์ ์ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ์คํ ๋ฆฌ์ง ์ํฐํฐ์ ๋๋ค. ์ด ๊ฐ๋ ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์ํฐํฐ์ ๋ํด ์์์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ด๊ฒ์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํํ๋ก ํ ์ด๋ธ์ ๋ชจ๋ธ๋งํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ์ง๋ง ํ ๋ฒ์ ์๋์์ ์์ธํ ์ค๋ช ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ์ต๋๋ค.
ํค์ ๊ฐ
๊ตฌ์กฐ MDB_val
ํค์ ๊ฐ์ ๊ฐ๋
์ ๋ชจ๋ธ๋งํฉ๋๋ค. ์ ์ฅ์๋ ์๋ฏธ ์ฒด๊ณ์ ๋ํด ์ ํ ๋ชจ๋ฆ
๋๋ค. ๊ทธ๋
์๊ฒ ๋ค๋ฅธ ๊ฒ์ ์ฃผ์ด์ง ํฌ๊ธฐ์ ๋ฐ์ดํธ ๋ฐฐ์ด์ผ ๋ฟ์
๋๋ค. ์ต๋ ํค ํฌ๊ธฐ๋ 512๋ฐ์ดํธ์
๋๋ค.
typedef struct MDB_val {โ
size_t mv_size;โ
void *mv_data;โ
} MDB_val;โโ
์ ์ฅ์๋ ๋น๊ต๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ง ์์ผ๋ฉด ์ฌ์ ์ ์์๋ก ๋ฐ์ดํธ๋ณ๋ก ์ ๋ ฌํ๋ ๊ธฐ๋ณธ ํญ๋ชฉ์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ฑฐ๋
๊ฑฐ๋ ์ฅ์น๋ ์ ์์ธํ ์ค๋ช
๋์ด ์์ต๋๋ค.
- ๋ชจ๋ ๊ธฐ๋ณธ ์์ฑ ์ง์
ACID ํค์๋: ์์์ฑ, ์ผ๊ด์ฑ, ๊ฒฉ๋ฆฌ ๋ฐ ์ ๋ขฐ์ฑ. macOS ๋ฐ iOS์ ๋ด๊ตฌ์ฑ ์ธก๋ฉด์์ MDBX์์ ์์ ๋ ๋ฒ๊ทธ๊ฐ ์๋ค๋ ์ ์ ์ ์ํ์ง ์์ ์ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๋ค์์์ ๋ ์ฝ์ ์ ์์ต๋๋คREADME . - ๋ค์ค ์ค๋ ๋ฉ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ "๋จ์ผ ์์ฑ์/๋ค์ค ํ๋ ๊ธฐ" ๋ฐฉ์์ผ๋ก ์ค๋ช ๋ฉ๋๋ค. ์๊ฐ๋ ์๋ก๋ฅผ ์ฐจ๋จํ์ง๋ง ๋ ์๋ฅผ ์ฐจ๋จํ์ง๋ ์์ต๋๋ค. ๋ ์๋ ์๊ฐ๋ ์๋ก๋ฅผ ์ฐจ๋จํ์ง ์์ต๋๋ค.
- ์ค์ฒฉ ํธ๋์ญ์ ์ง์.
- ๋ค์ค ๋ฒ์ ์ง์.
LMDB์ ๋ฉํฐ๋ฒ์ ๋์ ๋งค์ฐ ํ๋ฅญํด์ ์ค์ ๋ก ์์ฐํ๊ณ ์ถ์ต๋๋ค. ์๋ ์ฝ๋๋ ๊ฐ ํธ๋์ญ์ ์ด ๋ชจ๋ ํ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก๋ถํฐ ์์ ํ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ์ด ๋ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ๊ณผ ์ ํํ ์๋ํจ์ ๋ณด์ฌ์ค๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ด๊ธฐํํ๊ณ ํ ์คํธ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ์ด๋ฌํ ์์์ ์คํฌ์ผ๋ฌ ์๋์ ์์ต๋๋ค.
ํ ์คํธ ํญ๋ชฉ ์ถ๊ฐ
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
mdb_env_create(&env);
mdb_env_open(env, "./testdb", MDB_NOTLS, 0664);
mdb_txn_begin(env, NULL, 0, &txn);
mdb_dbi_open(txn, NULL, 0, &dbi);
mdb_txn_abort(txn);
char k = 'k';
MDB_val key;
key.mv_size = sizeof(k);
key.mv_data = (void *)&k;
int v = 997;
MDB_val value;
value.mv_size = sizeof(v);
value.mv_data = (void *)&v;
mdb_txn_begin(env, NULL, 0, &txn);
mdb_put(txn, dbi, &key, &value, MDB_NOOVERWRITE);
mdb_txn_commit(txn);
MDB_txn *txn1, *txn2, *txn3;
MDB_val val;
// ะัะบััะฒะฐะตะผ 2 ััะฐะฝะทะฐะบัะธะธ, ะบะฐะถะดะฐั ะธะท ะบะพัะพััั
ัะผะพััะธั
// ะฝะฐ ะฒะตััะธั ะฑะฐะทั ะดะฐะฝะฝัั
ั ะพะดะฝะพะน ะทะฐะฟะธััั.
mdb_txn_begin(env, NULL, 0, &txn1); // read-write
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn2); // read-only
// ะ ัะฐะผะบะฐั
ะฟะตัะฒะพะน ััะฐะฝะทะฐะบัะธะธ ัะดะฐะปัะตะผ ะธะท ะฑะฐะทั ะดะฐะฝะฝัั
ัััะตััะฒััััั ะฒ ะฝะตะน ะทะฐะฟะธัั.
mdb_del(txn1, dbi, &key, NULL);
// ะคะธะบัะธััะตะผ ัะดะฐะปะตะฝะธะต.
mdb_txn_commit(txn1);
// ะัะบััะฒะฐะตะผ ััะตััั ััะฐะฝะทะฐะบัะธั, ะบะพัะพัะฐั ัะผะพััะธั ะฝะฐ
// ะฐะบััะฐะปัะฝัั ะฒะตััะธั ะฑะฐะทั ะดะฐะฝะฝัั
, ะณะดะต ะทะฐะฟะธัะธ ัะถะต ะฝะตั.
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn3);
// ะฃะฑะตะถะดะฐะตะผัั, ััะพ ะทะฐะฟะธัั ะฟะพ ะธัะบะพะผะพะผั ะบะปััั ัะถะต ะฝะต ัััะตััะฒัะตั.
assert(mdb_get(txn3, dbi, &key, &val) == MDB_NOTFOUND);
// ะะฐะฒะตััะฐะตะผ ััะฐะฝะทะฐะบัะธั.
mdb_txn_abort(txn3);
// ะฃะฑะตะถะดะฐะตะผัั, ััะพ ะฒ ัะฐะผะบะฐั
ะฒัะพัะพะน ััะฐะฝะทะฐะบัะธะธ, ะพัะบัััะพะน ะฝะฐ ะผะพะผะตะฝั
// ัััะตััะฒะพะฒะฐะฝะธั ะทะฐะฟะธัะธ ะฒ ะฑะฐะทะต ะดะฐะฝะฝัั
, ะตั ะฒัั ะตัั ะผะพะถะฝะพ ะฝะฐะนัะธ ะฟะพ ะบะปััั.
assert(mdb_get(txn2, dbi, &key, &val) == MDB_SUCCESS);
// ะัะพะฒะตััะตะผ, ััะพ ะฟะพ ะบะปััั ะฟะพะปััะตะฝ ะฝะต ะฐะฑั ะบะฐะบะพะน ะผััะพั, ะฐ ะฒะฐะปะธะดะฝัะต ะดะฐะฝะฝัะต.
assert(*(int *)val.mv_data == 997);
// ะะฐะฒะตััะฐะตะผ ััะฐะฝะทะฐะบัะธั, ัะฐะฑะพัะฐััะตะน ั
ะพัั ะธ ั ัััะฐัะตะฒัะตะน, ะฝะพ ะบะพะฝัะธััะตะฝัะฝะพะน ะฑะฐะทะพะน ะดะฐะฝะฝัั
.
mdb_txn_abort(txn2);
์ ํ์ ์ผ๋ก SQLite๋ก ๋์ผํ ํธ๋ฆญ์ ์๋ํ๊ณ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์ค ๋ฒ์ ๊ด๋ฆฌ๋ iOS ๊ฐ๋ฐ์์ ์ถ์ ๋งค์ฐ ์ข์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ด ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ ๊ณ ๋ ค ์ฌํญ์ ๋ฐ๋ผ ํ๋ฉด ์์์ ๋ํ ๋ฐ์ดํฐ ์์ค ์
๋ฐ์ดํธ ์๋๋ฅผ ์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์คํ
๋ฏธ๋์ด ๊ฐค๋ฌ๋ฆฌ์์ ์ฝํ
์ธ ๋ฅผ ์๋์ผ๋ก ๋ก๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ Mail.ru ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๊ฒฐ ์ํ๊ฐ ์ํธํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์ด๋น ์ฌ๋ฌ ์ฅ์ ์ฌ์ง์ ์๋ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ค์ด๋ก๋ํ ๋๋ง๋ค ์
๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ UICollectionView
์ฌ์ฉ์์ ํด๋ผ์ฐ๋์ ์๋ ๋ฏธ๋์ด ์ฝํ
์ธ ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ํ๋ก์ธ์ค ์ค์ ์ฝ 60fps์ ๋ถ๋๋ฌ์ด ์คํฌ๋กค์ ์์ ์ ์์ต๋๋ค. ๋น๋ฒํ ํ๋ฉด ์
๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์๋๋ฅผ ์ด๋ป๊ฒ๋ ์ ํํด์ผ ํฉ๋๋ค. UICollectionViewDataSource
.
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ค์ค ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ง์ํ์ง ์๊ณ ํ์ฌ ์ํ๋ก๋ง ์์ ํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ์๊ฐ์ด ์์ ์ ์ธ ๋ฐ์ดํฐ ์ค๋ ์ท์ ์์ฑํ๋ ค๋ฉด ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์์ ํ ์ด๋ธ์ ๋ณต์ฌํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋๋ ๋งค์ฐ ๋น์๋๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ์คํ ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ๋ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ๊ณผ ์ค๋ณต ORM ๋ณํ๊ณผ ๊ด๋ จ๋ ์๊ฐ ๋น์ฉ์ ๋ชจ๋ ์ป์ต๋๋ค. ์์ ํ ์ด๋ธ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ํจ์ฌ ๋ ๋น์ผ ์ฆ๊ฑฐ์์ด๋ฉฐ ์ฌ์ํ ๊ฒฝ์ฐ์๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ฉํฐ๋ฒ์ ๋ LMDB๋ ์์ ์ ์ธ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์งํ๋ ๋ฌธ์ ๋ฅผ ๋งค์ฐ ์ฐ์ํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํฉ๋๋ค. ํธ๋์ญ์ ๊ณผ ์ง์์ ์ฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค. ์๋ฃํ ๋๊น์ง ๋ฐ์ดํฐ ์ธํธ๋ ๊ณ ์ ๋์ด ์์ต๋๋ค. ์ ๋ฐ์ดํธ ์๋์ ๋ ผ๋ฆฌ๋ ์ด์ ์๋นํ ๋ฆฌ์์ค์ ์ค๋ฒํค๋ ์์ด ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ ์์ ์ ์ ์ผ๋ก ์์ต๋๋ค.
์ปค์
์ปค์๋ B-ํธ๋ฆฌ๋ฅผ ์ํํ์ฌ ํค-๊ฐ ์์ ๋ํ ์์๋๋ก ๋ฐ๋ณตํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ด ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
4.2. ํ ์ด๋ธ ๋ชจ๋ธ๋ง
ํค ์์ ์ง์ ์์ฑ์ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ์ถ์ํ ์์ ํ ์ด๋ธ๊ณผ ๊ฐ์ ์ต์์ ์ถ์ํ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ๋ชจ๋ ํ์ผ ๋ฐ ํด๋์ ๋ํ ์ ๋ณด๊ฐ ์บ์๋๋ ํด๋ผ์ฐ๋ ํด๋ผ์ด์ธํธ์ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์๋ก ๋ค์ด ์ด ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ ์ด๋ธ ์คํค๋ง
ํด๋ ํธ๋ฆฌ๊ฐ ์๋ ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ์ ๋ช
ํ๊ฒ ํด์ผ ํ๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค ์ค ํ๋๋ ์ง์ ๋ ๋๋ ํฐ๋ฆฌ ๋ด์ ์๋ ๋ชจ๋ ์์๋ฅผ โโ์ ํํ๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ ์ข
๋ฅ์ ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํ ์ข์ ๋ฐ์ดํฐ ๊ตฌ์ฑ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์์ ์ ๋ฐ๋ผ ํค๋ฅผ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋จผ์ ์์ ๋๋ ํฐ๋ฆฌ ์๋ณ์(๋นจ๊ฐ์)๊ฐ ์๋ ๋ฐ์ดํธ๊ฐ ๋ฐฐ์น๋๊ณ ๊ทธ ๋ค์ ์ ํ(๋ น์)์ด ์๋ ๋ฐ์ดํธ๊ฐ ๋ฐฐ์น๋๊ณ ์ด๋ฏธ ์ด๋ฆ(ํ๋์)์ด ์๋ ํ ์ผ์ ๋ฐฐ์น๋ฉ๋๋ค.๊ธฐ๋ณธ LMDB ๋น๊ต๊ธฐ์ ์ํด ์ฌ์ ์ ์์๋ก ์ ๋ ฌ๋๋ฏ๋ก ํ์ํ ๋ฐฉ๋ฒ. ๋์ผํ ๋นจ๊ฐ์ ์ ๋์ฌ๊ฐ ์๋ ํค๋ฅผ ์์ฐจ์ ์ผ๋ก ์ํํ๋ฉด ์ถ๊ฐ ์ฌํ ์ฒ๋ฆฌ ์์ด ์ฌ์ฉ์ ์ธํฐํ์ด์ค(์ค๋ฅธ์ชฝ)์ ํ์๋์ด์ผ ํ๋ ์์๋๋ก ํค์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
ํค์ ๊ฐ ์ง๋ ฌํ
์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ ์ธ์ ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ด ์์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒ์ ์ ํํ์ต๋๋ค - C ์ธ์ด ๊ตฌ์กฐ์ ์ธ์คํด์ค๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๋คํ. ๋ฐ๋ผ์ ๋๋ ํ ๋ฆฌ ์์์ ํค๋ ๋ค์ ๊ตฌ์กฐ๋ก ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค. NodeKey
.
typedef struct NodeKey {โ
EntityId parentId;โ
uint8_t type;โ
uint8_t nameBuffer[256];โ
} NodeKey;
์ ์ฅํ๋ ค๋ฉด NodeKey
๊ฐ์ฒด์ ์คํ ๋ฆฌ์ง ํ์ MDB_val
๊ตฌ์กฐ์ ์์ ์ฃผ์์ ์๋ ๋ฐ์ดํฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐฐ์นํ๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. sizeof
.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = sizeof(NodeKey),
.mv_data = (void *)key
};
}
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ ๊ธฐ์ค์ ๋ํ ์ฒซ ๋ฒ์งธ ์ฅ์์ ์ค์ํ ์ ํ ์์๋ก CRUD ์์
์ ์ผ๋ถ๋ก ๋์ ํ ๋น์ ์ต์ํํ๋ ๊ฒ์ ์ธ๊ธํ์ต๋๋ค. ๊ธฐ๋ฅ ์ฝ๋ serialize
LMDB์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ์ฝ๋๊ฐ ์ฝ์
๋ ๋ ์์ ํ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์๋ฒ์์ ๋ค์ด์ค๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋จผ์ ์คํ ๊ตฌ์กฐ๋ก ๋ณํ๋ ๋ค์ ์ ์ฅ์์ ๊ฐ๋จํ๊ฒ ๋คํ๋ฉ๋๋ค. LMDB ๋ด๋ถ์ ๋์ ํ ๋น๋ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ iOS ํ์ค์ ๋ฐ๋ผ ํ์์ ์ธ ์ํฉ์ ์ป์ ์ ์์ต๋๋ค. ์คํ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ์์ ๋์คํฌ๊น์ง ๋ฐ์ดํฐ ์์
์ ์ํํฉ๋๋ค!
์ด์ง ๋น๊ต๊ธฐ๋ก ํค ์ฃผ๋ฌธ
ํค ์์ ๊ด๊ณ๋ ๋น๊ต๊ธฐ๋ผ๋ ํน์ ๊ธฐ๋ฅ์ ์ํด ์ ๊ณต๋ฉ๋๋ค. ์์ง์ ํฌํจ๋ ๋ฐ์ดํธ์ ์๋ฏธ ์ฒด๊ณ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๋น๊ต๊ธฐ๋ ๋ฐ์ดํธ ๋จ์ ๋น๊ต์ ์์กดํ์ฌ ์ฌ์ ์ ์์๋ก ํค๋ฅผ ๋ฐฐ์ดํ ์๋ฐ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์ดํ๋ ๊ฒ์ ์กฐ๊ฐ ๋๋ผ๋ก ๋ฉด๋ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์์ ์๋์ ์ค๋ช ๋์ด ์์ง๋ง ์ฌ๊ธฐ์๋ ๊ธธ์ ๋ฐ๋ผ ํฉ์ด์ ธ ์๋ ๋ ๊ฐ์ ๊ฐํด์ ์ฃผ๋ชฉํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ๋จผ์ ์ผ๋์ ๋์ด์ผ ํ ๊ฒ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํ์ ๋ฉ๋ชจ๋ฆฌ ํํ์
๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ Apple ๊ธฐ๊ธฐ์์ ์ ์ ๋ณ์๋ ๋ค์ ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ฐ์ดํธ ๋น๊ต๊ธฐ์ ์ ํฉํ ํ์์ผ๋ก ์ ์๋ฅผ ํค์ ์ ์ฅํด์ผ ํฉ๋๋ค. ๊ฐ์กฑ์ ๊ธฐ๋ฅ์ ํ์ํ ๋ณํ์ ์ํํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค. hton*
(ํนํ htons
์์์ XNUMX๋ฐ์ดํธ ์ซ์์ ๊ฒฝ์ฐ).
ํ๋ก๊ทธ๋๋ฐ์์ ๋ฌธ์์ด์ ๋ํ๋ด๋ ํ์์ ์์๋ค์ํผ ์ ์ฒด
๋ ๋ฒ์งธ๋ก ์ ๋
ํด์ผ ํ ๊ฒ์ packed
.
์ธ๋ถ ๋น๊ต๊ธฐ์ ์ํ ํค ์์
ํค ๋น๊ต ๋ ผ๋ฆฌ๋ ์ด์ง ๋น๊ต๊ธฐ์ ๋นํด ๋๋ฌด ๋ณต์กํ ์ ์์ต๋๋ค. ๋ง์ ์ด์ ์ค ํ๋๋ ๊ตฌ์กฐ๋ฌผ ๋ด๋ถ์ ๊ธฐ์ ๋ถ์ผ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ํ ๋ฆฌ ์์์ ๋ํด ์ด๋ฏธ ์น์ํ ํค์ ์์์ ๋ฐ์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
typedef struct NodeKey {โ
EntityId parentId;โ
uint8_t type;โ
uint8_t nameBuffer[256];โ
} NodeKey;
๋ชจ๋ ๋จ์์ฑ์ ์ํด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํฉ๋๋ค. ์ ๋ชฉ ๋ฒํผ๋ 256๋ฐ์ดํธ์ด์ง๋ง ํ๊ท ์ ์ผ๋ก ํ์ผ ๋ฐ ํด๋ ์ด๋ฆ์ด 20-30์๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค.
๋ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ํ์ค ๊ธฐ์ ์ค ํ๋๋ ์ค์ ํฌ๊ธฐ์ ๋ง๊ฒ "์๋ผ๋ด๋" ๊ฒ์
๋๋ค. ๊ทธ ๋ณธ์ง์ ๋ชจ๋ ๊ฐ๋ณ ๊ธธ์ด ํ๋์ ๋ด์ฉ์ด ๊ตฌ์กฐ์ ๋์ ์๋ ๋ฒํผ์ ์ ์ฅ๋๊ณ ํด๋น ๊ธธ์ด๋ ๋ณ๋์ ๋ณ์์ ์ ์ฅ๋๋ค๋ ๊ฒ์
๋๋ค. NodeKey
์๋์ ๊ฐ์ด ๋ณํ๋ฉ๋๋ค.
typedef struct NodeKey {โ
EntityId parentId;โ
uint8_t type;โ
uint8_t nameLength;โ
uint8_t nameBuffer[256];โ
} NodeKey;
๋ํ ์ง๋ ฌํ ์์๋ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ต๋๋ค. sizeof
์ ์ฒด ๊ตฌ์กฐ์ด๋ฉฐ ๋ชจ๋ ํ๋์ ํฌ๊ธฐ๋ ๊ณ ์ ๊ธธ์ด์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ๋ฒํผ ๋ถ๋ถ์ ํฌ๊ธฐ๋ฅผ ๋ํ ๊ฐ์
๋๋ค.
MDB_val serialize(NodeKey * const key) {
return MDB_val {
.mv_size = offsetof(NodeKey, nameBuffer) + key->nameLength,
.mv_data = (void *)key
};
}
๋ฆฌํฉํ ๋ง ๊ฒฐ๊ณผ ํค๊ฐ ์ฐจ์งํ๋ ๊ณต๊ฐ์ ํฌ๊ฒ ์ ์ฝํ ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ ๋ถ์ผ๋ก ์ธํด nameLength
, ๊ธฐ๋ณธ ์ด์ง ๋น๊ต๊ธฐ๋ ๋ ์ด์ ํค ๋น๊ต์ ์ ํฉํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ ์์ ์ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ง ์๋๋ค๋ฉด, ์ด๋ฆ ์์ฒด๋ณด๋ค ์ด๋ฆ์ ๊ธธ์ด๊ฐ ์ ๋ ฌ์์ ๋ ์ฐ์ ์์๊ฐ ๋๋ ์์๊ฐ ๋ ๊ฒ์
๋๋ค.
LMDB๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ณ ์ ํ ํค ๋น๊ต ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค mdb_set_compare
๊ฐ๋ด ์ ์ ์๊ฒฉํ. ๋ถ๋ช
ํ ์ด์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ช
๊ธฐ๊ฐ ๋ด๋ด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์
๋ ฅ์์ ๋น๊ต๊ธฐ๋ ์ด์ง ํ์์ ๋ ํค๋ฅผ ์์ ํ๊ณ ์ถ๋ ฅ์์ โโ๋น๊ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค: ๋ณด๋ค ์์(-1), ๋ณด๋ค ํผ(1) ๋๋ ๊ฐ์(0). ์์ฌ ์ฝ๋ NodeKey
๊ทธ๋ ๊ฒ ๋ณด์ธ๋ค.
int compare(MDB_val * const a, MDB_val * const b) {โ
NodeKey * const aKey = (NodeKey * const)a->mv_data;โ
NodeKey * const bKey = (NodeKey * const)b->mv_data;โ
return // ...
}โ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํค๊ฐ ๋์ผํ ์ ํ์ธ ํ ๋ฌด์กฐ๊ฑด ๋ฐ์ดํธ ํํ์ ํค์ ์์ฉ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ ์ ํ์ผ๋ก ์บ์คํ ํ๋ ๊ฒ์ด ํฉ๋ฒ์ ์ ๋๋ค. ์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ๋์์ค๊ฐ ์์ง๋ง "๊ธฐ๋ก ์ฝ๊ธฐ" ํ์ ์น์ ์์ ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํฉ๋๋ค.
๊ฐ ์ง๋ ฌํ
์ ์ฅ๋ ๋ ์ฝ๋์ ํค๋ฅผ ์ฌ์ฉํ์ฌ LMDB๋ ๋งค์ฐ ์ง์ค์ ์ผ๋ก ์๋ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํ๋ ์์ํฌ ๋ด์์ ์๋ก ๋น๊ต๋๋ฉฐ ์ ์ฒด ์๋ฃจ์ ์ ์ฑ๋ฅ์ ๋น๊ต๊ธฐ์ ์๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด์์ ์ธ ์ธ๊ณ์์๋ ๊ธฐ๋ณธ ์ด์ง ๋น๊ต๊ธฐ๊ฐ ํค๋ฅผ ๋น๊ตํ๊ธฐ์ ์ถฉ๋ถํด์ผ ํ์ง๋ง ์ค์ ๋ก ์์ ์ ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ํค๋ฅผ ์ญ์ง๋ ฌํํ๋ ์ ์ฐจ๊ฐ ๊ฐ๋ฅํ ํ ๋นจ๋ผ์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ(๊ฐ)์ ํน๋ณํ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ฐ์ดํธ ํํ์์ ๊ฐ์ฒด๋ก์ ๋ณํ์ ์๋ฅผ ๋ค์ด ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ด๋ฏธ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ๋น๊ต์ ๋๋ฌผ๊ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด ์ ์ฐจ์ ์๋์ ๋ํ ์๊ตฌ ์ฌํญ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ผ๋ฉฐ ๊ตฌํ ์ ํธ์์ฑ์ ํจ์ฌ ๋ ์ค์ ์ ๋ ์ ์์ต๋๋ค ์๋ฅผ ๋ค์ด ์์ง ๋ค์ด๋ก๋๋์ง ์์ ํ์ผ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค. NSKeyedArchiver
.
NSData *data = serialize(object);โ
MDB_val value = {โ
.mv_size = data.length,โ
.mv_data = (void *)data.bytesโ
};
๊ทธ๋ฌ๋ ์ฑ๋ฅ์ด ์ค์ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ํด๋ผ์ฐ๋์ ํ์ผ ๊ตฌ์กฐ์ ๋ํ ๋ฉํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ ๋์ผํ ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ง๋ ฌํ๋ ํํ์ ์์ฑํ๋ ์์ ์ ํ์ด๋ผ์ดํธ๋ ๋๋ ํ ๋ฆฌ์ ์์๊ฐ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ชจ๋ธ๋ง๋๋ค๋ ์ฌ์ค์ ๋๋ค.
C ์ธ์ด๋ก ๊ตฌํํ๊ธฐ ์ํด ์์์ธ์ ํน์ ํ๋๋ ๋ณ๋์ ๊ตฌ์กฐ๋ก ๊ฐ์ ธ์ค๊ณ ๊ธฐ๋ณธ ํ๋์์ ์ฐ๊ฒฐ์ ๊ณต์ฉ์ฒด ์ ํ์ ํ๋๋ฅผ ํตํด ์ง์ ๋ฉ๋๋ค. ๊ณต์ฉ์ฒด์ ์ค์ ๋ด์ฉ์ ์ ํ ๊ธฐ์ ์์ฑ์ ํตํด ์ง์ ๋ฉ๋๋ค.
typedef struct NodeValue {โ
EntityId localId;โ
EntityType type;โ
union {โ
FileInfo file;โ
DirectoryInfo directory;โ
} info;โ
uint8_t nameLength;โ
uint8_t nameBuffer[256];โ
} NodeValue;โ
ํญ๋ชฉ ์ถ๊ฐ ๋ฐ ์ ๋ฐ์ดํธ
์ง๋ ฌํ๋ ํค์ ๊ฐ์ ์ ์ฅ์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ํจ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. mdb_put
.
// key ะธ value ะธะผะตัั ัะธะฟ MDB_valโ
mdb_put(..., &key, &value, MDB_NOOVERWRITE);
๊ตฌ์ฑ ๋จ๊ณ์์ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ๋์ผํ ํค๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ์ ์ฅํ๋๋ก ํ์ฉํ๊ฑฐ๋ ๊ธ์งํ ์ ์์ต๋๋ค. ํค ๋ณต์ ๊ฐ ๊ธ์ง๋ ๊ฒฝ์ฐ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ ๋ ์ด๋ฏธ ์กด์ฌํ๋ ๋ ์ฝ๋์ ์
๋ฐ์ดํธ ํ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ฝ๋ ์ค๋ฅ์ ๊ฒฐ๊ณผ๋ก๋ง ํด์ด์ง์ด ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ ํ๋๊ทธ๋ฅผ ์ง์ ํ์ฌ ๋ฐฉ์งํ ์ ์์ต๋๋ค. NOOVERWRITE
.
๊ธฐ๋ก ์ฝ๊ธฐ
LMDB์์ ๋ ์ฝ๋๋ฅผ ์ฝ๋ ๊ธฐ๋ฅ์ mdb_get
. ํค-๊ฐ ์์ด ์ด์ ์ ๋คํ๋ ๊ตฌ์กฐ๋ก ํ์๋๋ ๊ฒฝ์ฐ ์ด ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
NodeValue * const readNode(..., NodeKey * const key) {โ
MDB_val rawKey = serialize(key);โ
MDB_val rawValue;โ
mdb_get(..., &rawKey, &rawValue);โ
return (NodeValue * const)rawValue.mv_data;โ
}
์ ์๋ ๋ชฉ๋ก์ ๊ตฌ์กฐ ๋คํ๋ฅผ ํตํ ์ง๋ ฌํ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋๋ฟ๋ง ์๋๋ผ ์ฝ์ ๋ ๋์ ํ ๋น์ ์ ๊ฑฐํ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค. ํจ์์์ ํ์ mdb_get
ํฌ์ธํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ฐ์ฒด์ ๋ฐ์ดํธ ํํ์ ์ ์ฅํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ํํ๊ฒ ์ฐพ์ต๋๋ค. ์ค์ ๋ก ์ฐ๋ฆฌ๋ ๊ฑฐ์ ๋ฌด๋ฃ๋ก ๋งค์ฐ ๋์ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์๋๋ฅผ ์ ๊ณตํ๋ ์ผ์ข
์ ORM์ ์ป์ต๋๋ค. ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ์๋ฆ๋ค์์๋ ๋ถ๊ตฌํ๊ณ ์ด์ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ธฐ์ตํ ํ์๊ฐ ์์ต๋๋ค.
- ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ ๊ฒฝ์ฐ ๊ฐ ๊ตฌ์กฐ์ ๋ํ ํฌ์ธํฐ๋ ํธ๋์ญ์ ์ด ๋ซํ ๋๊น์ง๋ง ์ ํจํ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด๊ฐ ์์ฃผํ๋ B-ํธ๋ฆฌ์ ํ์ด์ง๋ ๊ธฐ๋ก ์ค ๋ณต์ฌ ์์น ๋๋ถ์ ์ ์ด๋ ํ๋์ ํธ๋์ญ์ ์ด ํด๋น ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋ ํ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ๋์์ ํ์ด์ง์ ๊ด๋ จ๋ ๋ง์ง๋ง ํธ๋์ญ์ ์ด ์๋ฃ๋๋ ์ฆ์ ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํฐ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฒด๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํธ๋์ญ์ ์์ ์ ์ง๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
- ์ฝ๊ธฐ ์ฐ๊ธฐ ํธ๋์ญ์ ์ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ ๊ตฌ์กฐ ๊ฐ์ ๋ํ ํฌ์ธํฐ๋ ์ฒซ ๋ฒ์งธ ์์ ์ ์ฐจ(๋ฐ์ดํฐ ์ฐ๊ธฐ ๋๋ ์ญ์ )๊น์ง๋ง ์ ํจํฉ๋๋ค.
- ๊ตฌ์กฐ์ธ๋ฐ๋
NodeValue
๋ณธ๊ฒฉ์ ์ธ ๊ฒ์ ์๋์ง๋ง ์๋ฆฝ๋๋ค ( "์ธ๋ถ ๋น๊ต๊ธฐ์ ์ํ ํค ์ ๋ ฌ"ํ์ ์น์ ์ฐธ์กฐ). ํฌ์ธํฐ๋ฅผ ํตํด ํด๋น ํ๋์ ์ฝ๊ฒ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ทธ๊ฒ์ ์ญ์ฐธ์กฐํ์ง ์๋ ๊ฒ์ ๋๋ค! - ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฐ์ ํฌ์ธํฐ๋ฅผ ํตํด ๊ตฌ์กฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ฉ์๋๋ฅผ ํตํด์๋ง ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.
mdb_put
. ๊ทธ๋ฌ๋์ด ๊ตฌ์กฐ๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์ฝ๊ธฐ ์ ์ฉ ๋ชจ๋๋ก ๋งคํ๋๊ธฐ ๋๋ฌธ์์ด ์์ ์ ์ํํ๋ ค๋ ๋ชจ๋ ์๊ตฌ๊ฐ ์๋ํ์ง ์์ต๋๋ค. - ์๋ฅผ ๋ค์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ ์ ์ฅ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ธฐ ์ํด ํ์ผ์ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ๋ค์ ๋งคํํฉ๋๋ค.
mdb_env_set_map_size
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ํธ๋์ญ์ ๋ฐ ๊ด๋ จ ์ํฐํฐ์ ํนํ ์ฝ๊ธฐ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ์์ ํ ๋ฌดํจํํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ํ ๊ฐ์ง ๋ ๋ง์ ๊ธฐ๋ฅ์ด ๋๋ฌด ๊ตํํด์ ๊ทธ ๋ณธ์ง์ ๊ณต๊ฐ๊ฐ ํ ๊ฐ์ง ๋ ๋ง์ ์ ์ ๋ง์ง ์์ต๋๋ค. B-ํธ๋ฆฌ์ ๊ดํ ์ฅ์์ ๋ฉ๋ชจ๋ฆฌ์ ํ์ด์ง ๊ตฌ์ฑ์ ๋ํ ๋ค์ด์ด๊ทธ๋จ์ ์ ๊ณตํ์ต๋๋ค. ๋ฐ๋ผ์ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฒํผ์ ์์ ์ฃผ์๋ ์ ๋์ ์ผ๋ก ์์์ ์ผ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ตฌ์กฐ์์ ์ป์ ํฌ์ธํฐ MDB_val
๊ตฌ์กฐ์ ๋ํ ํฌ์ธํฐ๋ก ์บ์คํธํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฌ๋์ง ์์ต๋๋ค. ๋์์ ์ผ๋ถ ์นฉ์ ์ํคํ
์ฒ(iOS์ ๊ฒฝ์ฐ armv7)๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ ๊ธฐ๊ณ์ด ํฌ๊ธฐ์ ๋ฐฐ์, ์ฆ ์์คํ
์ ๋นํธ ์๋ฅผ ์๊ตฌํฉ๋๋ค. (armv7์ ๊ฒฝ์ฐ 32๋นํธ์). ์ฆ, ๋ค์๊ณผ ๊ฐ์ ์์
*(int *foo)0x800002
๊ทธ๋ค์ ๋ํ ํ์ถ๊ณผ ๋์ผ์๋๋ฉฐ ํ๊ฒฐ๋ก ์ฒํ๋ฉ๋๋ค. EXC_ARM_DA_ALIGN
. ๊ทธ๋ฐ ์ํ๊น์ด ์ด๋ช
์ ํผํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๋ค.
์ฒซ ๋ฒ์งธ๋ ์ฌ์ ์ ์๋ ค์ง ์ ๋ ฌ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์ ์ง์ ๋น๊ต๊ธฐ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์๋ฉ๋๋ค.
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey aKey, bKey;
memcpy(&aKey, a->mv_data, a->mv_size);
memcpy(&bKey, b->mv_data, b->mv_size);
return // ...
}
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํค์ ๊ฐ์ด ์๋ ๊ตฌ์กฐ๊ฐ ํน์ฑ์ ์ฌ์ฉํ์ฌ ์ ๋ ฌ๋์ง ์์ ์ ์์์ ์ฌ์ ์ ์ปดํ์ผ๋ฌ์ ์๋ฆฌ๋ ๊ฒ์
๋๋ค. aligned(1)
. ARM์์๋ ๋์ผํ ํจ๊ณผ๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
typedef struct __attribute__((packed)) NodeKey {
uint8_t parentId;
uint8_t type;
uint8_t nameLength;
uint8_t nameBuffer[256];
} NodeKey;
๋ฒ์ ์ฟผ๋ฆฌ
๋ ์ฝ๋ ๊ทธ๋ฃน์ ๋ฐ๋ณตํ๊ธฐ ์ํด LMDB๋ ์ปค์ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ์ด๋ฏธ ์น์ํ ์ฌ์ฉ์ ํด๋ผ์ฐ๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์๋ ํ ์ด๋ธ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ ๋ชฉ๋ก์ ํ์ํ๋ ๊ณผ์ ์ ์ผ๋ถ๋ก ํ์ ํ์ผ ๋ฐ ํด๋์ ๊ด๋ จ๋ ๋ชจ๋ ํค๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค. ์ด์ ํ์ ์น์
์์๋ ํค๋ฅผ ์ ๋ ฌํ์ต๋๋ค. NodeKey
์์ ๋๋ ํ ๋ฆฌ ID๋ก ๋จผ์ ์ ๋ ฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์ ์ ์ผ๋ก ํด๋์ ๋ด์ฉ์ ๊ฐ์ ธ์ค๋ ์์
์ ์ฃผ์ด์ง ์ ๋์ฌ๊ฐ ์๋ ํค ๊ทธ๋ฃน์ ์์ชฝ ๊ฒฝ๊ณ์ ์ปค์๋ฅผ ๋๊ณ ์๋์ชฝ ๊ฒฝ๊ณ๊น์ง ๋ฐ๋ณตํ๋ ๊ฒ์ผ๋ก ์ถ์๋ฉ๋๋ค.
์์ฐจ ๊ฒ์์ผ๋ก "์ด๋ง์์"์ํ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ์ปค์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฒด ํค ๋ชฉ๋ก ์์ ๋ถ๋ถ์ ๋ฐฐ์น๋ ๋ค์ ์์ ๋๋ ํ ๋ฆฌ ์๋ณ์๊ฐ ์๋ ํค๊ฐ ๊ทธ ์๋์ ๋ํ๋ ๋๊น์ง ์ฆ๊ฐํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์๋ ๋ ๊ฐ์ง ๋ช ๋ฐฑํ ๋จ์ ์ด ์์ต๋๋ค.
- ๊ฒ์์ ์ ํ ๋ณต์ก์ฑ์ ์์๋ค์ํผ ์ผ๋ฐ์ ์ผ๋ก ํธ๋ฆฌ, ํนํ B-ํธ๋ฆฌ์์ ๋ก๊ทธ ์๊ฐ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
- ํ๋์ด ์ํ๋ ํ์ด์ง ์์ ๋ชจ๋ ํ์ด์ง๊ฐ ํ์ผ์์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ผ๊ฐ๋๋ฐ ์ด๋ ๋งค์ฐ ๋น์๋๋ค.
๋คํ์ค๋ฝ๊ฒ๋ LMDB API๋ ์ฒ์์ ์ปค์๋ฅผ ๋ฐฐ์นํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๊ฐ๊ฒฉ์ ์ํ์ ์๋ ํค๋ณด๋ค ํ์คํ ์๊ฑฐ๋ ๊ฐ์ ํค๋ฅผ ํ์ฑํด์ผ ํฉ๋๋ค. . ์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ฆผ์ ๋ชฉ๋ก๊ณผ ๊ด๋ จํ์ฌ ํ๋๊ฐ ์๋ ํค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. parentId
2์ ๊ฐ๊ณ ๋๋จธ์ง๋ ๋ชจ๋ XNUMX์ผ๋ก ์ฑ์์ง๋๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ์ผ๋ก ์ฑ์์ง ํค๋ ํจ์์ ์
๋ ฅ์ ๊ณต๊ธ๋ฉ๋๋ค. mdb_cursor_get
์๋ ํ์ MDB_SET_RANGE
.
NodeKey upperBoundSearchKey = {โ
.parentId = 2,โ
.type = 0,โ
.nameLength = 0โ
};โ
MDB_val value, key = serialize(upperBoundSearchKey);โ
MDB_cursor *cursor;โ
mdb_cursor_open(..., &cursor);โ
mdb_cursor_get(cursor, &key, &value, MDB_SET_RANGE);
ํค ๊ทธ๋ฃน์ ์ํ์ด ๋ฐ๊ฒฌ๋๋ฉด ๋ค๋ฅธ ํค์ ๋ง๋๊ฑฐ๋ ํค๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. parentId
๋๋ ํค๊ฐ ์ ํ ์๋ชจ๋์ง ์์ต๋๋ค.
do {โ
rc = mdb_cursor_get(cursor, &key, &value, MDB_NEXT);โ
// processing...โ
} while (MDB_NOTFOUND != rc && // check end of tableโ
IsTargetKey(key)); // check end of keys groupโโ
์ข์ ์ ์ mdb_cursor_get์ ์ฌ์ฉํ๋ ๋ฐ๋ณต์ ์ผ๋ถ๋ก ํค๋ฟ๋ง ์๋๋ผ ๊ฐ๋ ์ป์ต๋๋ค. ์ ํ ์กฐ๊ฑด์ ์ถฉ์กฑํ๊ธฐ ์ํด ๋ฌด์๋ณด๋ค๋ ๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ์์ ํ๋๋ฅผ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ์ ์ค์ฒ ์์ด๋ ํ๋์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.
4.3. ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ ๋ชจ๋ธ๋ง
์ง๊ธ๊น์ง ๋จ์ผ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ๋ฐ ์์ ์ ๋ชจ๋ ์ธก๋ฉด์ ๊ณ ๋ คํ์ต๋๋ค. ํ ์ด๋ธ์ ๋์ผํ ์ ํ์ ํค-๊ฐ ์์ผ๋ก ๊ตฌ์ฑ๋ ์ ๋ ฌ๋ ๋ ์ฝ๋ ์งํฉ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ํค๋ฅผ ์ฌ๊ฐํ์ผ๋ก ํ์ํ๊ณ ๊ด๋ จ ๊ฐ์ ์์๋ก ํ์ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ฐ์ ๋ค์ด์ด๊ทธ๋จ์ด ํ์๋ฉ๋๋ค.
รข โฌ <
๊ทธ๋ฌ๋ ์ค์ํ์์ ๊ทธ๋ ๊ฒ ์ ์ ์์ ํผ๋ฅผ ํ๋ฆฌ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ข ์ข ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฒซ ๋ฒ์งธ๋ก ์ฌ๋ฌ ํ ์ด๋ธ์ด ์์ด์ผ ํ๊ณ ๋ ๋ฒ์งธ๋ก ๊ธฐ๋ณธ ํค์ ๋ค๋ฅธ ์์๋ก ํ ์ด๋ธ์์ ์ ํ์ ์ํํด์ผ ํฉ๋๋ค. ์ด ๋ง์ง๋ง ์น์ ์ ์์ฑ ๋ฐ ์ํธ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ๋ค๋ฃน๋๋ค.
์ธ๋ฑ์ค ํ ์ด๋ธ
ํด๋ผ์ฐ๋ ์ฑ์๋ "๊ฐค๋ฌ๋ฆฌ" ์น์ ์ด ์์ต๋๋ค. ์ ์ฒด ํด๋ผ์ฐ๋์ ๋ฏธ๋์ด ์ฝํ ์ธ ๋ฅผ ๋ ์ง๋ณ๋ก ์ ๋ ฌํ์ฌ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์ ํ์ ์ต์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๊ธฐ๋ณธ ํ ์ด๋ธ ์์ ์๋ก์ด ์ ํ์ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ผ์ด ์์ฑ๋ ๋ ์ง๊ฐ ํฌํจ๋ ํ๋๊ฐ ํฌํจ๋๋ฉฐ ์ด ํ๋๋ ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ ํค๋ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ํค์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ์ธ๋ฑ์ค ํค๋ผ๊ณ ํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์์ ์ฃผํฉ์์ผ๋ก ๊ฐ์กฐ ํ์๋์ด ์์ต๋๋ค.
๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ๋ค๋ฅธ ํ ์ด๋ธ์ ํค๋ฅผ ์๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ถ๊ฐ ๊ธฐ์ ํ๋ tableId๊ฐ ๋ชจ๋ ํ ์ด๋ธ์ ์ถ๊ฐ๋์์ต๋๋ค. ์ ๋ ฌ์ ์ต์ฐ์ ์์๋ก ์ง์ ํจ์ผ๋ก์จ ๋จผ์ ํ ์ด๋ธ๋ณ๋ก ํค๋ฅผ ๊ทธ๋ฃนํํ๊ณ ์ด๋ฏธ ์์ฒด ๊ท์น์ ๋ฐ๋ผ ํ ์ด๋ธ ๋ด๋ถ์ ๊ทธ๋ฃนํํฉ๋๋ค.
์ธ๋ฑ์ค ํค๋ ๊ธฐ๋ณธ ํค์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๊ธฐ๋ณธ ํค์ ๊ฐ ๋ถ๋ถ ๋ณต์ฌ๋ณธ์ ์ฐ๊ฒฐํ์ฌ ์ด ์์ฑ์ ์ง์ ๊ตฌํํ๋ ๊ฒ์ ํ ๋ฒ์ ์ฌ๋ฌ ๊ด์ ์์ ์ฐจ์ ์ฑ ์ ๋๋ค.
- ์ ์ ๋ ๊ณต๊ฐ์ ๊ด์ ์์ ๋ฉํ๋ฐ์ดํฐ๋ ์๋นํ ํ๋ถํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๊ด์ ์์ ๋ณด๋ฉด ๋ ธ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋ ๊ฐ์ ํค๋ฅผ ๋ฎ์ด์จ์ผ ํฉ๋๋ค.
- ๊ฒฐ๊ตญ ์ฝ๋ ์ง์์ ๊ด์ ์์ ๋ณผ ๋ ํค ์ค ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์คํ ๋ฆฌ์ง์์ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ผ๋ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค์์ผ๋ก ์ด๋ฌํ ๋จ์ ์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ ๊ตฌ์ฑ
์ด ํจํด์ ์ธ๋ฑ์ค ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. "๊ฐ์ผ๋ก์์ ํค". ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ธ๋ฑ์ค ๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ์ ๊ธฐ๋ณธ ํค ๊ฐ์ ๋ณต์ฌ๋ณธ์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ณธ ๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ ๋ณต์ฌ๋ณธ์ ์ ์ฅํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์์ ๋์ด๋ ๋ชจ๋ ๋จ์ ์ ์ ๊ฑฐํฉ๋๋ค. ์ ์ผํ ์๊ธ์ ์ธ๋ฑ์ค ํค๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ํ๋๊ฐ ์๋ 2๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋์์ ์ผ๋ก ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ตฌ์ฑํ๋ ๋ ๋ค๋ฅธ ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. "์ค๋ณต ํค". ๊ทธ ๋ณธ์ง์ ์ ๋ ฌ์ด ์๋ ๊ด๋ จ ํค๋ฅผ ์ฌ์์ฑํ๋ ๋ฐ ํ์ํ ์ถ๊ฐ ์์ฑ์ ํค์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.๊ทธ๋ฌ๋ Mail.ru ํด๋ผ์ฐ๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ์ค์ ์๊ฐ ์์ต๋๋ค. ํน์ iOS ํ๋ ์์ํฌ์ ๋งฅ๋ฝ์์ ๊ฐ์์ด์ง๋ง ๋ ์ดํดํ๊ธฐ ์ฌ์ด ์๋ฅผ ๋ค๊ฒ ์ต๋๋ค.
ํด๋ผ์ฐ๋ ๋ชจ๋ฐ์ผ ํด๋ผ์ด์ธํธ์๋ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฌ๋๊ณผ ๊ณต์ ํ ๋ชจ๋ ํ์ผ ๋ฐ ํด๋๋ฅผ ํ์ํ๋ ํ์ด์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌํ ํ์ผ์ด ์๋์ ์ผ๋ก ์ ๊ณ ๊ด๋ จ ๊ณต๊ฐ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด(์ก์ธ์ค๊ฐ ๋ถ์ฌ๋ ์ฌ๋, ๊ถํ ๋ฑ)๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ํญ๋ชฉ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํ์ผ์ ์คํ๋ผ์ธ์ผ๋ก ํ์ํ๋ ค๋ฉด ์ฌ์ ํ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์์ฐ์ค๋ฌ์ด ํด๊ฒฐ์ฑ ์ ๋ณ๋์ ํ ์ด๋ธ์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์๋ ๋ค์ด์ด๊ทธ๋จ์์ ํด๋น ํค๋ "P" ์ ๋์ฌ๊ฐ ๋ถ๊ณ "propname" ์๋ฆฌ ํ์์๋ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๊ฐ์ธ "public info"๋ก ๋์ฒด๋ ์ ์์ต๋๋ค.
์ ํ ์ด๋ธ์ด ์์ฑ๋ ๋ชจ๋ ๊ณ ์ ๋ฉํ๋ฐ์ดํฐ๋ ๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ์ผ๋ก ์ด๋๋ฉ๋๋ค. ๋์์ ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์ด๋ฏธ ์ ์ฅ๋ ํ์ผ ๋ฐ ํด๋์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋์ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ "๋ ธ๋ ID" ๋ฐ "ํ์์คํฌํ" ํ๋ ํ์์ผ๋ก "P" ํค์ ์ถ๊ฐ๋ฉ๋๋ค. ๋๋ถ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ป์ ์ ์๋ ์ธ๋ฑ์ค ํค๋ฅผ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ต์ข ์ ์ผ๋ก ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
LMDB ๊ตฌ์ถ ๊ฒฐ๊ณผ๋ฅผ ๊ธ์ ์ ์ผ๋ก ํ๊ฐํ๋ค. ๊ทธ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง ํ์๊ฐ 30% ๊ฐ์ํ์ต๋๋ค.
์ํํ ์์
๊ฒฐ๊ณผ iOS ํ ์ธ๋ถ์์ ์๋ต์ ์ฐพ์์ต๋๋ค. ํ์ฌ Android ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ "ํ์ผ" ์น์
์ค ํ๋๋ LMDB๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํ๋์์ผ๋ฉฐ ๋ค๋ฅธ ๋ถ๋ถ๋ ์งํ ์ค์
๋๋ค. ํค-๊ฐ ์ ์ฅ์๊ฐ ๊ตฌํ๋ C ์ธ์ด๋ ์ด๊ธฐ์ C++ ์ธ์ด๋ก ๊ต์ฐจ ํ๋ซํผ์ ์ค์ฌ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ธ๋ฉ์ ๋ง๋๋ ๋ฐ ์ข์ ๋์์ด ๋์์ต๋๋ค. ๊ฒฐ๊ณผ C ++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Objective-C ๋ฐ Kotlin์ ํ๋ซํผ ์ฝ๋์ ์ํํ๊ฒ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฝ๋ ์์ฑ๊ธฐ๊ฐ ์ฌ์ฉ๋์์ต๋๋ค.
์ถ์ฒ : habr.com