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

๋™์‹œ์„ฑ ์ œ์–ด์˜ ์ค‘์š”์„ฑ

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

  1. Dirty Reads: ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์ด ์ž‘์„ฑํ•œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ.
  2. Non-repeatable Reads: ์‚ฌ์šฉ์ž๊ฐ€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋™์‹œ ์“ฐ๊ธฐ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ๊ฐ’์„ ์ฐพ๋Š” ๊ฒฝ์šฐ.
  3. ํŒฌํ…€ ์ฝ๊ธฐ: ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์—ฌ ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ฝ๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์–ป๋Š” ๊ฒฝ์šฐ.
  4. ์—…๋ฐ์ดํŠธ ์†์‹ค: ๋™์‹œ ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ฒฝํ•ฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์„œ๋กœ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฎ์–ด์“ฐ๋Š” ๊ฒฝ์šฐ.

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

๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ์ˆ 

์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ์ˆ ์ด ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ  ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ž ๊ธˆ: ์ด ๋ฐฉ๋ฒ•์€ ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์ฒด(์˜ˆ: ํ…Œ์ด๋ธ” ๋˜๋Š” ํ–‰)๋ฅผ ์ž ๊ฐ€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ž ๊ธด ๊ฐœ์ฒด๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์˜ ์ž ๊ธˆ์€ ๊ณต์œ  ์ž ๊ธˆ(์—ฌ๋Ÿฌ ๋™์‹œ ์ฝ๊ธฐ ํŠธ๋žœ์žญ์…˜ ํ—ˆ์šฉ)๊ณผ ๋…์  ์ž ๊ธˆ(๋‹จ์ผ ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜์— ์‚ฌ์šฉ)์ž…๋‹ˆ๋‹ค.
  2. ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜: ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ ํŠธ๋žœ์žญ์…˜์— ๊ณ ์œ ํ•œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์€ ํƒ€์ž„์Šคํƒฌํ”„์˜ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ฐ„์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋” ์ด๋ฅธ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ฐ€์ง„ ํŠธ๋žœ์žญ์…˜์ด ๋” ๋Šฆ์€ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ฐ€์ง„ ํŠธ๋žœ์žญ์…˜๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด(OCC): ์ด ๊ธฐ์ˆ ์€ ์ถฉ๋Œ์ด ๋“œ๋ฌผ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ํŠธ๋žœ์žญ์…˜์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ธํ•ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋Œ์ด ๊ฐ์ง€๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ค‘๋‹จ๋˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.
  4. MVCC(Multi-version Concurrency Control): ์ด ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋™์‹œ ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์— ์˜ํ•œ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ •์€ ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด์˜ ์ƒˆ ๋ฒ„์ „์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฒฉ๋ฆฌ ๋ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

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

AppMaster ์˜ ๋™์‹œ์„ฑ ์ œ์–ด

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

AppMaster ์—์„œ ์ƒ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณธ์งˆ์ ์œผ๋กœ PostgreSQL์˜ MVCC ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฒช์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”Œ๋žซํผ์˜ REST API ๋˜๋Š” WSS ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„ ํŠธ๋žœ์žญ์…˜์€ ๊ธฐ๋ณธ ๊ธฐ์ˆ  ์Šคํƒ์— ์˜ํ•ด ์‹œํ–‰๋˜๋Š” ๋™์‹œ์„ฑ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์›น ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ AppMaster ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ Vue3 ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ JS/TS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ , ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ Android์šฉ Jetpack Compose ๋˜๋Š” iOS์šฉ SwiftUI ์‚ฌ์šฉํ•˜๋Š” Kotlin์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋™์‹œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐœ๋ฐœ์ž๋Š” JavaScript์šฉ Promise ๋ฐ async/await ๋˜๋Š” Kotlin์šฉ ์ฝ”๋ฃจํ‹ด ๋ฐ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์ตœ์ ์˜ ์„ฑ๋Šฅ๊ณผ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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