Skip to content

System Overview

Won-Kyu Park edited this page Aug 28, 2026 · 2 revisions

์‹œ์Šคํ…œ ๊ฐœ์š”

SimpleRCS๊ฐ€ ๋ญ”๊ฐ€

ํŒŒ์ผ ํ•˜๋‚˜์˜ ๋ฒ„์ „ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ๋”ฑ ๊ทธ๊ฑฐ ํ•˜๋‚˜๋งŒ ํ•œ๋‹ค. Git์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ํŠธ๋ž˜ํ‚นํ•˜๋Š” ์ €์žฅ์†Œ๋„ ์•„๋‹ˆ๊ณ , ๋ธŒ๋žœ์น˜๋„ ์—†๊ณ , ์„œ๋ฒ„๋„ ์—†๋‹ค. SimpleRCS ํด๋ž˜์Šค ํ•˜๋‚˜๋ฅผ ํŒŒ์ผ ๊ฒฝ๋กœ๋‚˜ BytesIO, ํ˜น์€ ํŒŒ์ผ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์•„๋ฌด ๊ฐ์ฒด(BinaryIO)์— ๋ถ™์ด๋ฉด, ๊ทธ ์ŠคํŠธ๋ฆผ ์œ„์— ์ปค๋ฐ‹ ์ด๋ ฅ์„ ์ฐจ๊ณก์ฐจ๊ณก ์Œ“๋Š”๋‹ค.

์™œ ์ด๋Ÿฐ ๊ฒŒ ํ•„์š”ํ•˜๋ƒ๋ฉด โ€” Git์„ ์“ฐ๊ธฐ์—” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฐ ์ƒํ™ฉ์ด ์žˆ๋‹ค. ์œ„ํ‚ค ํŽ˜์ด์ง€ ํ•˜๋‚˜, ์„ค์ • ํŒŒ์ผ ํ•˜๋‚˜, DB ์ปฌ๋Ÿผ์— ๋ฐ•์•„๋„ฃ์„ ๋ฌธ์„œ ํ•˜๋‚˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ, .git ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฑด ๋‚ญ๋น„๋‹ค. SimpleRCS๋Š” ๊ทธ ์ž๋ฆฌ์— ํŒŒ์ผ ํ•˜๋‚˜(ํ˜น์€ DB์˜ BLOB ์ปฌ๋Ÿผ ํ•˜๋‚˜)๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด: ์—ญ๋ฐฉํ–ฅ ๋ธํƒ€

์ „ํ†ต์ ์ธ RCS์™€ ๊ฐ™์€ ๋ฐœ์ƒ์ด๋‹ค. HEAD(์ตœ์‹  ๋ฒ„์ „)๋Š” ํ•ญ์ƒ ์ „์ฒด ํ…์ŠคํŠธ๋กœ ์ €์žฅํ•˜๊ณ , ๊ทธ๋ณด๋‹ค ์˜ค๋ž˜๋œ ๋ฒ„์ „๋“ค์€ "ํ•œ ๋‹จ๊ณ„ ์ตœ์‹  ๋ฒ„์ „์—์„œ ์ด ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•"๋งŒ ๋ธํƒ€๋กœ ์ €์žฅํ•œ๋‹ค.

[V1 ๋ธํƒ€] [V2 ๋ธํƒ€] ... [Vn-1 ๋ธํƒ€] [Vn ์ „์ฒด ํ…์ŠคํŠธ]
                                     ^^^^^^^^^^^^^^
                                     HEAD

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‘ ๊ฐ€์ง€๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋”ฐ๋ผ์˜จ๋‹ค.

  • ์ตœ์‹  ๋ฒ„์ „ ์ฝ๊ธฐ๊ฐ€ ํ•ญ์ƒ ๋น ๋ฅด๋‹ค. ์‹ค๋ฌด์—์„œ ์ œ์ผ ์ž์ฃผ ์ฝ๋Š” ๊ฒŒ ์ตœ์‹  ๋ฒ„์ „์ด๋‹ˆ๊นŒ, ๊ฑฐ๊ธฐ์— ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค. O(1).
  • ๊ณผ๊ฑฐ ๋ฒ„์ „ ์ฝ๊ธฐ๋Š” ๊ฑฐ๋ฆฌ์— ๋น„๋ก€ํ•ด์„œ ๋А๋ ค์ง„๋‹ค. HEAD์—์„œ 5๋ฒ„์ „ ์ „์ด๋ฉด ๋ธํƒ€ 5๊ฐœ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. O(k), k = HEAD์™€์˜ ๊ฑฐ๋ฆฌ.

