iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

2019๋…„ ๊ฐ€์„, Mail.ru Cloud iOS ํŒ€์—์„œ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ์ด๋ฒคํŠธ๊ฐ€ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์˜ ์˜๊ตฌ ์ €์žฅ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ๋ฐ”์ผ ์„ธ๊ณ„์—์„œ ๋งค์šฐ ์ด์ƒ‰์ ์ž…๋‹ˆ๋‹ค. Lightning ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (LMDB). ์ปท ์•„๋ž˜์—์„œ ๋„ค ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ž์„ธํ•œ ๋ฆฌ๋ทฐ์— ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์„ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์‚ฌ์†Œํ•˜์ง€ ์•Š๊ณ  ์–ด๋ ค์šด ์„ ํƒ์˜ ์ด์œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ LMDB ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ, B + ํŠธ๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ๋ฐ ๋‹ค์ค‘ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ copy-on-write ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์„ธ ๊ฐ€์ง€ ๊ณ ๋ ค ์‚ฌํ•ญ์œผ๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋””์ €ํŠธ์˜ ๊ฒฝ์šฐ ์‹ค์šฉ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ•˜์œ„ ์ˆ˜์ค€ ํ‚ค-๊ฐ’ API ์œ„์— ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์„ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š” ๊ธฐ๋ณธ ์Šคํ‚ค๋งˆ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

๋‚ด์šฉ

  1. ์ถ”์ง„๋™๊ธฐ
  2. LMDB ํฌ์ง€์…”๋‹
  3. ์„ธ๋งˆ๋ฆฌ ๊ณ ๋ž˜ LMDB
    3.1. ๊ณ ๋ž˜ #1. ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ
    3.2. ๊ณ ๋ž˜ #2. B+-ํŠธ๋ฆฌ
    3.3. ๊ณ ๋ž˜ #3. ๊ธฐ๋ก ์ค‘ ๋ณต์‚ฌ
  4. ํ‚ค-๊ฐ’ API ์œ„์— ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์„ค๊ณ„
    4.1. ๊ธฐ๋ณธ ์ถ”์ƒํ™”
    4.2. ํ…Œ์ด๋ธ” ๋ชจ๋ธ๋ง
    4.3. ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„ ๋ชจ๋ธ๋ง

1. ์ถ”์ง„๋™๊ธฐ

2015๋…„์— XNUMX๋…„์— ํ•œ ๋ฒˆ, ์šฐ๋ฆฌ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ง€์—ฐ๋˜๋Š”์ง€ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ์ž ์ž‘์—…์— ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์ ์  ๋” ๋งŽ์€ ๋ถˆ๋งŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š๊ณ  ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ•˜์ง€ ์•Š๋Š” ๋“ฑ์ž…๋‹ˆ๋‹ค. ์ธก์ • ์—ญํ•™ ์ •๋ณด ๋งํ•œ AvitoTech์—์„œ๋Š” ์ˆซ์ž ์ˆœ์„œ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ธก์ • ๊ฒฐ๊ณผ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ƒ‰์ˆ˜ ์ƒค์›Œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™๊ฒฐ๋กœ ์ธํ•œ ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๊ธฐ ์ „์— ํ’ˆ์งˆ์˜ ์ฃผ์š” ๊ธฐ์ˆ  ์ง€ํ‘œ๊ฐ€ ์ถฉ๋Œ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ดˆ์ ์„ ๋งž์ถ˜ ํ›„์— ์ด๋™ ํ”„๋ฆฌ์ฆˆ ํ”„๋ฆฌ.

๊ตฌ์ถ•ํ•œ ๋ฉˆ์ถค์ด ์žˆ๋Š” ๋Œ€์‹œ๋ณด๋“œ ๊ทธ๋ฆฌ๊ณ  ๋ณด๋‚ธ ์ •๋Ÿ‰์  ะธ ํ’ˆ์งˆ ๊ทธ ์›์ธ์„ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ ์ฃผ์š” ์ ์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ž…๋‹ˆ๋‹ค. ์ด ๋ถˆ๋ช…์˜ˆ์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐ˜์‘์€ ๊ทธ๊ฒƒ์„ ์ž‘์—… ํ๋ฆ„์— ๋ฐ€์–ด๋„ฃ๊ณ  ์‹ถ์€ ๋ถˆํƒ€๋Š” ์š•๋ง์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋Ÿ‰ ์•กํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์•„ํ‚คํ…์ฒ˜์— ์˜์กดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” iOS ์„ธ๊ณ„๋ฅผ ์œ„ํ•ด ๊ทธ๋…€์˜ ์ ์‘์„ ๋ฐ”์ณค์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ ์ง‘๋‹จ ํŠธ์œ„ํ„ฐ์—์„œ ํ•˜๋ธŒ๋ ˆ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ. ํ˜„์žฌ ์ด์•ผ๊ธฐ์˜ ์ผ๋ถ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ์— ์˜ํ–ฅ์„ ์ค€ ๊ฒฐ์ •์˜ ์ธก๋ฉด์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ตฌ์„ฑ์˜ ์•กํ„ฐ ๋ชจ๋ธ์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์ด ๋‘ ๋ฒˆ์งธ ๋ณธ์งˆ์ด ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋ธ ๊ฐœ์ฒด๋Š” ์Šค๋ ˆ๋“œ ๊ฒฝ๊ณ„๋ฅผ ๊ต์ฐจํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๋•Œ๋•Œ๋กœ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์žฅ์†Œ์—์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋Š์ž„์—†์ด ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์ด๊ฒƒ์„ํ•ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ œ์‹œ๋œ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ์ดˆ์„ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ž‘์—…์€ ๋งคํฌ๋กœ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค. ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„ธ๊ณ„์—์„œ ์„œ๋น„์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์•กํ„ฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•ด๋„ ์ตœ์†Œํ•œ์˜ ์–ด๋ ค์›€๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๊ฒƒ์€ ํŒŒ์ƒ๋œ ๊ฐœ์ฒด๊ฐ€ ์ตœ์†Œํ•œ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ด์•ผ ํ•˜๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„์‹œ๋‹ค์‹œํ”ผ ํ›„์ž๋Š” ์„ฑ๋Šฅ์— ์œ ์ตํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ž ๊ธˆ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ์— ์˜ํ–ฅ์„ ์ค€ ๋‘ ๋ฒˆ์งธ ์ค‘์š”ํ•œ ์š”์†Œ๋Š” ํด๋ผ์šฐ๋“œ API์˜€์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™”์— ๋Œ€ํ•œ git ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋Š” ๋ชฉํ‘œ๋กœ ์˜คํ”„๋ผ์ธ ํผ์ŠคํŠธ API, ํด๋ผ์šฐ๋“œ ํด๋ผ์ด์–ธํŠธ์— ๋” ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ์˜ ์ „์ฒด ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํŽŒํ•‘ํ•œ ๋‹ค์Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋กค๋ง ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๋™๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์•„, ์ด ๊ฐ€๋Šฅ์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ด๋ก ์ ์ธ ์˜์—ญ์—๋งŒ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ํŒจ์น˜ ์ž‘์—… ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ๊ด€์ ์ธ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉฐ ์†Œ๊ฐœ๋ฅผ ์ง€์—ฐ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ด„ํ˜ธ์—์„œ ์ œ์™ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์€ API๊ฐ€ "A"๋ผ๊ณ  ๋งํ•˜๊ณ  ์†Œ๋น„์ž๊ฐ€ "B"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์„ ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ•™์Šต ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ’€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋กœ์ปฌ ์Šค๋ƒ…์ƒท์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋Œ€์‹  ์ „์ฒด ์ƒํƒœ๋ฅผ ์ „์ฒด ์„œ๋ฒ„ ์ƒํƒœ์™€ ๋น„๊ตํ•˜๋Š” git์„ ์ƒ์ƒํ•˜๋ฉด ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์ •ํ™•ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์„ ์œ„ํ•ด ๋ชจ๋“  ์„œ๋ฒ„ ๋ฐ ๋กœ์ปฌ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด์™€ ํ•จ๊ป˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋‘ ๊ฐœ์˜ DOM ํŠธ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ถ”์ธกํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์šฐ๋“œ์— 500๋งŒ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ €์žฅํ•œ ๋‹ค์Œ ์ด๋ฅผ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด 1๋งŒ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ํŒŒ๊ดดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ๋…ธ๋“œ๋Š” ํ•˜์œ„ ๊ฐœ์ฒด์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํฌํ•จํ•˜๋Š” ์ง‘๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ์—„์ฒญ๋‚œ ์ˆ˜์˜ ์ž‘์€ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ๊ดดํ•˜๋Š” ์ ˆ์ฐจ ์ž์ฒด์— ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์œผ๋ฉฐ ๊ธฐ๋ณธ ๋™๊ธฐํ™” ์ž‘์—…์ด ๋งŽ์€ ์ˆ˜์— ํฌํ•จ๋˜์–ด ์ƒํ™ฉ์ด ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์˜. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ์—์„œ ๋‘ ๋ฒˆ์งธ๋กœ ์ค‘์š”ํ•œ ๊ธฐ์ค€์ธ ๊ฐœ์ฒด์˜ ๋™์  ํ• ๋‹น ์—†์ด CRUD ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋ณด๋‹ค ์ „ํ†ต์ ์ด๋ฉฐ ์ „์ฒด ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์Šค๋ ˆ๋“œ ์•ˆ์ „.
  2. ๋‹ค์ค‘ ์ฒ˜๋ฆฌ. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ๊ฐ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ iOS ํ™•์žฅ ๊ฐ„์—๋„ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋ ค๋Š” ์š•๊ตฌ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  3. ์ €์žฅ๋œ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐœ์ฒด๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  4. CRUD ์ž‘์—… ๋‚ด์—์„œ ๋™์  ํ• ๋‹น์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ธฐ๋ณธ ์†์„ฑ์— ๋Œ€ํ•œ ํŠธ๋žœ์žญ์…˜ ์ง€์› ACIDํ‚ค์›Œ๋“œ: ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๊ฒฉ๋ฆฌ ๋ฐ ์‹ ๋ขฐ์„ฑ.
  6. ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ์‚ฌ๋ก€์˜ ์†๋„.

