2025๋…„ 10์›” 08์ผยท7๋ถ„ ์ฝ๊ธฐ

์ค‘๋ณต๊ณผ ๊ณต๋ฐฑ์„ ํ”ผํ•˜๋Š” ๋™์‹œ์„ฑ ์•ˆ์ „ ์ฒญ๊ตฌ์„œ ๋ฒˆํ˜ธ ์ง€์ •

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ฒญ๊ตฌ์„œ๋‚˜ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•ด๋„ ์ค‘๋ณต์ด๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ณต๋ฐฑ ์—†์ด ๋™์ž‘ํ•˜๋Š” ์‹ค์šฉ์ ์ธ ํŒจํ„ด์„ ์•Œ์•„๋ณด์„ธ์š”.

์ค‘๋ณต๊ณผ ๊ณต๋ฐฑ์„ ํ”ผํ•˜๋Š” ๋™์‹œ์„ฑ ์•ˆ์ „ ์ฒญ๊ตฌ์„œ ๋ฒˆํ˜ธ ์ง€์ •

๋‘ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ

๋ฐ”์œ ์‚ฌ๋ฌด์‹ค์—์„œ ์˜คํ›„ 4์‹œ 55๋ถ„์„ ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ๋‘ ์‚ฌ๋žŒ์ด ๊ฑฐ์˜ ๊ฐ™์€ ์ˆœ๊ฐ„์— ์ฒญ๊ตฌ์„œ๋ฅผ ๋งˆ์น˜๊ณ  ์ €์žฅ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๋‘ ํ™”๋ฉด ๋ชจ๋‘ ์ž ๊น "์ฒญ๊ตฌ์„œ #1042"๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•œ ๋ ˆ์ฝ”๋“œ๋Š” ์ €์žฅ๋˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‹คํŒจํ•˜๊ฑฐ๋‚˜, ๋” ๋‚˜์˜๊ฒŒ๋Š” ๋‘˜ ๋‹ค ๊ฐ™์€ ๋ฒˆํ˜ธ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ๋ณด์ด๋Š” ์ฆ์ƒ์ž…๋‹ˆ๋‹ค: ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ์ค‘๋ณต ๋ฒˆํ˜ธ.

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

๋‘ ๋ฒˆ์งธ ์ฆ์ƒ์€ ๋” ๋ฏธ๋ฌ˜ํ•ฉ๋‹ˆ๋‹ค: ๋ฒˆํ˜ธ๊ฐ€ ๊ฑด๋„ˆ๋›ฐ์–ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด #1042 ๋‹ค์Œ์— #1044๊ฐ€ ์žˆ๊ณ  #1043์ด ๋น ์ ธ ์žˆ๋Š” ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜๋‚˜ ์žฌ์‹œ๋„ ํ›„์— ์ข…์ข… ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์š”์ฒญ์ด ๋ฒˆํ˜ธ๋ฅผ ์˜ˆ์•ฝํ–ˆ์ง€๋งŒ ์ €์žฅ์ด ๊ฒ€์ฆ ์˜ค๋ฅ˜, ํƒ€์ž„์•„์›ƒ, ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํƒญ์„ ๋‹ซ์•„์„œ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ์žฌ์‹œ๋„ํ•˜๋ฉด์„œ ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๊ฐ€ ์ด๋ฏธ ๋ฒˆํ˜ธ๋ฅผ ์†Œ๋น„ํ–ˆ์Œ์—๋„ ์ƒˆ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฒˆํ˜ธ๊ฐ€ ์–ด๋–ค ๋ณด์žฅ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ์ ˆ๋Œ€ ๋ฐ˜๋ณต๋˜๋ฉด ์•ˆ ๋œ๋‹ค(ํ•ญ์ƒ ๊ณ ์œ )
  • ๋Œ€๋ถ€๋ถ„ ์ฆ๊ฐ€ํ•˜๋ฉด ์ข‹๋‹ค(์žˆ์œผ๋ฉด ์ข‹์Œ)
  • ์ ˆ๋Œ€ ๊ฑด๋„ˆ๋›ฐ๋ฉด ์•ˆ ๋œ๋‹ค(์„ค๊ณ„ํ•  ๊ฒฝ์šฐ์—๋งŒ)

๋ฃฐ์„ ์ •ํ•˜๋ฉด ๊ธฐ์ˆ ์  ์†”๋ฃจ์…˜ ์„ ํƒ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ค‘๋ณต๊ณผ ๊ณต๋ฐฑ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

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

๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ์ €์žฅ์ด ๊ฑฐ์˜ ๋™์‹œ์— ๋ฐœ์ƒํ•  ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋‘ ์š”์ฒญ์ด ์–ด๋А ํ•˜๋‚˜๋„ ์‚ฝ์ž…์„ ๋งˆ์น˜๊ธฐ ์ „์— "๋‹ค์Œ ๋ฒˆํ˜ธ ๊ฐ€์ ธ์˜ค๊ธฐ" ๋‹จ๊ณ„์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ™์€ "๋‹ค์Œ" ๊ฐ’์„ ๋ณด๋ฉด ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ์“ฐ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒฝ์Ÿ ์ƒํƒœ(race condition)์ž…๋‹ˆ๋‹ค: ๊ฒฐ๊ณผ๊ฐ€ ๋กœ์ง์ด ์•„๋‹ˆ๋ผ ํƒ€์ด๋ฐ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ „ํ˜•์ ์ธ ํƒ€์ž„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์š”์ฒญ A๊ฐ€ ๋‹ค์Œ ๋ฒˆํ˜ธ๋ฅผ ์ฝ์Œ: 1042
  • ์š”์ฒญ B๊ฐ€ ๋‹ค์Œ ๋ฒˆํ˜ธ๋ฅผ ์ฝ์Œ: 1042
  • ์š”์ฒญ A๊ฐ€ ์ฒญ๊ตฌ์„œ 1042 ์‚ฝ์ž…
  • ์š”์ฒญ B๊ฐ€ ์ฒญ๊ตฌ์„œ 1042 ์‚ฝ์ž…(๋˜๋Š” ๊ณ ์œ  ์ œ์•ฝ์ด ๋ง‰์•„ ์‹คํŒจ)

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

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