์ปค๋ฐ‹์ด ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ

commit()์„ ํ˜ธ์ถœํ•˜๋ฉด:

  1. ์ง€๊ธˆ HEAD(์ „์ฒด ํ…์ŠคํŠธ)๋ฅผ ์ฝ๋Š”๋‹ค
  2. "์ƒˆ ๋‚ด์šฉ โ†’ ์ง€๊ธˆ HEAD"๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋ธํƒ€๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค
  3. ๊ธฐ์กด HEAD ๋ธ”๋ก์„ ๊ทธ ๋ธํƒ€๋กœ ๋ฐ”๊พผ๋‹ค (์ „์ฒด ํ…์ŠคํŠธ์˜€๋˜ ๊ฒŒ ๋ธํƒ€๋กœ ๋ฐ”๋€œ)
  4. ์ƒˆ ๋‚ด์šฉ์„ ์ „์ฒด ํ…์ŠคํŠธ๋กœ ๊ทธ ๋’ค์— ๋ถ™์ธ๋‹ค

์ฆ‰ ๋งค ์ปค๋ฐ‹๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์€ "๋งˆ์ง€๋ง‰ ๋ธ”๋ก ํ•˜๋‚˜ + ์ƒˆ ๋ธ”๋ก"๋ฟ์ด๋‹ค. ๊ทธ ์•ž์˜ ๋ชจ๋“  ์ด๋ ฅ์€ ๋ฐ”์ดํŠธ ๊ทธ๋Œ€๋กœ๋‹ค. ํžˆ์Šคํ† ๋ฆฌ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ์“ฐ๋Š” ์ผ์€ ์—†๋‹ค.

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

์ž์„ธํ•œ ์ฝ”๋“œ ๋ ˆ๋ฒจ ์„ค๋ช…์€ Storage Format, ์„ค๊ณ„ ๊ทผ๊ฑฐ์™€ ์‹ค์ธก์€ Plan Atomic Commit์— ์žˆ๋‹ค.

ํ…์ŠคํŠธ์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ

commit()์— str์„ ๋„˜๊ธฐ๋ฉด RCS ์Šคํƒ€์ผ ๋ผ์ธ ๋ธํƒ€(diff -n ๊ณ„์—ด)๋กœ, bytes๋ฅผ ๋„˜๊ธฐ๋ฉด BSDIFF40 ํ˜ธํ™˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจ์น˜๋กœ ์ €์žฅํ•œ๋‹ค. ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๊ทธ๋ƒฅ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋ฉด ๋˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ๋ธํƒ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ธ์ง€๋Š” ํƒ€์ž…๋งŒ ๋ณด๊ณ  ๊ฒฐ์ •ํ•œ๋‹ค. ์ด๋ฏธ์ง€, PDF, ์••์ถ• ํŒŒ์ผ ๊ฐ™์€ ๊ฒƒ๋„ ๊ฐ™์€ .srcs ํฌ๋งท ์•ˆ์— ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋ฌด๊ฒฐ์„ฑ: ํ•ด์‹œ์ฒด์ธ๊ณผ ์„œ๋ช… (v2)

v2 ํฌ๋งท๋ถ€ํ„ฐ๋Š” ๋ธ”๋ก๋งˆ๋‹ค "์ด ๋ธ”๋ก์˜ ๋…ผ๋ฆฌ์  ๋‚ด์šฉ ํ•ด์‹œ + ์ด์ „ ๋ธ”๋ก ํ•ด์‹œ"๋ฅผ ๊ฐ™์ด ์ €์žฅํ•œ๋‹ค. Git์˜ ์ปค๋ฐ‹ ์ฒด์ธ์ด๋ž‘ ๋น„์Šทํ•œ ์ƒ๊ฐ์ด๋‹ค โ€” ๊ณผ๊ฑฐ ์–ด๋А ์‹œ์ ์˜ ๋‚ด์šฉ์„ ์กฐ์ž‘ํ•˜๋ฉด ๊ทธ ๋’ค๋กœ ์ด์–ด์ง€๋Š” ํ•ด์‹œ๊ฐ€ ์ „๋ถ€ ์•ˆ ๋งž๊ฒŒ ๋˜์–ด verify()๋กœ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด GPG ๊ธฐ๋ฐ˜ ๋‹ค์ค‘ ์„œ๋ช…์ž ์„œ๋ช…/๊ฒ€์ฆ๋„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค(simple_rcs_gpg ๋ชจ๋“ˆ).