์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด SQLite๋Š” ์—ฌ์ „ํžˆ ์ข‹์€ ์„ ํƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋Œ€์•ˆ ์—ฐ๊ตฌ์˜ ์ผํ™˜์œผ๋กœ ์šฐ์—ฐํžˆ ๋งŒ๋‚œ ์ฑ… "LevelDB ์‹œ์ž‘ํ•˜๊ธฐ". ๊ทธ๋…€์˜ ๋ฆฌ๋”์‹ญ ์•„๋ž˜ ์‹ค์ œ ํด๋ผ์šฐ๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž‘์—… ์†๋„๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๊ฐ€์žฅ ํฐ ๊ธฐ๋Œ€์น˜๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์— ์ปค์„œ๋ฅผ ๋†“๊ณ  ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๋ชจ๋“  ํŒŒ์ผ์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์‚ฌ๋ก€์—์„œ LMDB๋Š” SQLite๋ณด๋‹ค 10๋ฐฐ ๋น ๋ฅธ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์€ ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

2. LMDB ํฌ์ง€์…”๋‹

LMDB๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ธฐ๋ณธ ๊ณ„์ธต์ธ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋งค์šฐ ์ž‘์€(๋‹จ์ง€ 10K ๋ผ์ธ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋” ๋†’์€ ์ˆ˜์ค€์„ ๊ตฌํ˜„ํ•˜๋Š” SQLite์™€ LMDB๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ Core Data๊ฐ€ ์žˆ๋Š” SQLite๋ณด๋‹ค ๋” ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. BerkeleyDB, LevelDB, Sophia, RocksDB ๋“ฑ ๋™์ผํ•œ ๊ฒฝ์Ÿ์ž์™€ ๋™์ผํ•œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์ธ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ณต์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. LMDB๊ฐ€ SQLite์˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ตฌ์„ฑ ์š”์†Œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฐœ๋ฐœ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 2012๋…„ ์ฒซ ์‹คํ—˜ ์‹ค์‹œ ์ €์ž LMDB ํ•˜์›Œ๋“œ ์ถ”. ์กฐ์‚ฌ ๊ฒฐ๊ณผ OSS ์—ด๊ด‘์ž๋“ค์ด ๊ทธ์˜ ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋ฅผ ์„ ํƒํ–ˆ์„ ์ •๋„๋กœ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ๊ณ , ๋ฃจ๋ชจSQL. 2020๋…„ XNUMX์›” ์ด ํ”„๋กœ์ ํŠธ์˜ ์ €์ž๋Š” Den Shearer์ž…๋‹ˆ๋‹ค. ์ œ์‹œ LinuxConfAu์— ์žˆ์Šต๋‹ˆ๋‹ค.

LMDB์˜ ์ฃผ์š” ์šฉ๋„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์šฉ ์—”์ง„์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ทธ ๋ชจ์Šต์„ ๋นš์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. OpenLDAP, ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ฐ˜์œผ๋กœ BerkeleyDB์— ํฌ๊ฒŒ ๋ถˆ๋งŒ์„ ํ’ˆ์€ ์‚ฌ๋žŒ. ์ดˆ๋ผํ•œ ๋„์„œ๊ด€์—์„œ ๋ฐ€๋ ค๋‚˜๋‹ค ๋น„ํŠธ๋ฆฌ, Howard Chu๋Š” ์šฐ๋ฆฌ ์‹œ๋Œ€์˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋Œ€์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ด ์ด์•ผ๊ธฐ์™€ LMDB์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ทธ์˜ ๋งค์šฐ ๋ฉ‹์ง„ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ”์ณค์Šต๋‹ˆ๋‹ค. "๋ฒˆ๊ฐœ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค". ๋ ˆ์˜ค๋‹ˆ๋“œ ์œ ๋ฆฌ์˜ˆํ”„(์ผ๋ช… ์ผ๋ ˆ์˜ค) Highload 2015์—์„œ ๋ฐœํ‘œํ•œ Positive Technologies์˜ "LMDB ์—”์ง„์€ ํŠน๋ณ„ํ•œ ์ฑ”ํ”ผ์–ธ์ž…๋‹ˆ๋‹ค.". ์—ฌ๊ธฐ์—์„œ ๊ทธ๋Š” ReOpenLDAP๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ์‚ฌํ•œ ์ž‘์—…์˜ ๋งฅ๋ฝ์—์„œ LMDB์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉฐ LevelDB๋Š” ์ด๋ฏธ ๋น„๊ต ๋น„ํŒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๊ฒฐ๊ณผ, Positive Technologies๋Š” ํ™œ๋ฐœํžˆ ๊ฐœ๋ฐœ ์ค‘์ธ ํฌํฌ๊นŒ์ง€ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. MDBX ๋งค์šฐ ๋ง›์žˆ๋Š” ๊ธฐ๋Šฅ, ์ตœ์ ํ™” ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •.

LMDB๋Š” ์ข…์ข… ์žˆ๋Š” ๊ทธ๋Œ€๋กœ์˜ ์Šคํ† ๋ฆฌ์ง€๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Mozilla Firefox ๋ธŒ๋ผ์šฐ์ € ์„ ํƒ ๋‹ค์–‘ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ณ  ๋ฒ„์ „ 9๋ถ€ํ„ฐ Xcode ์„ ํ˜ธํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” SQLite.

์ด ์—”์ง„์€ ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ ์„ธ๊ณ„์—์„œ๋„ ์ธ๊ธฐ๋ฅผ ๋Œ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํ”์ ์ด ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๋ฐœ๊ฒฌ Telegram์šฉ iOS ํด๋ผ์ด์–ธํŠธ์—์„œ. LinkedIn์€ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€ ์ž์ฒด ๊ฐœ๋ฐœํ•œ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Rocket Data์˜ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€๋กœ LMDB๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งํ•œ 2016๋…„ ๊ธฐ์‚ฌ์—์„œ.

LMDB๋Š” Oracle์˜ ํ†ต์ œํ•˜์— ์ „ํ™˜ ํ›„ BerkeleyDB๊ฐ€ ๋‚จ๊ธด ํ‹ˆ์ƒˆ ์‹œ์žฅ์—์„œ ํƒœ์–‘์˜ ์ž๋ฆฌ๋ฅผ ๋†“๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ์‹ธ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฒด ์ข…๋ฅ˜์™€ ๋น„๊ตํ•ด๋„ ์†๋„์™€ ์•ˆ์ •์„ฑ์œผ๋กœ ์‚ฌ๋ž‘๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์‹œ๋‹ค์‹œํ”ผ ๊ณต์งœ ์ ์‹ฌ์€ ์—†์œผ๋ฉฐ LMDB์™€ SQLite ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ๋•Œ ์ง๋ฉดํ•˜๊ฒŒ ๋  ์ ˆ์ถฉ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์–ด๋–ป๊ฒŒ ์ฆ๊ฐ€๋œ ์†๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฒซ์งธ, ์šฐ๋ฆฌ๋Š” ๋””์Šคํฌ ์Šคํ† ๋ฆฌ์ง€ ์œ„์— ์ถ”๊ฐ€ ์ถ”์ƒํ™” ๊ณ„์ธต์— ๋Œ€ํ•ด ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ข‹์€ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ทธ๊ฒƒ๋“ค ์—†์ด๋Š” ์—ฌ์ „ํžˆ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ•„์—ฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด์ง€๋งŒ ํ›จ์”ฌ ๋” ์–‡์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SQL ์–ธ์–ด์˜ ์ฟผ๋ฆฌ ์ง€์›๊ณผ ๊ฐ™์ด ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋””์Šคํฌ ์Šคํ† ๋ฆฌ์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์—…์˜ ๋งคํ•‘์„ ์ตœ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ SQLite ๋‚ด ์ž‘ํ’ˆ์— ํ‰๊ท  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ‰๊ท  ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ๋น„๋กฏ๋œ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์ธ ๋‹น์‹ ์€ ์ฃผ์š” ๋กœ๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ƒ์‚ฐ์ ์ธ ์†”๋ฃจ์…˜์„ ์œ„ํ•ด์„œ๋Š” ์ดˆ๊ธฐ ์†”๋ฃจ์…˜ ๊ฐœ๋ฐœ๊ณผ ํ›„์† ์ง€์› ๋ชจ๋‘์— ๋Œ€ํ•ด ์ฆ๊ฐ€๋œ ๊ฐ€๊ฒฉํ‘œ๋ฅผ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ์„ธ๋งˆ๋ฆฌ ๊ณ ๋ž˜ LMDB

์กฐ๊ฐ๋„์—์„œ LMDB๋ฅผ ์‚ดํŽด๋ณธ ํ›„ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐˆ ๋•Œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ ์„น์…˜์€ ์Šคํ† ๋ฆฌ์ง€ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ฃผ์š” ๊ณ ๋ž˜ ๋ถ„์„์— ์ „๋…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋””์Šคํฌ ์ž‘์—… ๋ฐ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ.
  2. ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์กฐ์ง์œผ๋กœ์„œ์˜ B+-ํŠธ๋ฆฌ.
  3. ACID ํŠธ๋žœ์žญ์…˜ ์†์„ฑ ๋ฐ ๋‹ค์ค‘ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ธ Copy-on-write.

3.1. ๊ณ ๋ž˜ #1. ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ

๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ด๋ฆ„์—๋„ ๋‚˜ํƒ€๋‚˜๋Š” ์ค‘์š”ํ•œ ์•„ํ‚คํ…์ฒ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ €์žฅ๋œ ์ •๋ณด์— ๋Œ€ํ•œ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ์•ก์„ธ์Šค ๋ฌธ์ œ๋Š” ์ „์ ์œผ๋กœ ์šด์˜ ์ฒด์ œ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. LMDB๋Š” ์ž์ฒด์ ์œผ๋กœ ์บ์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์„ฑ์ž์˜ ์˜์‹์ ์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ๋งคํ•‘๋œ ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด ์—”์ง„ ๊ตฌํ˜„์—์„œ ๋งŽ์€ ์ฝ”๋„ˆ๋ฅผ ์ž๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€์˜ ์™„์ „ํ•œ ๋ชฉ๋ก๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค.

  1. ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž‘์—…ํ•  ๋•Œ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์šด์˜ ์ฒด์ œ์˜ ์ฑ…์ž„์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ ์ด ์—ญํ•™์— ๋Œ€ํ•ด ๊ทธ๋ฆผ๊ณผ ํ•จ๊ป˜ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  2. ์บ์‹œ๊ฐ€ ์—†์œผ๋ฉด ๋™์  ํ• ๋‹น๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ LMDB์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ผ ๋ฟ ๊ทธ ์ด์ƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ™˜์ƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์†Œ์Šค์—์„œ ๋ชจ๋“  calloc ํ˜ธ์ถœ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์— ์ง‘์ค‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์บ์‹œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์บ์‹œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋™๊ธฐํ™”์™€ ๊ด€๋ จ๋œ ์ž ๊ธˆ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ˆซ์ž๊ฐ€ ๋™์‹œ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒ๋…๊ธฐ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๋Š” ๋„์ค‘์— ๋‹จ์ผ ๋ฎคํ…์Šค๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ฝ๊ธฐ ์†๋„๋Š” CPU ์ˆ˜ ์ธก๋ฉด์—์„œ ์ด์ƒ์ ์ธ ์„ ํ˜• ํ™•์žฅ์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. LMDB์—์„œ๋Š” ์ˆ˜์ • ์ž‘์—…๋งŒ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์˜ ์ž‘๊ฐ€๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ตœ์†Œํ•œ์˜ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ๋…ผ๋ฆฌ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋งค์šฐ ๋ณต์žกํ•œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Usenix OSDI 2014 ์ปจํผ๋Ÿฐ์Šค์—์„œ ๋‘ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ตฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "๋ชจ๋“  ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ: ํฌ๋ž˜์‹œ ์ผ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ์ž‘์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด" ะธ ์žฌ๋ฏธ์™€ ์ด์ต์„ ์œ„ํ•œ ๊ณ ๋ฌธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค. ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ LMDB์˜ ์ „๋ก€ ์—†๋Š” ์•ˆ์ •์„ฑ๊ณผ ๋™์ผํ•œ SQLite์—์„œ ์ด๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฑฐ์˜ ์™„๋ฒฝํ•œ ํŠธ๋žœ์žญ์…˜ ACID ์†์„ฑ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. LMDB์˜ ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ธฐ๊ณ„ ํ‘œํ˜„์„ ๊ฒฐ๊ณผ ์†๋„ ํŠน์„ฑ๊ณผ ํ•จ๊ป˜ ํ”„๋กœ์„ธ์„œ์˜ L1 ์บ์‹œ์— ์™„์ „ํžˆ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ iOS์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ์žฅ๋ฐ‹๋น›์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค๊ณผ ๊ด€๋ จ๋œ ๋‹จ์ ์— ๋Œ€ํ•ด ๋” ์˜์‹์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๋ ค๋ฉด ์šด์˜ ์ฒด์ œ์—์„œ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜ ์›์น™์„ ์ƒ๊ธฐํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ •๋ณด

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์šด์˜ ์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค์—๋Š” ์ž‘์—…์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์น˜ํ•˜๋Š” ์—ฐ์†๋œ ๋ฒ”์œ„์˜ ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ตœํ•˜์œ„ ์ฃผ์†Œ์—๋Š” ์ฝ”๋“œ์™€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ ๋ฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ์„น์…˜์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ƒํ–ฅ ์„ฑ์žฅํ•˜๋Š” ๋™์  ์ฃผ์†Œ ๊ณต๊ฐ„ ๋ธ”๋ก์œผ๋กœ, ์šฐ๋ฆฌ์—๊ฒŒ ํž™์œผ๋กœ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ž‘๋™ ์ค‘์— ๋‚˜ํƒ€๋‚˜๋Š” ์—”ํ„ฐํ‹ฐ์˜ ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹จ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง€๋Š” ๊ฒƒ, ์ฆ‰ ๊ทธ ํฌ๊ธฐ ๋˜ํ•œ ๋™์ ์ธ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ๊ณผ ํž™์ด ์„œ๋กœ ๋ฐ€๊ณ  ๊ฐ„์„ญํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋์—์„œ ๋ถ„๋ฆฌ๋˜๋ฉฐ, ์œ„์™€ ์•„๋ž˜์˜ ๋‘ ๋™์  ์„น์…˜ ์‚ฌ์ด์— ๊ตฌ๋ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘๊ฐ„ ์„น์…˜์˜ ์ฃผ์†Œ๋Š” ์šด์˜ ์ฒด์ œ์—์„œ ๋‹ค์–‘ํ•œ ์—”ํ„ฐํ‹ฐ์˜ ํ”„๋กœ์„ธ์Šค์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํŠน์ • ์—ฐ์† ์ฃผ์†Œ ์ง‘ํ•ฉ์„ ๋””์Šคํฌ์˜ ํŒŒ์ผ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋œ ์ฃผ์†Œ ๊ณต๊ฐ„์€ ์—„์ฒญ๋‚ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์ฃผ์†Œ์˜ ์ˆ˜๋Š” ์‹œ์Šคํ…œ์˜ ๋น„ํŠธ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ์— ์˜ํ•ด์„œ๋งŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1-in-1์— ํ• ๋‹น๋œ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์„ธ์Šค๋Š” ์ „์ฒด RAM์„ ์žก์•„๋จน๊ณ  ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์— ๋Œ€ํ•ด ์˜๋ฌธ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  ์šด์˜ ์ฒด์ œ๋Š” ๋™์‹œ์— ์›ํ•˜๋Š” ๋งŒํผ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ข…์ด์—๋งŒ ํ”„๋กœ์„ธ์Šค์— ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ง€๊ธˆ ์—ฌ๊ธฐ์—์„œ ์š”๊ตฌ๋˜๋Š” ๋ถ€๋ถ„ ๋งŒ ๊ธฐ๋ณธ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์—๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ƒ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์šด์˜ ์ฒด์ œ๋Š” ๊ฐ€์ƒ ๋ฐ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŠน์ • ํฌ๊ธฐ์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ํŽ˜์ด์ง€๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์ฆ‰์‹œ ์šด์˜ ์ฒด์ œ๋Š” ์ด๋ฅผ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ  ์ด๋“ค ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ํŠน์ˆ˜ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šฌ๋กฏ์ด ์—†์œผ๋ฉด ์ด์ „์— ๋กœ๋“œ๋œ ํŽ˜์ด์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋””์Šคํฌ์— ๋ณต์‚ฌ๋˜๊ณ  ์š”์ฒญ๋œ ํŽ˜์ด์ง€๊ฐ€ ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ณง ๋‹ค์‹œ ์„ค๋ช…ํ•  ์ด ์ ˆ์ฐจ๋ฅผ ์Šค์™€ํ•‘์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์„ค๋ช…๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ ์œ„์— ์ฃผ์†Œ๊ฐ€ 0์ธ ํŽ˜์ด์ง€ A๊ฐ€ ๋กœ๋“œ๋˜์–ด ์ฃผ์†Œ๊ฐ€ 4์ธ ์ฃผ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€์— ๋ฐฐ์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์‹ค์€ ์…€ ๋ฒˆํ˜ธ 0์˜ โ€‹โ€‹๋Œ€์‘ํ‘œ์— ๋ฐ˜์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์ด์•ผ๊ธฐ๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ทธ๋“ค์€ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ง€์†์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์™„์ „ํžˆ ๋ฐฐ์น˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์š”์ฒญ ์‹œ์—๋งŒ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŽ˜์ด์ง€์˜ ์ˆ˜์ •์€ ๋””์Šคํฌ์˜ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ”์ดํŠธ๋กœ ์ž‘์—…ํ•˜์—ฌ ํŒŒ์ผ I/O๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์šด์˜ ์ฒด์ œ ์ปค๋„์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์›๋ณธ ํŒŒ์ผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
รข โ‚ฌ <
์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•  ๋•Œ LMDB๊ฐ€ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ผํ•œ ํŒŒ์ผ์— ๋งคํ•‘ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ์‚ฌ์‹ค์ƒ ์šด์˜ ์ฒด์ œ๊ฐ€ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ํŠน์ • ๋ธ”๋ก์„ ์„œ๋กœ ์ „์ด์ ์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ LMDB๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.
รข โ‚ฌ <

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ LMDB๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์“ฐ๊ธฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ํŒŒ์ผ ์ž์ฒด๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ํ‘œ์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋Š” ๋ชจ๋“  ์šด์˜ ์ฒด์ œ์— ๊ณตํ†ต์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ณธ์งˆ์€ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€์ฃผ์˜ํ•œ ์†์ƒ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์‹œ๋‹ค์‹œํ”ผ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์€ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์–ด๋””์—์„œ๋‚˜ ๋ฐ์ดํ„ฐ์— ์ž์œ ๋กญ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ๊ธฐ์–ตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํŒŒ์ผ์„ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ํ‘œ์‹œํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๋ช…๋ น์ด ์ถ”๊ฐ€๋กœ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค์—์„œ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๋ฎ์–ด์“ฐ๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋“ฑ ์‹ค์ˆ˜๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ์ฃผ์†Œ์— ๋งคํ•‘๋œ ํŒŒ์ผ์„ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์‹ ํ˜ธ์™€ ํ•จ๊ป˜ ํ”„๋กœ๊ทธ๋žจ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. SIGSEGV, ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋Š” ์ด๋ฏธ iOS์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๋‚˜ ๋‹ค๋ฅธ ์ถœ์ฒ˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ด๊ฒƒ์ด ์—†์œผ๋ฉด LMDB๋Š” ์ด ๋ชจ๋ฐ”์ผ ์šด์˜ ์ฒด์ œ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์€ ์ด์— ๋Œ€ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

iOS์˜ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ํŠน์„ฑ

2018๋…„ WWDC์—์„œ ๋ฉ‹์ง„ ๋ณด๊ณ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. iOS ๋ฉ”๋ชจ๋ฆฌ ์‹ฌ์ธต ๋ถ„์„. ์ด๋Š” iOS์—์„œ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋”ํ‹ฐ(dirty), ์••์ถ•(compressed) ๋ฐ ํด๋ฆฐ(clean)์˜ 3๊ฐ€์ง€ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์— ์†ํ•จ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

ํด๋ฆฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์›๋ž˜ ์†Œ์Šค์—์„œ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ์ด ์ด ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. iOS๋Š” ํŒŒ์ผ์— ๋งคํ•‘๋œ ํŽ˜์ด์ง€๊ฐ€ ๋””์Šคํฌ์˜ ํŒŒ์ผ๊ณผ ๋™๊ธฐํ™”๋˜๋„๋ก ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“ ์ง€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒŒ์ผ์— ๋งคํ•‘๋œ ํŽ˜์ด์ง€๋ฅผ ์–ธ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
รข โ‚ฌ <
์ˆ˜์ •๋œ ๋ชจ๋“  ํŽ˜์ด์ง€๋Š” ์›๋ž˜ ์œ„์น˜์— ์ƒ๊ด€์—†์ด ๋”ํ‹ฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์™€ ๊ด€๋ จ๋œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ๋กํ•˜์—ฌ ์ˆ˜์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŒŒ์ผ๋„ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋กœ LMDB ์—ด๊ธฐ MDB_WRITEMAP, ๋ณ€๊ฒฝ ํ›„ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ฐจ์ง€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด iOS๋Š” ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๋”ํ‹ฐ ๋ฐ ์••์ถ• ํŽ˜์ด์ง€๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ชจ์Œ์€ ์†Œ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ํŠน์ • ์ž„๊ณ„๊ฐ’์— ๋„๋‹ฌํ•˜๋ฉด OOM ํ‚ฌ๋Ÿฌ ์‹œ์Šคํ…œ ๋ฐ๋ชฌ์ด ํ”„๋กœ์„ธ์Šค ๋’ค์— ์™€์„œ ๊ฐ•์ œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ์Šคํฌํ†ฑ ์šด์˜ ์ฒด์ œ์™€ ๋น„๊ตํ•˜์—ฌ iOS์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋””์Šคํฌ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๊ธฐ๋Šฅ์€ iOS์—์„œ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ทธ ์ด์œ ๋ฅผ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ์ง‘์ค‘์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ชจ๋ฐ”์ผ ์žฅ์น˜์— ๋„ˆ๋ฌด ๋งŽ์€ ์—๋„ˆ์ง€๋ฅผ ์†Œ๋น„ํ•˜๊ฑฐ๋‚˜ iOS๊ฐ€ SSD ๋“œ๋ผ์ด๋ธŒ์— ์…€์„ ๋‹ค์‹œ ์“ฐ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•˜๊ฑฐ๋‚˜ ์„ค๊ณ„์ž๊ฐ€ ์‹œ์Šคํ…œ์˜ ์ „์ฒด ์„ฑ๋Šฅ์— ๋งŒ์กฑํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Š์ž„์—†์ด ๊ตํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ข‹์€ ์†Œ์‹์€ LMDB๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ mmap ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ Œ๋”๋ง๋œ ๋ฐ์ดํ„ฐ๋Š” iOS์—์„œ ํด๋ฆฐ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ธฐ์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” VM Tracker๋ผ๋Š” Xcode ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท์€ ์ž‘๋™ ์ค‘ iOS Cloud ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 2๊ฐœ์˜ LMDB ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ํŒŒ์ผ์„ 1GiB์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” 512MiB์˜€์Šต๋‹ˆ๋‹ค. ๋‘ ์Šคํ† ๋ฆฌ์ง€ ๋ชจ๋‘ ์ผ์ •๋Ÿ‰์˜ ์ƒ์ฃผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜์ง€๋งŒ ์–ด๋Š ์ชฝ๋„ ๋”ํ‹ฐ ํฌ๊ธฐ์— ๊ธฐ์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ด์ œ ๋‚˜์œ ์†Œ์‹์„ ์ „ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. 64๋น„ํŠธ ๋ฐ์Šคํฌํ†ฑ ์šด์˜ ์ฒด์ œ์˜ ์Šค์™‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•๋ถ„์— ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž ์žฌ์ ์ธ ์Šค์™‘์„ ํ—ˆ์šฉํ•˜๋Š” ํ•˜๋“œ ๋””์Šคํฌ์˜ ์—ฌ์œ  ๊ณต๊ฐ„๋งŒํผ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOS์—์„œ ์Šค์™‘์„ ์••์ถ•์œผ๋กœ ๋Œ€์ฒดํ•˜๋ฉด ์ด๋ก ์  ์ตœ๋Œ€๊ฐ’์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ํ™œ์„ฑ ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ(์ฝ๊ธฐ RAM) ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์•„์•ผ ํ•˜๋ฉฐ ๋งž์ง€ ์•Š๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ•์ œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค ๋ณด๊ณ ,์—์„œ ๊ณต์‹ ๋ฌธ์„œ. ๊ฒฐ๊ณผ์ ์œผ๋กœ iOS๋Š” mmap์„ ํ†ตํ•ด ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์—ฌ๊ธฐ์— ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์žฅ์น˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์— ๋Œ€ํ•œ ๊ฒฝํ—˜์  ํ•œ๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ˜„๋Œ€์ ์ธ ์Šค๋งˆํŠธ ํฐ ๋ชจ๋ธ์—์„œ iOS๋Š” 2GB, ์ƒ์œ„ ๋ฒ„์ „์˜ iPad์—์„œ๋Š” 4GB๋กœ ๊ด€๋Œ€ ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ์Šฌํ”ˆ ์ง€์›๋˜๋Š” ๊ฐ€์žฅ ์–ด๋ฆฐ ์žฅ์น˜ ๋ชจ๋ธ์— ์ง‘์ค‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ VM Tracker์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณด๋ฉด LMDB๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ์œ ์ผํ•œ ์ œํ’ˆ์ด ์•„๋‹˜์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ฒญํฌ๋Š” ์‹œ์Šคํ…œ ํ• ๋‹น์ž, ๋ฆฌ์†Œ์Šค ํŒŒ์ผ, ์ด๋ฏธ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๊ธฐํƒ€ ์ž‘์€ ์•ฝํƒˆ์ž์— ์˜ํ•ด ์ž ์‹๋ฉ๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ์—์„œ์˜ ์‹คํ—˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ LMDB์—์„œ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํƒ€ํ˜‘ ๊ฐ’์€ 384๋น„ํŠธ ์žฅ์น˜์˜ ๊ฒฝ์šฐ 32MB, 768๋น„ํŠธ ์žฅ์น˜์˜ ๊ฒฝ์šฐ 64MB์ž…๋‹ˆ๋‹ค. ์ด ๋ณผ๋ฅจ์ด ๋ชจ๋‘ ์‚ฌ์šฉ๋œ ํ›„ ๋ชจ๋“  ์ˆ˜์ • ์ž‘์—…์€ ์ฝ”๋“œ๋กœ ์™„๋ฃŒ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. MDB_MAP_FULL. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ๊ด€์ฐฐํ•˜์ง€๋งŒ ํ˜„ ๋‹จ๊ณ„์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ž‘์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ์—์„œ ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ์ˆ˜๋ช…์ด ๊ธด ํŠธ๋žœ์žญ์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ํ˜„์ƒ์ด ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‚˜๋จธ์ง€ ๋‘ LMDB ๊ณ ๋ž˜๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3.2. ๊ณ ๋ž˜ #2. B+-ํŠธ๋ฆฌ

ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ ์œ„์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋ ค๋ฉด API์— ๋‹ค์Œ ์ž‘์—…์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒˆ ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฃผ์–ด์ง„ ํ‚ค๋กœ ์š”์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์š”์†Œ ์‚ญ์ œ.
  4. ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ‚ค ๊ฐ„๊ฒฉ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค๋„ค ๊ฐ€์ง€ ์ž‘์—…์„ ๋ชจ๋‘ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ํ‚ค์˜ ์ „์ฒด ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํŠธ๋ฆฌ๋กœ ๋‚˜๋ˆ„๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. ์™ผ์ชฝ์—๋Š” ๋ถ€๋ชจ๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์ด ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์—๋Š” ํฐ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ๋œ ํ‚ค ์ง‘ํ•ฉ์„ ์–ป๋Š” ๊ฒƒ์€ ๊ณ ์ „์ ์ธ ํŠธ๋ฆฌ ์ˆœํšŒ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ์—๋Š” ๋””์Šคํฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ํšจ๊ณผ์ ์ด์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ๊ท ํ˜•์˜ ์ •๋„๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ง€์˜ ๋†’์ด๊ฐ€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋ฅผ ์–ป์„ ์ƒ๋‹นํ•œ ์œ„ํ—˜์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์˜ˆ์ƒ๋ณด๋‹ค ๊ฒ€์ƒ‰์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก์„ฑ์„ ํฌ๊ฒŒ ์•…ํ™”์‹œํ‚ต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋…ธ๋“œ ์‚ฌ์ด์˜ ํ’๋ถ€ํ•œ ๊ต์ฐจ ๋งํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๋ฐ•ํƒˆํ•ฉ๋‹ˆ๋‹ค.๊ฐ€๊นŒ์šด ๋…ธ๋“œ(๋‘˜ ์‚ฌ์ด์˜ ๋งํฌ ์ธก๋ฉด์—์„œ)๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŠธ๋ฆฌ์—์„œ ์—ฌ๋Ÿฌ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋‹จ์ˆœ ์ˆœํšŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋น„์Šทํ•œ ์ˆ˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ์บ์‹œ์—์„œ ์ง€์†์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ํšŒ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ €๋ ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ์„œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ํšจ์œจ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ์—์„œ ๋…ธ๋“œ ๊ด€๋ จ ํŽ˜์ด์ง€๋ฅผ ์ž์ฃผ ์˜ฌ๋ฆฌ๋ฉด ์ƒํ™ฉ์ด ์ •๋ง ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. ํ†ตํƒ„ ํ• .

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค์ด์ง„ ํŠธ๋ฆฌ์˜ ์ง„ํ™”์ธ B-ํŠธ๋ฆฌ๋Š” ์ด์ „ ๋‹จ๋ฝ์—์„œ ์‹๋ณ„๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ๊ทธ๋“ค์€ ์ž๊ธฐ ๊ท ํ˜•์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๊ฐ ๋…ธ๋“œ๋Š” ํ•˜์œ„ ํ‚ค ์ง‘ํ•ฉ์„ 2๊ฐ€ ์•„๋‹ˆ๋ผ M ์ˆœ์„œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ  M์˜ ์ˆ˜๋Š” ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ์ •๋„๋กœ ์ƒ๋‹นํžˆ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ์˜ํ•˜์—ฌ:

  1. ๊ฐ ๋…ธ๋“œ์—๋Š” ์ด๋ฏธ ์ •๋ ฌ๋œ ํ‚ค๊ฐ€ ๋งŽ๊ณ  ํŠธ๋ฆฌ๊ฐ€ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  2. ํŠธ๋ฆฌ๋Š” ๊ฐ’์ด ๊ฐ€๊นŒ์šด ํ‚ค๊ฐ€ ํ•˜๋‚˜ ๋˜๋Š” ์ธ์ ‘ํ•œ ๋…ธ๋“œ์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„œ๋กœ ์˜†์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง€์—ญ์„ฑ ์†์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค.
  3. ๊ฒ€์ƒ‰ ์ž‘์—… ์ค‘ ํŠธ๋ฆฌ๋ฅผ ๋‚ด๋ ค๊ฐˆ ๋•Œ ํ†ต๊ณผ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
  4. ๊ฐ ๋…ธ๋“œ์—๋Š” ์ด๋ฏธ ๋งŽ์€ ์ˆ˜์˜ ์ •๋ ฌ๋œ ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฒ”์œ„ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋Œ€์ƒ ๋…ธ๋“œ ์ฝ๊ธฐ ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

LMDB๋Š” B+ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•˜๋Š” B-ํŠธ๋ฆฌ์˜ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์—ฌ๊ธฐ์— ํฌํ•จ๋œ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋…ธ๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. ๋งจ ์œ„์—๋Š” ๋ฃจํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ €์žฅ์†Œ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋… ์ด์ƒ์„ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ LMDB ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ ๋งคํ•‘๋œ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ๊ฐ๊ฐ์€ ์ž์‹ ์˜ ๋ฟŒ๋ฆฌ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์—๋Š” ์žŽ(์žŽ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํ‚ค-๊ฐ’ ์Œ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ๊ทธ๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ด๊ฒƒ์ด B+-ํŠธ๋ฆฌ์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ B-ํŠธ๋ฆฌ๊ฐ€ ๋ชจ๋“  ์ˆ˜์ค€์˜ ๋…ธ๋“œ์— ๊ฐ’ ๋ถ€๋ถ„์„ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ B+-๋ณ€ํ˜•์€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋…ธ๋“œ์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์‹ค์„ ์ˆ˜์ •ํ•œ ๋‹ค์Œ์—๋Š” LMDB์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋ฆฌ์˜ ํ•˜์œ„ ์œ ํ˜•์„ ๋‹จ์ˆœํžˆ B-ํŠธ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ๋ฃจํŠธ์™€ ๋ฆฌํ”„ ์‚ฌ์ด์—๋Š” ํƒ์ƒ‰(๋ถ„๊ธฐ) ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” 0๊ฐœ ์ด์ƒ์˜ ๊ธฐ์ˆ  ์ˆ˜์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ž„๋ฌด๋Š” ๋ฆฌํ”„ ์‚ฌ์ด์— ์ •๋ ฌ๋œ ํ‚ค ์„ธํŠธ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋…ธ๋“œ๋Š” ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋œ ๊ธธ์ด์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์šด์˜ ์ฒด์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ ํฌ๊ธฐ์˜ ๋ฐฐ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ—ค๋”์—๋Š” ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒดํฌ์„ฌ์ด ๊ฐ€์žฅ ํ™•์‹คํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์…€์ด ์žˆ๋Š” ์˜คํ”„์…‹์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์—ญํ• ์€ ํƒ์ƒ‰ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ํ‚ค์ด๊ฑฐ๋‚˜ ์žŽ์˜ ๊ฒฝ์šฐ ์ „์ฒด ํ‚ค-๊ฐ’ ์Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์—์„œ ํŽ˜์ด์ง€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๊ณ ์„ฑ๋Šฅ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ ํ‰๊ฐ€".

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

ํŽ˜์ด์ง€ ๋…ธ๋“œ์˜ ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋‹จ์ˆœํ™”๋œ ๋ฐฉ์‹์œผ๋กœ LMDB B-ํŠธ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€๋Š” ๋””์Šคํฌ์— ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฐ์—ด๋ฉ๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๊ฐ€ ๋†’์€ ํŽ˜์ด์ง€๋Š” ํŒŒ์ผ์˜ ๋ ๋ถ€๋ถ„์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์œ„ ๋ฉ”ํƒ€ ํŽ˜์ด์ง€(meta page)๋Š” ๋ชจ๋“  ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”„์…‹์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์—ด๋ฆฌ๋ฉด LMDB๋Š” ์œ ํšจํ•œ ๋ฉ”ํƒ€ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๋์—์„œ ์ฒ˜์Œ๊นŒ์ง€ ์Šค์บ”ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ด์ œ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ์˜ ๋…ผ๋ฆฌ์  ๋ฐ ๋ฌผ๋ฆฌ์  ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  LMDB์˜ ์„ธ ๋ฒˆ์งธ ๊ณ ๋ž˜๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€ ์ˆ˜์ •์ด ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์‹์œผ๋กœ ์„œ๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด์— ๋‹ค์ค‘ ๋ฒ„์ „ ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

3.3. ๊ณ ๋ž˜ #3. ๊ธฐ๋ก ์ค‘ ๋ณต์‚ฌ

์ผ๋ถ€ B-ํŠธ๋ฆฌ ์ž‘์—…์—๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ „์ฒด ์ผ๋ จ์˜ ๋ณ€๊ฒฝ ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ด๋ฏธ ์ตœ๋Œ€ ์šฉ๋Ÿ‰์— ๋„๋‹ฌํ•œ ๋…ธ๋“œ์— ์ƒˆ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋จผ์ € ๋…ธ๋“œ๋ฅผ ๋‘˜๋กœ ๋ถ„ํ• ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ ๋ถ„๋ฆฌ๋œ ์ƒˆ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋ถ€๋ชจ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ˆ์ฐจ๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ(์ถฉ๋Œ, ์ •์ „ ๋“ฑ) ์‹œ๋ฆฌ์ฆˆ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๋งŒ ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋ฆฌ๊ฐ€ ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‚ด๊ฒฐํ•จ์„ฑ์œผ๋กœ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ๊ธฐ์กด ์†”๋ฃจ์…˜์€ ์ถ”๊ฐ€ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ธ ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ(WAL(Write-Ahead Log)๋ผ๊ณ ๋„ ํ•จ)๋ฅผ B-ํŠธ๋ฆฌ ์˜†์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. B-ํŠธ๋ฆฌ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์˜๋„ํ•œ ์ž‘์—…์ด ๊ธฐ๋ก๋˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๊ฐ€ ์ง„๋‹จ ์ค‘์— ๋ฐ์ดํ„ฐ ์†์ƒ์ด ๊ฐ์ง€๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์Šค์Šค๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

LMDB๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ copy-on-write๋ผ๊ณ  ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ณธ์งˆ์€ ๊ธฐ์กด ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋Œ€์‹  ๋จผ์ € ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์‚ฌ๋ณธ์—์„œ ์ด๋ฏธ ๋ชจ๋“  ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๋˜ํ•œ ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ๊ด€๋ จํ•˜์—ฌ ์ƒ์œ„ ๋…ธ๋“œ์—์„œ ์ตœ์‹ ์ด ๋œ ๋…ธ๋“œ๋กœ์˜ ๋งํฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ์ˆ˜์ •๋„ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด๋‘”๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ๋ฃจํŠธ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์—…๋ฐ์ดํŠธ ์ ˆ์ฐจ ์ค‘์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ถฉ๋Œํ•˜๋ฉด ์ƒˆ ๋ฉ”ํƒ€ ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜์ง€ ์•Š๊ณ  ์ฒดํฌ์„ฌ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์—์„œ ์ƒˆ ํŽ˜์ด์ง€์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด์ „ ํŽ˜์ด์ง€๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด LMDB๊ฐ€ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ตฌ์กฐ๋Š” ๋™์‹œ์— ๊ทธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” LMDB์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ถ”๊ฐ€ ์ „์šฉ B-ํŠธ๋ฆฌ๋ผ๊ณ  ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ตฌ์กฐ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ๋ฐ ๋‹ค์ค‘ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. LMDB์—์„œ ์—ด๋ ค ์žˆ๋Š” ๊ฐ ํŠธ๋žœ์žญ์…˜์—๋Š” ์—ฐ๊ฒฐ๋œ ์ตœ์‹  ํŠธ๋ฆฌ ๋ฃจํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๋Š” ํ•œ ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๋ จ๋œ ํŠธ๋ฆฌ์˜ ํŽ˜์ด์ง€๋Š” ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋กœ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์‹œ์ ์— ๊ด€๋ จ๋˜์—ˆ๋˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ์ •ํ™•ํžˆ ์›ํ•˜๋Š” ๋งŒํผ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ์ €์žฅ์†Œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ํ™œ๋ฐœํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋”๋ผ๋„ ํŠธ๋žœ์žญ์…˜์ด ์—ด๋ฆฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฉ€ํ‹ฐ๋ฒ„์ €๋‹์˜ ํ•ต์‹ฌ์ด๋ฉฐ, LMDB๋ฅผ ์šฐ๋ฆฌ ์‚ฌ๋ž‘ํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ด์ƒ์ ์ธ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. UICollectionView. ํŠธ๋žœ์žญ์…˜์„ ์—ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋Š˜๋ฆด ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ตฌ์กฐ๋กœ ๊ธ‰ํžˆ ํŽŒํ•‘ํ•˜์—ฌ ์•„๋ฌด๊ฒƒ๋„ ๋‚จ๊ธฐ์ง€ ์•Š์„๊นŒ ๋‘๋ ค์›Œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์™„์ „ํ•œ ๊ฒฉ๋ฆฌ๋ฅผ ์ž๋ž‘ํ•  ์ˆ˜ ์—†๋Š” ๋™์ผํ•œ SQLite์™€ LMDB๋ฅผ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž์—์„œ ๋‘ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์„ ์—ด๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜์—์„œ ํŠน์ • ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ๋‚˜๋จธ์ง€ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋” ์ด์ƒ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ „์˜ ์ด๋ฉด์—๋Š” ์ž ์žฌ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” 3๊ฐœ์˜ ์—ด๋ฆฐ ์ฝ๊ธฐ ํŠธ๋žœ์žญ์…˜๊ณผ ๋™์‹œ์— ์ˆ˜์ •๋œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. LMDB๋Š” ์‹ค์ œ ํŠธ๋žœ์žญ์…˜๊ณผ ์—ฐ๊ฒฐ๋œ ๋ฃจํŠธ์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋˜ ๋‹ค๋ฅธ ๋„ค ๋ฒˆ์งธ ๋ฃจํŠธ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๊ทธ ์•„๋ž˜์— ์ˆ˜์ •๋œ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณต์ œํ•  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์—ฌ๊ธฐ์„œ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŒŒ์ผ์— ๋Œ€ํ•œ ์„น์…˜์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ถ”๊ฐ€ ์†Œ๋น„๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ธฐ์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ๊ดด๋กญํžˆ์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— iOS๋Š” ํ• ๋‹น์— ๋งค์šฐ ์ธ์ƒ‰ํ•˜๋ฉฐ ์„œ๋ฒ„ ๋˜๋Š” ๋ฐ์Šคํฌํ†ฑ์—์„œ 1ํ…Œ๋ผ๋ฐ”์ดํŠธ LMDB ์˜์—ญ์„ ๋งˆ์Šคํ„ฐ์˜ ์–ด๊นจ์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ์ˆ˜๋ช…์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์งง๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ํ‚ค-๊ฐ’ API ์œ„์— ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ์„ค๊ณ„

LMDB์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์ถ”์ƒํ™”(ํ™˜๊ฒฝ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ‚ค ๋ฐ ๊ฐ’, ํŠธ๋žœ์žญ์…˜ ๋ฐ ์ปค์„œ)๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ API ๊ตฌ๋ฌธ ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ชฉ๋ก์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ

LMDB ๊ณต๊ฐœ API์˜ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์˜ค๋ฅ˜ ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์ดํ›„์˜ ๋ชจ๋“  ๋ชฉ๋ก์—์„œ๋Š” ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด ํ™•์ธ์„ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ์ž์ฒด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌํฌ C++ ๋ž˜ํผ lmdbxx, ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๋Š” C++ ์˜ˆ์™ธ๋กœ ๊ตฌ์ฒดํ™”๋ฉ๋‹ˆ๋‹ค.

LMDB๋ฅผ iOS ๋˜๋Š” macOS ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ CocoaPod๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. POSLMDB.

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 ์ด์ „์— ์—”์ง„์—์„œ ๋ฐ›์€ ๋ชจ๋“  ์—”ํ„ฐํ‹ฐ(์ปค์„œ, ํŠธ๋žœ์žญ์…˜, ํ‚ค ๋ฐ ๊ฐ’)๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ์‚ฌ๊ฑด์˜ ์ „ํ™˜์„ ์„ค๋ช…ํ•˜๋ฉด ์ƒ๋‹นํ•œ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งค์šฐ ์†Œ์ค‘ํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์ด ํ›จ์”ฌ ์•ž์„œ๊ฐ€๋Š” ํฌํฌ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•  ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MDBX, ์—ฌ๊ธฐ์„œ ์„ ์–ธ๋œ ๊ธฐ๋Šฅ ์ค‘์—๋Š” "์ž๋™ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ ์กฐ์ •"์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ ๋ณด์žฅํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ทœ์ œํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ ์–ด๋„ iOS 10์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์ง€์›์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์œ„์˜ ์˜ˆ์—์„œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์—ด๋ฆฝ๋‹ˆ๋‹ค. MDB_NOTLS. ๋˜ํ•œ, ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์š”๊ตฌ ํฌํฌ C++ ๋ž˜ํผ lmdbxx์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ 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;โ€‹โ€‹

์ €์žฅ์†Œ๋Š” ๋น„๊ต๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉด ์‚ฌ์ „์‹ ์ˆœ์„œ๋กœ ๋ฐ”์ดํŠธ๋ณ„๋กœ ์ •๋ ฌํ•˜๋Š” ๊ธฐ๋ณธ ํ•ญ๋ชฉ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ฑฐ๋ž˜

๊ฑฐ๋ž˜ ์žฅ์น˜๋Š” ์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์žฅ, ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ ์งง์€ ์ค„๋กœ ์ฃผ์š” ์†์„ฑ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๊ธฐ๋ณธ ์†์„ฑ ์ง€์› ACIDํ‚ค์›Œ๋“œ: ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๊ฒฉ๋ฆฌ ๋ฐ ์‹ ๋ขฐ์„ฑ. macOS ๋ฐ iOS์˜ ๋‚ด๊ตฌ์„ฑ ์ธก๋ฉด์—์„œ MDBX์—์„œ ์ˆ˜์ •๋œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋“ค์˜์—์„œ ๋” ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค README.
  2. ๋‹ค์ค‘ ์Šค๋ ˆ๋”ฉ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ "๋‹จ์ผ ์ž‘์„ฑ์ž/๋‹ค์ค‘ ํŒ๋…๊ธฐ" ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์ž‘๊ฐ€๋Š” ์„œ๋กœ๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋งŒ ๋…์ž๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋…์ž๋Š” ์ž‘๊ฐ€๋‚˜ ์„œ๋กœ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜ ์ง€์›.
  4. ๋‹ค์ค‘ ๋ฒ„์ „ ์ง€์›.

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. ํ…Œ์ด๋ธ” ๋ชจ๋ธ๋ง

ํ‚ค ์ˆœ์„œ ์ง€์ • ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ์ถ”์ƒํ™” ์œ„์— ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ์ตœ์ƒ์œ„ ์ถ”์ƒํ™”๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํŒŒ์ผ ๋ฐ ํด๋”์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์บ์‹œ๋˜๋Š” ํด๋ผ์šฐ๋“œ ํด๋ผ์ด์–ธํŠธ์˜ ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์„ ์˜ˆ๋กœ ๋“ค์–ด ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ

ํด๋” ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ์„ ๋ช…ํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ค‘ ํ•˜๋‚˜๋Š” ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ข‹์€ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธ์ ‘ ๋ชฉ๋ก. ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ ์œ„์— ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํŒŒ์ผ ๋ฐ ํด๋”์˜ ํ‚ค๋ฅผ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์†ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Windows ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ํ˜•์‹์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด(ํด๋”๊ฐ€ ๋จผ์ €, ํŒŒ์ผ์ด ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌ๋จ) ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์ถ”๊ฐ€ ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ž‘์—…์— ๋”ฐ๋ผ ํ‚ค๋ฅผ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋จผ์ € ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ ์‹๋ณ„์ž(๋นจ๊ฐ„์ƒ‰)๊ฐ€ ์žˆ๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ๋ฐฐ์น˜๋˜๊ณ  ๊ทธ ๋‹ค์Œ ์œ ํ˜•(๋…น์ƒ‰)์ด ์žˆ๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ๋ฐฐ์น˜๋˜๊ณ  ์ด๋ฏธ ์ด๋ฆ„(ํŒŒ๋ž€์ƒ‰)์ด ์žˆ๋Š” ํ…Œ์ผ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.๊ธฐ๋ณธ LMDB ๋น„๊ต๊ธฐ์— ์˜ํ•ด ์‚ฌ์ „์‹ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•. ๋™์ผํ•œ ๋นจ๊ฐ„์ƒ‰ ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š” ํ‚ค๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด ์ถ”๊ฐ€ ์‚ฌํ›„ ์ฒ˜๋ฆฌ ์—†์ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(์˜ค๋ฅธ์ชฝ)์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ํ‚ค์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค 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 ๊ธฐ๊ธฐ์—์„œ ์ •์ˆ˜ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌํ‹€ ์—”๋””์•ˆ. ์ฆ‰, ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๊ฐ€ ์™ผ์ชฝ์— ์žˆ๊ณ  ๋ฐ”์ดํŠธ ๋‹จ์œ„ ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ˆ˜๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 0์—์„œ 511๊นŒ์ง€์˜ ์ˆซ์ž ์ง‘ํ•ฉ์œผ๋กœ ์ด ์ž‘์—…์„ ์‹œ๋„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

// value (hex dump)
000 (0000)
256 (0001)
001 (0100)
257 (0101)
...
254 (fe00)
510 (fe01)
255 (ff00)
511 (ff01)

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋ฐ”์ดํŠธ ๋น„๊ต๊ธฐ์— ์ ํ•ฉํ•œ ํ˜•์‹์œผ๋กœ ์ •์ˆ˜๋ฅผ ํ‚ค์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์กฑ์˜ ๊ธฐ๋Šฅ์€ ํ•„์š”ํ•œ ๋ณ€ํ˜•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. hton* (ํŠนํžˆ htons ์˜ˆ์—์„œ XNUMX๋ฐ”์ดํŠธ ์ˆซ์ž์˜ ๊ฒฝ์šฐ).

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ˜•์‹์€ ์•„์‹œ๋‹ค์‹œํ”ผ ์ „์ฒด ์—ญ์‚ฌ. ๋ฌธ์ž์—ด์˜ ์˜๋ฏธ์™€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ฝ”๋”ฉ์ด ๋ฌธ์ž๋‹น 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โ€‹
};

๊ทธ๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ํด๋ผ์šฐ๋“œ์˜ ํŒŒ์ผ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•Œ ๋™์ผํ•œ ๊ฐœ์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ง๋ ฌํ™”๋œ ํ‘œํ˜„์„ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์˜ ํ•˜์ด๋ผ์ดํŠธ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ์š”์†Œ๊ฐ€ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ชจ๋ธ๋ง๋œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

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์„ ์–ป์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ชจ๋“  ์•„๋ฆ„๋‹ค์›€์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ๊ธฐ ์ „์šฉ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฝ์šฐ ๊ฐ’ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋‹ซํž ๋•Œ๊นŒ์ง€๋งŒ ์œ ํšจํ•œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐœ์ฒด๊ฐ€ ์ƒ์ฃผํ•˜๋Š” B-ํŠธ๋ฆฌ์˜ ํŽ˜์ด์ง€๋Š” ๊ธฐ๋ก ์ค‘ ๋ณต์‚ฌ ์›์น™ ๋•๋ถ„์— ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ•œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํŽ˜์ด์ง€์™€ ๊ด€๋ จ๋œ ๋งˆ์ง€๋ง‰ ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜๋Š” ์ฆ‰์‹œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ ๋ฐ์ดํ„ฐ์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด๊ฐ€ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐœ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ฝ๊ธฐ ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ ๊ตฌ์กฐ ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋Š” ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ • ์ ˆ์ฐจ(๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ๋˜๋Š” ์‚ญ์ œ)๊นŒ์ง€๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ตฌ์กฐ์ธ๋ฐ๋„ NodeValue ๋ณธ๊ฒฉ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ž˜๋ฆฝ๋‹ˆ๋‹ค ( "์™ธ๋ถ€ ๋น„๊ต๊ธฐ์— ์˜ํ•œ ํ‚ค ์ •๋ ฌ"ํ•˜์œ„ ์„น์…˜ ์ฐธ์กฐ). ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ•„๋“œ์— ์‰ฝ๊ฒŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์—ญ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!
  4. ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋ฐ›์€ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. mdb_put. ๊ทธ๋Ÿฌ๋‚˜์ด ๊ตฌ์กฐ๊ฐ€์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ๋งคํ•‘๋˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋ชจ๋“  ์š•๊ตฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ ์ €์žฅ์†Œ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋‹ค์‹œ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. 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์—์„œ๋Š” ๋™์ผํ•œ ํšจ๊ณผ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ์ทจํ•˜๋‹ค ๊ทธ๋ฆฌ๊ณ  packages ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์˜ ์ตœ์ ํ™”์—๋„ ๊ธฐ์—ฌํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด ๋ฐฉ๋ฒ•์ด ๋ฐ”๋žŒ์งํ•ด ๋ณด์ด์ง€๋งŒ ะฟั€ะธะฒะพะดะธั‚ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ž‘์—… ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

typedef struct __attribute__((packed)) NodeKey {
    uint8_t parentId;
    uint8_t type;
    uint8_t nameLength;
    uint8_t nameBuffer[256];
} NodeKey;

๋ฒ”์œ„ ์ฟผ๋ฆฌ

๋ ˆ์ฝ”๋“œ ๊ทธ๋ฃน์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด LMDB๋Š” ์ปค์„œ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ด๋ฏธ ์นœ์ˆ™ํ•œ ์‚ฌ์šฉ์ž ํด๋ผ์šฐ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ๊ณผ์ •์˜ ์ผ๋ถ€๋กœ ํ•˜์œ„ ํŒŒ์ผ ๋ฐ ํด๋”์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ํ‚ค๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ•˜์œ„ ์„น์…˜์—์„œ๋Š” ํ‚ค๋ฅผ ์ •๋ ฌํ–ˆ์Šต๋‹ˆ๋‹ค. NodeKey ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ID๋กœ ๋จผ์ € ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ ํด๋”์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์€ ์ฃผ์–ด์ง„ ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š” ํ‚ค ๊ทธ๋ฃน์˜ ์œ„์ชฝ ๊ฒฝ๊ณ„์— ์ปค์„œ๋ฅผ ๋†“๊ณ  ์•„๋ž˜์ชฝ ๊ฒฝ๊ณ„๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ˆœ์ฐจ ๊ฒ€์ƒ‰์œผ๋กœ "์ด๋งˆ์—์„œ"์ƒํ•œ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ปค์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ „์ฒด ํ‚ค ๋ชฉ๋ก ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ฐฐ์น˜๋œ ๋‹ค์Œ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ ์‹๋ณ„์ž๊ฐ€ ์žˆ๋Š” ํ‚ค๊ฐ€ ๊ทธ ์•„๋ž˜์— ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ช…๋ฐฑํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฒ€์ƒ‰์˜ ์„ ํ˜• ๋ณต์žก์„ฑ์€ ์•„์‹œ๋‹ค์‹œํ”ผ ์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋ฆฌ, ํŠนํžˆ B-ํŠธ๋ฆฌ์—์„œ ๋กœ๊ทธ ์‹œ๊ฐ„์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ—›๋˜์ด ์›ํ•˜๋Š” ํŽ˜์ด์ง€ ์•ž์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ํŒŒ์ผ์—์„œ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ ์ด๋Š” ๋งค์šฐ ๋น„์Œ‰๋‹ˆ๋‹ค.

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ 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. ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„ ๋ชจ๋ธ๋ง

์ง€๊ธˆ๊นŒ์ง€ ๋‹จ์ผ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๋ฐ ์ž‘์—…์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์€ ๋™์ผํ•œ ์œ ํ˜•์˜ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ •๋ ฌ๋œ ๋ ˆ์ฝ”๋“œ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๊ด€๋ จ ๊ฐ’์„ ์ƒ์ž๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹œ๊ฐ์  ๋‹ค์ด์–ด๊ทธ๋žจ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

รข โ‚ฌ <

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ƒํ™œ์—์„œ ๊ทธ๋ ‡๊ฒŒ ์ ์€ ์–‘์˜ ํ”ผ๋ฅผ ํ˜๋ฆฌ๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฒซ ๋ฒˆ์งธ๋กœ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ ๊ธฐ๋ณธ ํ‚ค์™€ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ํ…Œ์ด๋ธ”์—์„œ ์„ ํƒ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งˆ์ง€๋ง‰ ์„น์…˜์€ ์ƒ์„ฑ ๋ฐ ์ƒํ˜ธ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”

ํด๋ผ์šฐ๋“œ ์•ฑ์—๋Š” "๊ฐค๋Ÿฌ๋ฆฌ" ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํด๋ผ์šฐ๋“œ์˜ ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ ๋ฅผ ๋‚ ์งœ๋ณ„๋กœ ์ •๋ ฌํ•˜์—ฌ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ ํƒ์„ ์ตœ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ํ…Œ์ด๋ธ” ์˜†์— ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๋‚ ์งœ๊ฐ€ ํฌํ•จ๋œ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ์ด ํ•„๋“œ๋Š” ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ‚ค๋Š” ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์˜ ํ‚ค์™€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ์ธ๋ฑ์Šค ํ‚ค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ํ‚ค๋ฅผ ์„œ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ธฐ์ˆ  ํ•„๋“œ tableId๊ฐ€ ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ์˜ ์ตœ์šฐ์„  ์ˆœ์œ„๋กœ ์ง€์ •ํ•จ์œผ๋กœ์จ ๋จผ์ € ํ…Œ์ด๋ธ”๋ณ„๋กœ ํ‚ค๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์ด๋ฏธ ์ž์ฒด ๊ทœ์น™์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ” ๋‚ด๋ถ€์— ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ํ‚ค๋Š” ๊ธฐ๋ณธ ํ‚ค์™€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ‚ค์˜ ๊ฐ’ ๋ถ€๋ถ„ ๋ณต์‚ฌ๋ณธ์„ ์—ฐ๊ฒฐํ•˜์—ฌ ์ด ์†์„ฑ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ด€์ ์—์„œ ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค.

  1. ์ ์œ ๋œ ๊ณต๊ฐ„์˜ ๊ด€์ ์—์„œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ƒ๋‹นํžˆ ํ’๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ฑ๋Šฅ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋…ธ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋‘ ๊ฐœ์˜ ํ‚ค๋ฅผ ๋ฎ์–ด์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ตญ ์ฝ”๋“œ ์ง€์›์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ํ‚ค ์ค‘ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋ผ๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„ ๊ตฌ์„ฑ

์ด ํŒจํ„ด์€ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์„ ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. "๊ฐ’์œผ๋กœ์„œ์˜ ํ‚ค". ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’ ๋ถ€๋ถ„์€ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’ ๋ถ€๋ถ„ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์œ„์— ๋‚˜์—ด๋œ ๋ชจ๋“  ๋‹จ์ ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์š”๊ธˆ์€ ์ธ๋ฑ์Šค ํ‚ค๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ 2๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„์‹์ ์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. "์ค‘๋ณต ํ‚ค". ๊ทธ ๋ณธ์งˆ์€ ์ •๋ ฌ์ด ์•„๋‹Œ ๊ด€๋ จ ํ‚ค๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์†์„ฑ์„ ํ‚ค์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ Mail.ru ํด๋ผ์šฐ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • iOS ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋งฅ๋ฝ์—์„œ ๊ฐ€์ƒ์ด์ง€๋งŒ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ๋ชจ๋ฐ”์ผ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•œ ๋ชจ๋“  ํŒŒ์ผ ๋ฐ ํด๋”๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํŒŒ์ผ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๊ณ  ๊ด€๋ จ ๊ณต๊ฐœ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด(์•ก์„ธ์Šค๊ฐ€ ๋ถ€์—ฌ๋œ ์‚ฌ๋žŒ, ๊ถŒํ•œ ๋“ฑ)๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฌ์šด ํ•ด๊ฒฐ์ฑ…์€ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ํ•ด๋‹น ํ‚ค๋Š” "P" ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™๊ณ  "propname" ์ž๋ฆฌ ํ‘œ์‹œ์ž๋Š” ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๊ฐ’์ธ "public info"๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ƒˆ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ณ ์œ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”์— ์ด๋ฏธ ์ €์žฅ๋œ ํŒŒ์ผ ๋ฐ ํด๋”์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ "๋…ธ๋“œ ID" ๋ฐ "ํƒ€์ž„์Šคํƒฌํ”„" ํ•„๋“œ ํ˜•์‹์œผ๋กœ "P" ํ‚ค์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ข…์ ์œผ๋กœ ๋…ธ๋“œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

LMDB ๊ตฌ์ถ• ๊ฒฐ๊ณผ๋ฅผ ๊ธ์ •์ ์œผ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค. ๊ทธ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •์ง€ ํšŸ์ˆ˜๊ฐ€ 30% ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค LMDB์˜ ํƒ์›”ํ•จ๊ณผ ๋นˆ๊ณค

์ˆ˜ํ–‰ํ•œ ์ž‘์—… ๊ฒฐ๊ณผ iOS ํŒ€ ์™ธ๋ถ€์—์„œ ์‘๋‹ต์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Android ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ "ํŒŒ์ผ" ์„น์…˜ ์ค‘ ํ•˜๋‚˜๋„ LMDB๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜๋˜์—ˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋„ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๊ฐ€ ๊ตฌํ˜„๋œ C ์–ธ์–ด๋Š” ์ดˆ๊ธฐ์— C++ ์–ธ์–ด๋กœ ๊ต์ฐจ ํ”Œ๋žซํผ์„ ์ค‘์‹ฌ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์ข‹์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ C ++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Objective-C ๋ฐ Kotlin์˜ ํ”Œ๋žซํผ ์ฝ”๋“œ์™€ ์›ํ™œํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง„๋‹ˆ ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€