๋ณด์ด์ง€ ์•Š๋Š” ๋™์‹œ์„ฑ์€ ์ด๋ฅผ ๋” ์•…ํ™”์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ "๋‘ ์‚ฌ๋žŒ์ด ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ„"์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ณ‘๋ ฌ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” API ํด๋ผ์ด์–ธํŠธ
  • ๋ฐฐ์น˜๋กœ ์‹คํ–‰๋˜๋Š” ์ž„ํฌํŠธ
  • ์•ผ๊ฐ„์— ์ฒญ๊ตฌ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…
  • ์—ฐ๊ฒฐ์ด ๋ถˆ์•ˆ์ •ํ•œ ๋ชจ๋ฐ”์ผ ์•ฑ์˜ ์žฌ์‹œ๋„

๋”ฐ๋ผ์„œ ๊ทผ๋ณธ ์›์ธ์€: (1) ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๊ฐ™์€ ์นด์šดํ„ฐ ๊ฐ’์„ ์ฝ์„ ๋•Œ์˜ ํƒ€์ด๋ฐ ์ถฉ๋Œ, ๊ทธ๋ฆฌ๊ณ  (2) ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณตํ• ์ง€ ํ™•์‹คํ•˜๊ธฐ ์ „์— ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ์•ˆ์ „ํ•œ ๋ฒˆํ˜ธ ์ง€์ • ๊ณ„ํš์€ ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ํ—ˆ์šฉํ• ์ง€(์ค‘๋ณต ์—†์Œ, ๊ณต๋ฐฑ ์—†์Œ, ๋˜๋Š” ๋‘˜ ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ด๋ฒคํŠธ(์ดˆ์•ˆ, ์žฌ์‹œ๋„, ์ทจ์†Œ)์— ๋Œ€ํ•ด ํ—ˆ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์„ ๊ณ ๋ฅด๊ธฐ ์ „์— ๋ฒˆํ˜ธ ๊ทœ์น™์„ ์ •ํ•˜์„ธ์š”

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

๋ณดํ†ต ํ˜ผ๋™๋˜๋Š” ๋‘ ๋ชฉํ‘œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‹œ์ž‘ํ•˜์„ธ์š”:

  • ๊ณ ์œ (Unique): ๋‘ ์ฒญ๊ตฌ์„œ๋‚˜ ํ‹ฐ์ผ“์ด ๋™์ผํ•œ ๋ฒˆํ˜ธ๋ฅผ ์ ˆ๋Œ€ ๊ณต์œ ํ•˜์ง€ ์•Š์Œ
  • ๊ณต๋ฐฑ ์—†์Œ(Gapless): ๊ณ ์œ ํ•˜๊ณ  ๋˜ํ•œ ์—„๊ฒฉํžˆ ์—ฐ์†์ (๋ˆ„๋ฝ ์—†์Œ)

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

๋‹ค์Œ์œผ๋กœ ์นด์šดํ„ฐ์˜ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜์„ธ์š”. ์ž‘์€ ๋ฌธ๊ตฌ ์ฐจ์ด๊ฐ€ ์„ค๊ณ„๋ฅผ ๋งŽ์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค:

  • ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ธ€๋กœ๋ฒŒ ์‹œํ€€์Šค์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ํšŒ์‚ฌ/ํ…Œ๋„ŒํŠธ๋ณ„๋กœ ๋ถ„๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€?
  • ๋งค๋…„ ๋ฆฌ์…‹ํ•  ๊ฒƒ์ธ๊ฐ€(์˜ˆ: 2026-000123), ์•„๋‹ˆ๋ฉด ์ ˆ๋Œ€ ๋ฆฌ์…‹ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ธ๊ฐ€?
  • ์ฒญ๊ตฌ์„œ vs ์‹ ์šฉ์ „ํ‘œ vs ํ‹ฐ์ผ“ ๋“ฑ ๋ฌธ์„œ ์ข…๋ฅ˜๋ณ„๋กœ ๋‹ค๋ฅธ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?
  • ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•์‹(์ ‘๋‘์‚ฌ, ๊ตฌ๋ถ„์ž)์ด ํ•„์š”ํ•œ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋‚ด๋ถ€์šฉ ์ˆซ์ž๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•œ๊ฐ€?

๊ตฌ์ฒด์  ์˜ˆ: ๋‹ค์ˆ˜ ๊ณ ๊ฐ ํšŒ์‚ฌ๋ฅผ ๊ฐ€์ง„ SaaS ์ œํ’ˆ์€ ํšŒ์‚ฌ๋ณ„๋กœ ๊ณ ์œ ํ•˜๊ณ  ์—ฐ๋„๋ณ„๋กœ ๋ฆฌ์…‹๋˜๋Š” ์ฒญ๊ตฌ์„œ ๋ฒˆํ˜ธ๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‹ฐ์ผ“์€ ์ „์—ญ์—์„œ ๊ณ ์œ ํ•˜๊ณ  ์ ˆ๋Œ€ ๋ฆฌ์…‹ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UI๋Š” ๋น„์Šทํ•ด ๋ณด์—ฌ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ทœ์น™์„ ๊ฐ€์ง„ ๋‘ ์นด์šดํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ง ๊ณต๋ฐฑ ์—†์Œ์„ ์›ํ•œ๋‹ค๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ํ• ๋‹น๋œ ๋’ค ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ• ์ง€ ๋ช…ํ™•ํžˆ ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒญ๊ตฌ์„œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ์ทจ์†Œ๋งŒ ๊ฐ€๋Šฅํ•œ๊ฐ€? ์‚ฌ์šฉ์ž๊ฐ€ ์ดˆ์•ˆ์„ ์ €์žฅํ•  ๋•Œ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ์ตœ์ข… ์Šน์ธ ์‹œ์—๋งŒ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š”๊ฐ€? ์ด๋Ÿฌํ•œ ์„ ํƒ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ˆ ๋ณด๋‹ค ๋” ์ค‘์š”ํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์ „์— ๊ฐ„๋‹จํ•œ ๊ทœ๊ฒฉ์„ ํ•œ ์ค„๋กœ ์ ์–ด๋‘์„ธ์š”:

  • ์–ด๋–ค ๋ ˆ์ฝ”๋“œ ์œ ํ˜•์ด ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
  • ๋ฒˆํ˜ธ๊ฐ€ '์‚ฌ์šฉ๋จ'์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์‹œ์ ์€ ์–ธ์ œ์ธ๊ฐ€(์ดˆ์•ˆ, ๋ฐœํ–‰, ๊ฒฐ์ œ ๋“ฑ)?
  • ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€(๊ธ€๋กœ๋ฒŒ, ํšŒ์‚ฌ๋ณ„, ์—ฐ๋„๋ณ„, ์‹œ๋ฆฌ์ฆˆ๋ณ„)?
  • ๋ฌดํšจ ์ฒ˜๋ฆฌ์™€ ์ˆ˜์ •์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”๊ฐ€?

AppMaster์ฒ˜๋Ÿผ ๋…ธ์ฝ”๋“œ ๋„๊ตฌ์—์„œ๋Š” ์ด๋Ÿฐ ๊ทœ์น™์„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ์˜†์— ๋‘์–ด ํŒ€ ์ „์ฒด๊ฐ€(์›น UI, API, ๋ชจ๋ฐ”์ผ) ๋™์ผํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜์„ธ์š”.

ํ”ํ•œ ์ ‘๊ทผ๋ฒ•๊ณผ ๊ฐ ๋ฐฉ์‹์˜ ๋ณด์žฅ ์‚ฌํ•ญ

์‚ฌ๋žŒ๋“ค์ด "์ฒญ๊ตฌ์„œ ๋ฒˆํ˜ธ ์ง€์ •"์„ ๋งํ•  ๋•Œ ๋ณดํ†ต ๋‘ ๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ๋’ค์„ž์Šต๋‹ˆ๋‹ค: (1) ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ๋‘ ๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ, (2) ๋ฒˆํ˜ธ๊ฐ€ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๊ธฐ. ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์€ ์ฒซ ๋ฒˆ์งธ๋Š” ์‰ฝ๊ฒŒ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ, ์ดˆ์•ˆ ํฌ๊ธฐ, ๋ ˆ์ฝ”๋“œ ๋ฌดํšจ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์–ธ์ œ๋“ ์ง€ ๊ณต๋ฐฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 1: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค (๋น ๋ฅธ ๊ณ ์œ ์„ฑ)

PostgreSQL ์‹œํ€€์Šค๋Š” ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ๋•Œ๋„ ๊ณ ์œ ํ•˜๊ณ  ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋งŽ์€ ๋™์‹œ ์ƒ์„ฑ ์š”์ฒญ์— ๋Œ€ํ•ด ์‹œํ€€์Šค ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ธ‰ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ป๋Š” ๊ฒƒ: ๊ณ ์œ ์„ฑ ๋ฐ ๋Œ€๋ถ€๋ถ„ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ์„ฑ. ์–ป์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ: ๊ณต๋ฐฑ ์—†์Œ. ์‚ฝ์ž…์ด ์‹คํŒจํ•œ ํ›„ ์‹œํ€€์Šค ๊ฐ’์€ ์†Œ๋ชจ๋˜๋ฏ€๋กœ ๊ณต๋ฐฑ์ด ์ƒ๊น๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 2: ๊ณ ์œ  ์ œ์•ฝ + ์žฌ์‹œ๋„ (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งก๊ธฐ๊ธฐ)

์•ฑ ๋กœ์ง์—์„œ ํ›„๋ณด ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•œ ๋’ค, UNIQUE ์ œ์•ฝ์œผ๋กœ ์ค‘๋ณต์„ ๊ฑฐ๋ถ€ํ•˜๋ฉด ์ถฉ๋Œ ์‹œ ์žฌ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ž‘๋™์€ ํ•˜์ง€๋งŒ, ๋†’์€ ๋™์‹œ์„ฑ์—์„œ๋Š” ์†Œ์Œ์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์‹œ๋„๊ฐ€ ๋งŽ์•„์ง€๊ณ  ์‹คํŒจ ํŠธ๋žœ์žญ์…˜์ด ๋Š˜์–ด๋‚˜๋ฉฐ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—„๊ฒฉํ•œ ์˜ˆ์•ฝ ๊ทœ์น™๊ณผ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณต๋ฐฑ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 3: ์ž ๊ธˆ ์žˆ๋Š” ์นด์šดํ„ฐ ํ–‰(๊ณต๋ฐฑ ๋ชฉํ‘œ)

์ •๋ง ๊ณต๋ฐฑ ์—†๋Š” ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ „์šฉ ์นด์šดํ„ฐ ํ…Œ์ด๋ธ”(๋ฒ”์œ„๋ณ„๋กœ ํ•œ ํ–‰)์„ ์‚ฌ์šฉํ•ด ๊ทธ ํ–‰์„ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ž ๊ทธ๊ณ  ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์—์„œ ๊ณต๋ฐฑ์— ๊ฐ€์žฅ ๊ทผ์ ‘ํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค: ๋ชจ๋“  ์ž‘์„ฑ์ž๊ฐ€ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ผ "ํ•ซ์ŠคํŒŸ"์„ ๋งŒ๋“ค๊ณ , ๊ธด ํŠธ๋žœ์žญ์…˜, ํƒ€์ž„์•„์›ƒ, ๋ฐ๋“œ๋ฝ์— ์ทจ์•ฝํ•ด์ง‘๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 4: ๋ณ„๋„์˜ ์˜ˆ์•ฝ ์„œ๋น„์Šค(ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์—๋งŒ)

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

๋Œ€๊ฐ€๋กœ ์šด์˜ ๋ฆฌ์Šคํฌ๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค: ์ถ”๊ฐ€ ์„œ๋น„์Šค๊ฐ€ ์ •ํ™•ํ•˜๊ณ  ๊ณ ๊ฐ€์šฉ์„ฑ, ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•ด์„œ ์ƒ๊ฐํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์‹œํ€€์Šค: ๊ณ ์œ , ๋น ๋ฆ„, ๊ณต๋ฐฑ ํ—ˆ์šฉ
  • ๊ณ ์œ  + ์žฌ์‹œ๋„: ๊ณ ์œ , ๋‚ฎ์€ ๋ถ€ํ•˜์—์„œ ๋‹จ์ˆœ, ๋†’์€ ๋ถ€ํ•˜์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์ž ๊ธˆ ์นด์šดํ„ฐ ํ–‰: ๊ณต๋ฐฑ ๊ฐ€๋Šฅ, ๊ณ ๋™์‹œ์„ฑ์—์„œ ๋А๋ฆผ
  • ๋ณ„๋„ ์„œ๋น„์Šค: ์‹œ์Šคํ…œ ๊ฐ„ ์œ ์—ฐ์„ฑ, ๋ณต์žก๋„์™€ ์‹คํŒจ ๋ชจ๋“œ ์ฆ๊ฐ€

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

๋‹จ๊ณ„๋ณ„: ์‹œํ€€์Šค์™€ ๊ณ ์œ  ์ œ์•ฝ์œผ๋กœ ์ค‘๋ณต ๋ฐฉ์ง€ํ•˜๊ธฐ

๋ถ€์ฑ„ ์—†๋Š” ์‹ค์ œ ์ฝ”๋“œ ํ™•๋ณด
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋‘๊ณ  ํ”„๋กœ๋•์…˜์šฉ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
์ง€๊ธˆ ๊ตฌ์ถ•

์ฃผ ๋ชฉํ‘œ๊ฐ€ ์ค‘๋ณต ๋ฐฉ์ง€(๊ณต๋ฐฑ ๋ณด์žฅ์€ ์•„๋‹˜)๋ผ๋ฉด ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์€: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋‚ด๋ถ€ ID๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ๋ฒˆํ˜ธ๋Š” ๋ณ„๋„ ์—ด์— ๊ณ ์œ  ์ œ์•ฝ์„ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•˜์„ธ์š”. ์กฐ์ธ, ์ˆ˜์ •, ๋‚ด๋ณด๋‚ด๊ธฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ๋‚ด๋ถ€ ๊ฐ’(identity/sequence)์„ ๊ธฐ๋ณธ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ , invoice_no๋‚˜ ticket_no๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ„๋„ ์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

PostgreSQL์—์„œ์˜ ์‹ค์šฉ์  ์„ค์ •

๋‹ค์Œ์€ ๋™์‹œ์„ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ˆ์— ๋‘๋Š” ์ผ๋ฐ˜์ ์ธ PostgreSQL ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์€ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”.

-- Internal, never-shown primary key
create table invoices (
  id bigint generated always as identity primary key,
  invoice_no text not null,
  created_at timestamptz not null default now()
);

-- Business-facing uniqueness guarantee
create unique index invoices_invoice_no_uniq on invoices (invoice_no);

-- Sequence for the visible number
create sequence invoice_no_seq;

์ด์ œ ํ‘œ์‹œ ๋ฒˆํ˜ธ๋Š” INSERT ์‹œ์ ์— ์ƒ์„ฑํ•˜์„ธ์š”(์ ˆ๋Œ€๋กœ select max(invoice_no) + 1์ฒ˜๋Ÿผ ํ•˜์ง€ ๋งˆ์„ธ์š”). ํ•œ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ํŒจํ„ด์€ INSERT ์•ˆ์—์„œ ์‹œํ€€์Šค ๊ฐ’์„ ํฌ๋งทํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

insert into invoices (invoice_no)
values (
  'INV-' || lpad(nextval('invoice_no_seq')::text, 8, '0')
)
returning id, invoice_no;

50๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— "์ฒญ๊ตฌ์„œ ์ƒ์„ฑ"์„ ํด๋ฆญํ•ด๋„ ๊ฐ INSERT๋Š” ๋‹ค๋ฅธ ์‹œํ€€์Šค ๊ฐ’์„ ๋ฐ›๊ณ , ๊ณ ์œ  ์ธ๋ฑ์Šค๊ฐ€ ์šฐ์—ฐํ•œ ์ค‘๋ณต์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค.

์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ

์ผ๋ฐ˜ ์‹œํ€€์Šค์—์„œ๋Š” ์ถฉ๋Œ์ด ๋“œ๋ญ…๋‹ˆ๋‹ค. ์—ฐ๋„๋ณ„ ๋ฆฌ์…‹, ํ…Œ๋„ŒํŠธ๋ณ„, ์‚ฌ์šฉ์ž ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๋ฒˆํ˜ธ ๋“ฑ ์ถ”๊ฐ€ ๊ทœ์น™์„ ๋„์ž…ํ•˜๋ฉด ์ถฉ๋Œ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ์œ  ์ œ์•ฝ์€ ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณ ์œ  ์ œ์•ฝ ์œ„๋ฐ˜ ์‹œ ์ž‘์€ ์žฌ์‹œ๋„ ๋ฃจํ”„๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”. ๋‹จ์ˆœํ•˜๊ณ  ์ œํ•œ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค:

  • ์‚ฝ์ž… ์‹œ๋„
  • invoice_no์— ๋Œ€ํ•œ ๊ณ ์œ  ์ œ์•ฝ ์œ„๋ฐ˜ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ์žฌ์‹œ๋„
  • ์‹œ๋„ ํšŸ์ˆ˜ ์ œํ•œ ํ›„ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ํ‘œ์‹œ

์ด ๋ฐฉ๋ฒ•์€ ์žฌ์‹œ๋„๊ฐ€ ๋น„์ •์ƒ์  ์ƒํ™ฉ(์˜ˆ: ํฌ๋งท ์ถฉ๋Œ)์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ž˜ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ์Ÿ ์ฐฝ(race window)์„ ์ค„์ด์„ธ์š”

๋ฒˆํ˜ธ๋ฅผ UI์—์„œ ๊ณ„์‚ฐํ•˜์ง€ ๋ง๊ณ , ์ฝ๊ณ  ๋‚˜์„œ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜ˆ์•ฝํ•˜์ง€ ๋งˆ์„ธ์š”. ์‚ฝ์ž…๊ณผ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๊น๊ฒŒ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.

AppMaster์™€ PostgreSQL์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, Data Designer์—์„œ id๋ฅผ identity PK๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ  invoice_no์— ๊ณ ์œ  ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•œ ๋’ค ์ƒ์„ฑ ํ๋ฆ„์—์„œ invoice_no๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฝ์ž…๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด PostgreSQL์ด ์ง„์‹ค์˜ ๊ทผ์›์ด ๋˜๊ณ  ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” PostgreSQL์ด ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋‘๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„: ํ–‰ ์ž ๊ธˆ์œผ๋กœ ๊ณต๋ฐฑ ์—†๋Š” ์นด์šดํ„ฐ ๋งŒ๋“ค๊ธฐ

๋ฒˆํ˜ธ ์ •์ฑ…์— ๋งž์ถ”๊ธฐ
ํ…Œ๋„ŒํŠธ๋ณ„, ์—ฐ๋„๋ณ„, ์‹œ๋ฆฌ์ฆˆ๋ณ„ ๋ฒˆํ˜ธ ๊ทœ์น™์„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์— ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜์„ธ์š”.
์•ฑ ์ƒ์„ฑ

์ •๋ง๋กœ ๊ณต๋ฐฑ ์—†๋Š” ๋ฒˆํ˜ธ(๋ฒˆํ˜ธ ๋ˆ„๋ฝ ์—†์Œ)๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ์นด์šดํ„ฐ ํ…Œ์ด๋ธ”๊ณผ ํ–‰ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์•„์ด๋””์–ด๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค: ์ฃผ์–ด์ง„ ๋ฒ”์œ„์—์„œ ๋‹ค์Œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ํ•œ ํŠธ๋žœ์žญ์…˜๋งŒ ํ—ˆ์šฉํ•˜๋ฉด ๋ฒˆํ˜ธ๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜์„ธ์š”. ๋งŽ์€ ํŒ€์ด ํšŒ์‚ฌ๋ณ„, ์—ฐ๋„๋ณ„, ๋˜๋Š” ์‹œ๋ฆฌ์ฆˆ๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ์‹œํ€€์Šค๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ ํ…Œ์ด๋ธ”์€ ๊ฐ ๋ฒ”์œ„์˜ ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ํ–‰ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์šฉ์  ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. number_counters ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  company_id, year, series, last_number ๊ฐ™์€ ์—ด๊ณผ (company_id, year, series)์— ๋Œ€ํ•œ ๊ณ ์œ  ํ‚ค๋ฅผ ๋‘ก๋‹ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  3. SELECT last_number FROM number_counters WHERE ... FOR UPDATE๋กœ ํ•ด๋‹น ๋ฒ”์œ„์˜ ์นด์šดํ„ฐ ํ–‰์„ ์ž ๊ธ‰๋‹ˆ๋‹ค.
  4. next_number = last_number + 1์„ ๊ณ„์‚ฐํ•˜๊ณ  ์นด์šดํ„ฐ ํ–‰์„ last_number = next_number๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  5. next_number๋ฅผ ์‚ฌ์šฉํ•ด ์ธ๋ณด์ด์Šค๋‚˜ ํ‹ฐ์ผ“ ํ–‰์„ ์‚ฝ์ž…ํ•œ ๋’ค ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

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

์ƒˆ๋กœ์šด ๋ฒ”์œ„ ์ดˆ๊ธฐํ™”

์ƒˆ ํšŒ์‚ฌ๋‚˜ ์ƒˆ ์—ฐ๋„, ์ƒˆ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ์ƒ๊ธธ ๋•Œ ์ดˆ๊ธฐํ™” ๊ณ„ํš์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”ํ•œ ๋‘ ์˜ต์…˜์€:

  • ๋ฏธ๋ฆฌ ์นด์šดํ„ฐ ํ–‰์„ ์ƒ์„ฑํ•ด๋‘๊ธฐ(์˜ˆ: 12์›”์— ๋‹ค์Œ ์—ฐ๋„ ํ–‰ ์ƒ์„ฑ)
  • ์˜จ๋””๋งจ๋“œ๋กœ ์ƒ์„ฑ: last_number = 0์œผ๋กœ ์นด์šดํ„ฐ ํ–‰ ์‚ฝ์ž…์„ ์‹œ๋„ํ•˜๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์ •์ƒ์ ์ธ ์ž ๊ธˆ-์ฆ๊ฐ€ ํ๋ฆ„์œผ๋กœ ๋Œ€์ฒด

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

์˜ˆ์™ธ ์ƒํ™ฉ: ์ดˆ์•ˆ, ์‹คํŒจํ•œ ์ €์žฅ, ์ทจ์†Œ, ์ˆ˜์ •

๋Œ€๋ถ€๋ถ„์˜ ๋ฒˆํ˜ธ ๋ฌธ์ œ๋Š” ์ง€์ €๋ถ„ํ•œ ๋ถ€๋ถ„์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค: ๊ฒŒ์‹œ๋˜์ง€ ์•Š์€ ์ดˆ์•ˆ, ์ €์žฅ ์‹คํŒจ, ์ฒญ๊ตฌ์„œ ๋ฌดํšจ ์ฒ˜๋ฆฌ, ๋ˆ„๊ตฐ๊ฐ€ ๋ฒˆํ˜ธ๋ฅผ ๋ณธ ๋’ค ํ–‰ํ•ด์ง„ ์ˆ˜์ • ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ์•ˆ์ „ํ•œ ๋ฒˆํ˜ธ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ์–ธ์ œ "์‹ค์ œ"๊ฐ€ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ทœ์น™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๊ฒฐ์ •์€ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ "์ƒˆ ์ฒญ๊ตฌ์„œ"๋ฅผ ํด๋ฆญํ•˜๋Š” ์ˆœ๊ฐ„ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋ฒ„๋ ค์ง„ ์ดˆ์•ˆ ๋•Œ๋ฌธ์— ๊ณต๋ฐฑ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ฒญ๊ตฌ์„œ๋ฅผ ์ตœ์ข…ํ™”(post/issue)ํ•  ๋•Œ๋งŒ ํ• ๋‹นํ•˜๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ๋” ์ด˜์ด˜ํ•ด์ง€๊ณ  ์„ค๋ช…ํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

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

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

์ˆ˜์ •์€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค: ๋ฒˆํ˜ธ๊ฐ€ ์™ธ๋ถ€์— ๋…ธ์ถœ๋œ ๋’ค์—๋Š” ์˜๊ตฌ์ ์ด๋ผ๊ณ  ์ทจ๊ธ‰ํ•˜์„ธ์š”. ๊ณต์œ ๋˜๊ฑฐ๋‚˜ ๋‚ด๋ณด๋‚ด์ง€๊ฑฐ๋‚˜ ์ธ์‡„๋œ ๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ๋งค๊ธฐ์ง€ ๋งˆ์„ธ์š”. ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋ฉด ์ƒˆ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด์ „ ๊ฒƒ์„ ์ฐธ์กฐ(์˜ˆ: ์‹ ์šฉ ์ „ํ‘œ ๋˜๋Š” ๊ต์ฒด ๋ฌธ์„œ)ํ•˜์„ธ์š”.

๋งŽ์€ ํŒ€์ด ์ฑ„ํƒํ•˜๋Š” ์‹ค์šฉ์  ๊ทœ์น™:

  • ์ดˆ์•ˆ์—๋Š” ์ตœ์ข… ๋ฒˆํ˜ธ ์—†์Œ(๋‚ด๋ถ€ ID ๋˜๋Š” "DRAFT" ์‚ฌ์šฉ)
  • "๊ฒŒ์‹œ/๋ฐœํ–‰" ์‹œ์—๋งŒ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹น, ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ˆ˜ํ–‰
  • ๋ฌดํšจ ์ฒ˜๋ฆฌ/์ทจ์†Œ๋Š” ๋ฒˆํ˜ธ๋ฅผ ์œ ์ง€ํ•˜๋˜ ๋ช…ํ™•ํ•œ ์ƒํƒœ์™€ ์ด์œ ๋ฅผ ๋ถ€์—ฌ
  • ์ธ์‡„/์ด๋ฉ”์ผ๋กœ ์ „๋‹ฌ๋œ ๋ฒˆํ˜ธ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ
  • ์ž„ํฌํŠธ๋Š” ์›๋ณธ ๋ฒˆํ˜ธ ๋ณด์กด ํ›„ ์นด์šดํ„ฐ๋ฅผ ์ตœ๋Œ€๊ฐ’ ์ดํ›„๋กœ ์„ค์ •

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ์ž„ํฌํŠธ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ ์˜ฎ๊ธด๋‹ค๋ฉด ๊ธฐ์กด ๋ฒˆํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋“ค์—ฌ์˜ค๊ณ  ์นด์šดํ„ฐ๋Š” ์ตœ๋Œ€ ๊ฐ€์ ธ์˜จ ๊ฐ’ ์ดํ›„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”. ์—ฌ๋Ÿฌ ํฌ๋งท(์—ฐ๋„๋ณ„ ์ ‘๋‘์‚ฌ ๋“ฑ)์ด ํ˜ผ์žฌํ•˜๋ฉด ํ‘œ์‹œ ๋ฒˆํ˜ธ(display number)๋Š” ์›๋ณธ ๊ทธ๋Œ€๋กœ ๋ณด๊ด€ํ•˜๊ณ  ๋ณ„๋„์˜ ๋‚ด๋ถ€ PK๋ฅผ ์œ ์ง€ํ•˜๋Š” ํŽธ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.

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

์ค‘๋ณต์ด๋‚˜ ๋œป๋ฐ–์˜ ๊ณต๋ฐฑ์„ ์ผ์œผํ‚ค๋Š” ํ”ํ•œ ์‹ค์ˆ˜

์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ณ ์œ ์„ฑ ์ถ”๊ฐ€
๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ PostgreSQL ํ…Œ์ด๋ธ”๊ณผ ๊ณ ์œ  ์ œ์•ฝ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜์„ธ์š”.
๋นŒ๋“œ ์‹œ์ž‘

๋Œ€๋ถ€๋ถ„์˜ ๋ฒˆํ˜ธ ๋ฌธ์ œ๋Š” ๋ฒˆํ˜ธ๋ฅผ ํ‘œ์‹œ๊ฐ’(display value)์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๊ณ  ๊ณต์œ  ์ƒํƒœ(shared state)๋กœ ๋ณด์ง€ ์•Š๋Š” ๋ฐ์„œ ์˜ต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ์ €์žฅํ•˜๋ฉด ๋‹ค์Œ ๋ฒˆํ˜ธ๋ฅผ ๊ฒฐ์ •ํ•  ํ•œ ๊ณณ, ์‹คํŒจ ์‹œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ํ•œ ๊ทœ์น™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ „์  ์‹ค์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ SELECT MAX(number) + 1์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ๋‘ ์š”์ฒญ์ด ์–ด๋А ํ•˜๋‚˜๋„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ๊ฐ™์€ MAX๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ™์€ ๋‹ค์Œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  ์ค‘๋ณต์ด ์ƒ๊น๋‹ˆ๋‹ค. "ํ™•์ธ ํ›„ ์žฌ์‹œ๋„"๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ํ”ผํฌ ํŠธ๋ž˜ํ”ฝ์—์„œ๋Š” ๋ถ€ํ•˜์™€ ์ด์ƒํ•œ ์ŠคํŒŒ์ดํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ค‘๋ณต ์›์ธ์€ ํด๋ผ์ด์–ธํŠธ ์ธก(๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋ชจ๋ฐ”์ผ)์—์„œ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๊ณ , ์ €์žฅ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฒˆํ˜ธ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ ๋ฒˆํ˜ธ๋Š” "์ž„์‹œ ๋ผ๋ฒจ(์˜ˆ: Draft 12)"์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ๊ณต์‹ ์ฒญ๊ตฌ์„œ๋‚˜ ํ‹ฐ์ผ“ ID์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณต๋ฐฑ์€ ์‹œํ€€์Šค๊ฐ€ ๊ณต๋ฐฑ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ํŒ€์„ ๋†€๋ผ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. PostgreSQL ์‹œํ€€์Šค๋Š” ๊ณ ์œ ์„ฑ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๊ณ  ์™„๋ฒฝํ•œ ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ, ID ์„ ํ• ๋‹น(prefetch), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์žฌ์‹œ์ž‘ ๋“ฑ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ง„์งœ ์š”๊ตฌ์‚ฌํ•ญ์ด "์ค‘๋ณต ์—†์Œ"์ด๋ผ๋ฉด ์‹œํ€€์Šค์™€ ๊ณ ์œ  ์ œ์•ฝ์˜ ์กฐํ•ฉ์ด ๋ณดํ†ต ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์ž…๋‹ˆ๋‹ค. ์ง„์งœ๋กœ "๊ณต๋ฐฑ ์—†์Œ"์ด ํ•„์š”ํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ„ด(๋ณดํ†ต ํ–‰ ์ž ๊ธˆ)์ด ํ•„์š”ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋Œ€ํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ตฌํ˜„ ์‹œ ์ ๊ฒ€ํ•  ์‹ค์ˆ˜ ๋ชฉ๋ก:

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

์‹ค์šฉ์  ํ…Œ์ŠคํŠธ ํŒ: 100~1,000๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด ์ค‘๋ณต๊ณผ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ณต๋ฐฑ์„ ํ™•์ธํ•˜์„ธ์š”. ๋…ธ์ฝ”๋“œ ๋„๊ตฌ์—์„œ๋„ ๊ฐ™์€ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค: ์ตœ์ข… ๋ฒˆํ˜ธ๋Š” UI๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜์—์„œ ํ• ๋‹นํ•˜์„ธ์š”.

์ถœ์‹œ ์ „ ๋น ๋ฅธ ์ ๊ฒ€ ๋ชฉ๋ก

ํ•„์š”ํ•  ๋•Œ ๊ณต๋ฐฑ ์—†์ด ์ฒ˜๋ฆฌ
๋‹จ์ผ ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„ ์•ˆ์—์„œ ์นด์šดํ„ฐ ํ–‰๊ณผ FOR UPDATE ์ž ๊ธˆ์„ ๊ตฌํ˜„ํ•˜์„ธ์š”.
์•ฑ ์ƒ์„ฑ

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

์‚ฌ์ „ ์ ๊ฒ€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋ฒˆํ˜ธ ํ•„๋“œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์˜ ๊ณ ์œ  ์ œ์•ฝ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”(๋‹จ์ˆœ UI ๊ฒ€์‚ฌ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑ). ์ถฉ๋Œ ์‹œ ์ด๊ฒƒ์ด ๋งˆ์ง€๋ง‰ ๋ฐฉ์–ด์„ ์ž…๋‹ˆ๋‹ค.
  • ๋ฒˆํ˜ธ ํ• ๋‹น์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋ฒˆํ˜ธ ํ• ๋‹น๊ณผ ์ €์žฅ์ด ์š”์ฒญ ๊ฐ„์— ๋ถ„๋ฆฌ๋˜๋ฉด ๊ฒฐ๊ตญ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต๋ฐฑ ์—†๋Š” ๋ฒˆํ˜ธ๋ฅผ ์š”๊ตฌํ•˜๋ฉด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ตœ์ข…ํ™”ํ•  ๋•Œ๋งŒ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜์„ธ์š”(์˜ˆ: ์ดˆ์•ˆ ์ƒ์„ฑ ์‹œ๊ฐ€ ์•„๋‹˜). ์ดˆ์•ˆ, ๋ฒ„๋ ค์ง„ ํผ, ์‹คํŒจํ•œ ๊ฒฐ์ œ๊ฐ€ ๊ณต๋ฐฑ์˜ ๊ฐ€์žฅ ํ”ํ•œ ์›์ธ์ž…๋‹ˆ๋‹ค.
  • ํฌ๊ท€ํ•œ ์ถฉ๋Œ์— ๋Œ€๋น„ํ•œ ์žฌ์‹œ๋„ ์ „๋žต์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ํ–‰ ์ž ๊ธˆ์ด๋‚˜ ์‹œํ€€์Šค์—์„œ๋„ ์ง๋ ฌํ™” ์˜ค๋ฅ˜, ๋ฐ๋“œ๋ฝ, ๊ณ ์œ  ์œ„๋ฐ˜์ด ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์งง์€ ๋ฐฑ์˜คํ”„๋ฅผ ๋‘” ๊ฐ„๋‹จํ•œ ์žฌ์‹œ๋„๊ฐ€ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • UI, ๊ณต๊ฐœ API, ๋Œ€๋Ÿ‰ ์ž„ํฌํŠธ ๋“ฑ ๋ชจ๋“  ์ง„์ž…์ ์—์„œ 20~100๊ฐœ์˜ ๋™์‹œ ์ƒ์„ฑ์„ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. ํญ๋ฐœ์  ์š”์ฒญ, ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ, ์ด์ค‘ ์ œ์ถœ ๊ฐ™์€ ํ˜„์‹ค์  ํ˜ผํ•ฉ์„ ์‹œํ—˜ํ•˜์„ธ์š”.

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

AppMaster๋กœ ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋ฉด ๊ฐ™์€ ์›์น™์„ ๋”ฐ๋ฅด์„ธ์š”: ๋ฒˆํ˜ธ ํ• ๋‹น์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ๋‘๊ณ  PostgreSQL ์ œ์•ฝ์„ ์‹ ๋ขฐํ•˜๋ฉฐ UI์™€ API ์–‘์ชฝ์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”. ๋งŽ์€ ํŒ€์ด ์ˆ˜๋™ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๋А๋ผ์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ฆฌ๋Š” ์ฒซ๋‚ ์— ๋†€๋ผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์˜ˆ: ๋ถ„์ฃผํ•œ ํ—ฌํ”„๋ฐ์Šคํฌ ํ‹ฐ์ผ“๊ณผ ๋‹ค์Œ ๋‹จ๊ณ„

์›น ์•ฑ์—์„œ ์ƒ๋‹ด์‚ฌ๊ฐ€ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ , ํ†ตํ•ฉ์€ ์ฑ„ํŒ… ๋„๊ตฌ๋‚˜ ์ด๋ฉ”์ผ์—์„œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ƒ์ƒํ•˜์„ธ์š”. ๋ชจ๋‘ T-2026-000123 ๊ฐ™์€ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ , ๊ฐ ๋ฒˆํ˜ธ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ํ‹ฐ์ผ“์„ ๊ฐ€๋ฆฌํ‚ค๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

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

๊ณต๋ฐฑ ์—†๋Š” ๋ฒˆํ˜ธ๋Š” ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๊ณต๋ฐฑ ์—†๋Š” ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํ‹ฐ์ผ“์ด ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ(์ดˆ์•ˆ) ์ตœ์ข… ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ƒํƒœ๋ฅผ Draft๋กœ ๋‘๊ณ  ticket_number๋Š” NULL๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๋Š” ํ‹ฐ์ผ“์„ ์ตœ์ข…ํ™”ํ•  ๋•Œ๋งŒ ํ• ๋‹นํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹คํŒจ๋‚˜ ๋ฒ„๋ฆผ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ญ๋น„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ…Œ์ด๋ธ” ์„ค๊ณ„ ์˜ˆ:

  • tickets: id, created_at, status (Draft, Open, Closed), ticket_number (nullable), finalized_at
  • ticket_counters: key (์˜ˆ: "tickets_2026"), next_number

AppMaster์—์„œ๋Š” ์ด๋ฅผ Data Designer์— PostgreSQL ํƒ€์ž…์œผ๋กœ ๋ชจ๋ธ๋งํ•œ ๋’ค Business Process Editor์—์„œ ๋กœ์ง์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Create Ticket: status=Draft๋กœ ํ‹ฐ์ผ“ ์‚ฝ์ž…(ticket_number ์—†์Œ)
  • Finalize Ticket: ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘, ์นด์šดํ„ฐ ํ–‰ ์ž ๊ธˆ, ticket_number ์„ค์ •, next_number ์ฆ๊ฐ€, ์ปค๋ฐ‹
  • ํ…Œ์ŠคํŠธ: ๋™์‹œ์— ๋‘ ๊ฐœ์˜ "Finalize"๋ฅผ ์‹คํ–‰ํ•ด ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ

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

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
์ค‘๋ณต๊ณผ ๊ณต๋ฐฑ์„ ํ”ผํ•˜๋Š” ๋™์‹œ์„ฑ ์•ˆ์ „ ์ฒญ๊ตฌ์„œ ๋ฒˆํ˜ธ ์ง€์ • | AppMaster