์‹ค์ œ ์“ฐ์ด๋Š” diff ์—”์ง„์€ ๋”ฐ๋กœ ์žˆ๋‹ค

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์—๋Š” diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค โ€” ๊ทธ๋ฆฌ๋”” ํ•ด์‹œ ๋งค์นญ (StreamSequenceMatcher), ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ Myers ๊ตฌํ˜„, Cython์œผ๋กœ ์ปดํŒŒ์ผํ•œ Myers SES/DMP๊นŒ์ง€. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ commit()/checkout() ๊ฒฝ๋กœ๊ฐ€ ์“ฐ๋Š” ๊ฑด StreamSequenceMatcher ํ•˜๋‚˜๋ฟ์ด๋‹ค โ€” ์ตœ๋‹จ ํŽธ์ง‘ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜์ง„ ์•Š์ง€๋งŒ ๋น ๋ฅด๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๋ฒค์น˜๋งˆํฌยท๋น„๊ต์šฉ์œผ๋กœ ๋‚จ์•„์žˆ๋‹ค. ์™œ ์ด๋ ‡๊ฒŒ ๋๋Š”์ง€, ๋ญ๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ธ์ง€๋Š” Diff Engines์—์„œ ๋‹ค๋ฃฌ๋‹ค.

๋‹ค๋ฅธ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜๋ฉด

ํ•ญ๋ชฉ SimpleRCS ์ „ํ†ต RCS Git ๋‹จ์ˆœ DB ์Šค๋ƒ…์ƒท
์ €์žฅ ๋‹จ์œ„ ์ŠคํŠธ๋ฆผ(ํŒŒ์ผ) ํ•˜๋‚˜ ํŒŒ์ผ(*,v) ํ•˜๋‚˜ ๊ฐ์ฒด DB + ์ž‘์—… ํŠธ๋ฆฌ DB ํ–‰
๋ธํƒ€ ๋ฐฉํ–ฅ ์—ญ๋ฐฉํ–ฅ (HEAD=์ „์ฒด) ์—ญ๋ฐฉํ–ฅ (HEAD=์ „์ฒด) ์Šค๋ƒ…์ƒท (ํŒจํ‚น ์‹œ ๋ธํƒ€) ๋ธํƒ€ ์—†์Œ
์ฝ˜ํ…์ธ  ํ…์ŠคํŠธ + ๋ฐ”์ด๋„ˆ๋ฆฌ ๋™์ผ ํฌ๋งท ํ…์ŠคํŠธ ์ „์šฉ ๋ญ๋“  (blob) ๋ญ๋“ 
๋ฌด๊ฒฐ์„ฑ v2 ํ•ด์‹œ์ฒด์ธ + GPG ์—†์Œ ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ๊ธฐ๋ฐ˜ DB ๋‚˜๋ฆ„
๊ฐฑ์‹  ์›์ž์„ฑ temp + rename (O(ฮด)) temp + rename (O(ํŒŒ์ผ)) ๋ถˆ๋ณ€ ๊ฐ์ฒด + rename ํŠธ๋žœ์žญ์…˜
HEAD ์กฐํšŒ O(1) O(1) O(1) O(1)
๊ณผ๊ฑฐ ์กฐํšŒ O(k) ๋ฐฑ์›Œ๋“œ ์Šค์บ” O(N) ์ˆœ๋ฐฉํ–ฅ O(log N) O(1)

๋” ์ž์„ธํ•œ ๋น„๊ต๋Š” ์ €์žฅ์†Œ ๋ฃจํŠธ์˜ README.md์— ์žˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์ด ์•„๋‹Œ ๊ฒƒ

  • ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค (ํŒŒ์ผ ํ•˜๋‚˜๋‹น ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜)
  • ๋ธŒ๋žœ์น˜/๋จธ์ง€ ๊ฐœ๋…์ด ์—†๋‹ค โ€” ํ•ญ์ƒ ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ
  • ๋™์‹œํŽธ์ง‘ ์ถฉ๋Œ ๊ฐ์ง€๋‚˜ ํŒŒ์ผ ์ž ๊ธˆ์ด ๋‚ด์žฅ๋ผ ์žˆ์ง€ ์•Š๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ™๋Š” ์‹œ์Šคํ…œ(์˜ˆ: ์œ„ํ‚ค) ์œ„์— ์–น์œผ๋ ค๋ฉด ์ด ๋ถ€๋ถ„์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค โ€” ์ž์„ธํ•œ ๋‚ด์šฉ์€ Wiki Backend Design ์ฐธ๊ณ .

Clone this wiki locally