BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

, ์•ˆ๋…• ํ•˜๋ธŒ ๋ฅด!

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

์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์„ ๋ˆ ๊ธฐ์‚ฌ์—์„œ๋Š” ์ง€์ •๋œ ์ง€์—ญ์—์„œ NPO Krista์˜ ๊ฒฝํ—˜๊ณผ ๊ฑด์ถ• ์—ฐ๊ตฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž์˜ ๊ด€์ ์—์„œ ํ†ตํ•ฉ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์˜ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋‹จ์ˆœ์„ฑ ๋’ค์— ์ˆจ๊ฒจ์ง„ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋ถ€์ธ ์„ฑ๋ช…

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

BPM์ด ๊ทธ๊ฒƒ๊ณผ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

  • Conway์˜ ๋ฒ•์น™์˜ ์˜ํ–ฅ์œผ๋กœ;
  • ์ด์ „์— ๋‹ค๋ฅธ ์ œํ’ˆ์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ์žฌ์‚ฌ์šฉํ•œ ๊ฒฐ๊ณผ
  • ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„์ž๊ฐ€ ๊ฒฐ์ •ํ•œ ๋Œ€๋กœ.

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

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

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

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ
์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ
์ด๊ฒƒ์€ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๋ช‡ ๋ฒˆ์˜ ๋ฐ˜๋ณต ํ›„ ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ
๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์€ ๋ถ€๋ถ„

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

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

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

ํ†ตํ•ฉ ํŒจํ„ด์œผ๋กœ์„œ ๋™๊ธฐ ํ˜ธ์ถœ์˜ ๋‹จ์ 

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

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

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

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

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

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

๋ณ„๋„์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ•๋ ฅํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด์ƒ์ด ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ๋™๊ธฐ์‹ ํ†ตํ•ฉ์˜ ์ฃผ์š” ์ด์ ์ธ ๋‹จ์ˆœ์„ฑ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ฑฐ๋ž˜์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ "์‚ฌ๊ฐ€"

๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์ธ๊ธฐ๊ฐ€ ๋†’์•„์ง์— ๋”ฐ๋ผ ์ด์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๊ฐ€ ํŒจํ„ด.

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

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋ชจ๋†€๋ฆฌ์‹ ์‹œ์Šคํ…œ์—์„œ ์ด ํŒจํ„ด์€ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ํ†ตํ•ฉ๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ๊ธด ํŠธ๋žœ์žญ์…˜ ๋ฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์ž ๊ธˆ์œผ๋กœ ์ธํ•œ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์—๋Š” ์ž์ฒด "๊ฐ€๊ฒฉ"๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ชจ๋†€๋ฆฌ์‹ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ "Sags"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ธŒ๋กœ์ปค๊ฐ€ ์žˆ๊ณ  ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ ์™„์ „ํ•œ ์ผ๊ด€์„ฑ์ด ํฌ์ƒ๋œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ๋ฐ ๊ธฐํƒ€ SOA์˜ ๊ฒฝ์šฐ, ํŠนํžˆ ํŽธ๋ฆฌํ•œ API๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์ด ๋‹จ์ ๋ณด๋‹ค ํ›จ์”ฌ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ์ˆ˜์ค€.

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์บก์Šํ™”

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

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

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

๋ณด๋‹ค ์ž์„ธํ•œ ์—ฐ๊ตฌ์—์„œ๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ค‘์š”ํ•œ ๋‹จ์ ์„ ๋ฐํ˜”์Šต๋‹ˆ๋‹ค.

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

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

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

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

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

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์˜ ๊ด€์ ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ํ†ตํ•ฉ

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

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

๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํ†ตํ•ฉ ๋ฒ„์Šค๋ฅผ ํ†ตํ•ด "ํ”Œ๋ ˆ์ด ๋ณผ"์„ ์‹œ์ž‘ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. "Ball"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฉ”์‹œ์ง€๋Š” ๊ณต ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ๊ทœ์น™ :

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ์ƒ์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kotlin์˜ ๋…ผ๋ฆฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์šฉ DSL์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

app1 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฒซ ๋ฒˆ์งธ ํ”Œ๋ ˆ์ด์–ด(๊ทธ๋Š” ๊ฒŒ์ž„์˜ ๊ฐœ์‹œ์ž์ด๊ธฐ๋„ ํ•จ)์˜ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค InitialPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList : ArrayList<PlayerInfo>()

// ะญั‚ะพ ะบะปะฐัั ัะบะทะตะผะฟะปัั€ะฐ ะฟั€ะพั†ะตััะฐ: ะธะฝะบะฐะฟััƒะปะธั€ัƒะตั‚ ะตะณะพ ะฒะฝัƒั‚ั€ะตะฝะฝะตะต ัะพัั‚ะพัะฝะธะต
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
    var playerName: String by persistent("Player1")
    var energy: Int by persistent(30)
    var players: PlayersList by persistent(PlayersList())
    var shotCounter: Int = 0
}

// ะญั‚ะพ ะดะตะบะปะฐั€ะฐั†ะธั ะผะพะดะตะปะธ ะฟั€ะพั†ะตััะฐ: ัะพะทะดะฐะตั‚ัั ะพะดะธะฝ ั€ะฐะท, ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒัะตะผะธ
// ัะบะทะตะผะฟะปัั€ะฐะผะธ ะฟั€ะพั†ะตััะฐ ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒัŽั‰ะตะณะพ ะบะปะฐััะฐ
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
                                                     version = 1) {

    // ะŸะพ ะฟั€ะฐะฒะธะปะฐะผ, ะฟะตั€ะฒั‹ะน ะธะณั€ะพะบ ัะฒะปัะตั‚ัั ะธะฝะธั†ะธะฐั‚ะพั€ะพะผ ะธะณั€ั‹ ะธ ะดะพะปะถะตะฝ ะฑั‹ั‚ัŒ ะตะดะธะฝัั‚ะฒะตะฝะฝั‹ะผ
    uniqueConstraint = UniqueConstraints.singleton

    // ะžะฑัŠัะฒะปัะตะผ ะฐะบั‚ะธะฒะฝะพัั‚ะธ, ะธะท ะบะพั‚ะพั€ั‹ั… ัะพัั‚ะพะธั‚ ะฑะธะทะฝะตั-ะฟั€ะพั†ะตัั
    val sendNewGameSignal = signal<String>("NewGame")
    val sendStopGameSignal = signal<String>("StopGame")
    val startTask = humanTask("Start") {
        taskOperation {
            processCondition { players.size > 0 }
            confirmation { "ะŸะพะดะบะปัŽั‡ะธะปะพััŒ ${players.size} ะธะณั€ะพะบะพะฒ. ะะฐั‡ะธะฝะฐะตะผ?" }
        }
    }
    val stopTask = humanTask("Stop") {
        taskOperation {}
    }
    val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
        players.add(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... join player ${signal.data} ...")
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... player ${signal.data} is out ...")
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val throwStartBall = messageSend<Int>("Ball") {
        messageData = { 1 }
        activation = { selectNextPlayer() }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    // ะขะตะฟะตั€ัŒ ะบะพะฝัั‚ั€ัƒะธั€ัƒะตะผ ะณั€ะฐั„ ะฟั€ะพั†ะตััะฐ ะธะท ะพะฑัŠัะฒะปะตะฝะฝั‹ั… ะฐะบั‚ะธะฒะฝะพัั‚ะตะน
    startFrom(sendNewGameSignal)
            .fork("mainFork") {
                next(startTask)
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut)
                        .branch("checkPlayers") {
                            ifTrue { players.isEmpty() }
                                    .next(sendStopGameSignal)
                                    .terminate()
                            ifElse().next(waitPlayerOut)
                        }
            }
    startTask.fork("afterStart") {
        next(throwStartBall)
                .branch("mainLoop") {
                    ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
                    ifElse().next(waitBall).next(throwBall).loop()
                }
        next(stopTask).next(sendStopGameSignal)
    }

    // ะะฐะฒะตัˆะฐะตะผ ะฝะฐ ะฐะบั‚ะธะฒะฝะพัั‚ะธ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ะต ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะธ ะดะปั ะปะพะณะธั€ะพะฒะฐะฝะธั
    sendNewGameSignal.onExit { println("Let's play!") }
    sendStopGameSignal.onExit { println("Stop!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
    val player = process.players.random()
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

app2๋Š” ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋žœ๋คํ”Œ๋ ˆ์ด์–ด

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RandomPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer", 
                                                   version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!,
                    signal.sender.domain,
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
    val player = if (process.players.isNotEmpty()) 
        process.players.random() 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

๋„ํ‘œ:

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

app3 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ํ–‰๋™์„ ํ•˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋Š” ๋Œ€์‹  ๋ผ์šด๋“œ ๋กœ๋นˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ํ–‰๋™ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค RoundRobinPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RoundRobinPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var nextPlayerIndex: Int by persistent(-1)
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
        name = "RoundRobinPlayer", 
        version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!, 
                    signal.sender.domain, 
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!, 
                signal.sender.domain, 
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
    var idx = process.nextPlayerIndex + 1
    if (idx >= process.players.size) {
        idx = 0
    }
    process.nextPlayerIndex = idx
    val player = if (process.players.isNotEmpty()) 
        process.players[idx] 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”Œ๋ ˆ์ด์–ด์˜ ๋™์ž‘์ด ์ด์ „ ๋™์ž‘๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ํ…Œ์ŠคํŠธ๊ฒŒ์ž„()

@Test
public void testGame() throws InterruptedException {
    String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
    String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
    String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
    String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
    String pl1 = startProcess(app1, "InitialPlayer");
    // ะขะตะฟะตั€ัŒ ะฝัƒะถะฝะพ ะฝะตะผะฝะพะณะพ ะฟะพะดะพะถะดะฐั‚ัŒ, ะฟะพะบะฐ ะธะณั€ะพะบะธ "ะฟะพะทะฝะฐะบะพะผัั‚ัั" ะดั€ัƒะณ ั ะดั€ัƒะณะพะผ.
    // ะ–ะดะฐั‚ัŒ ั‡ะตั€ะตะท sleep - ะฟะปะพั…ะพะต ั€ะตัˆะตะฝะธะต, ะทะฐั‚ะพ ัะฐะผะพะต ะฟั€ะพัั‚ะพะต. 
    // ะะต ะดะตะปะฐะนั‚ะต ั‚ะฐะบ ะฒ ัะตั€ัŒะตะทะฝั‹ั… ั‚ะตัั‚ะฐั…!
    Thread.sleep(1000);
    // ะ—ะฐะฟัƒัะบะฐะตะผ ะธะณั€ัƒ, ะทะฐะบั€ั‹ะฒะฐั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบัƒัŽ ะฐะบั‚ะธะฒะฝะพัั‚ัŒ
    assertTrue(closeTask(app1, pl1, "Start"));
    app1.getWaiting().waitProcessFinished(pl1);
    app2.getWaiting().waitProcessFinished(pl2);
    app2.getWaiting().waitProcessFinished(pl3);
    app3.getWaiting().waitProcessFinished(pl4);
    app3.getWaiting().waitProcessFinished(pl5);
}

private Map<String, Object> playerParams(String name, int energy) {
    Map<String, Object> params = new HashMap<>();
    params.put("playerName", name);
    params.put("energy", energy);
    return params;
}

ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†” ์ถœ๋ ฅ

ะ’ะทัั‚ะฐ ะฑะปะพะบะธั€ะพะฒะบะฐ ะบะปัŽั‡ะฐ lock://app1/process/InitialPlayer
Let's play!
ะกะฝัั‚ะฐ ะฑะปะพะบะธั€ะพะฒะบะฐ ะบะปัŽั‡ะฐ lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!

์ด ๋ชจ๋“  ๊ฒƒ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ฒฐ๋ก ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ์œผ๋กœ ์†”๋ฃจ์…˜์˜ ๋‹ค์–‘ํ•œ ๋ฏธ๋ฌ˜ํ•จ, ํƒ€ํ˜‘ ๋ฐ ๊ธฐํƒ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€

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

BPM ์Šคํƒ€์ผ ํ†ตํ•ฉ

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

ํ†ตํ•ฉ ๋ฒ„์Šค์˜ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ

์‹ ๋ขฐ์„ฑ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์„ ํƒํ•œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ์•„ํ‚คํ…์ฒ˜์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์ด์ž ๋‹จ์ผ ์‹คํŒจ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ๋‚ด๊ฒฐํ•จ์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ง€์›๊ณผ ๋Œ€๊ทœ๋ชจ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์žˆ๋Š” ์˜ค๋žœ ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ๊ตฌํ˜„๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ†ตํ•ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ ์šฉ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์€ ์ œ๊ณตํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค).
  • ๋ธŒ๋กœ์ปค๋Š” "์ ์–ด๋„ ํ•œ ๋ฒˆ" ๋ฐฐ์†ก ๋ณด์ฆ์„ ์ œ๊ณตํ•  ์˜๋ฌด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ†ตํ•ฉ ๋ฒ„์Šค์˜ ์•ˆ์ •์ ์ธ ์ž‘๋™์„ ์œ„ํ•œ ํ•„์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. "์ •ํ™•ํžˆ ํ•œ ๋ฒˆ" ์ˆ˜์ค€ ๋ณด์žฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์‹œ์ง€ ๋˜๋Š” ์ด๋ฒคํŠธ์˜ ๋ฐ˜๋ณต ๋„์ฐฉ์— ๋ฏผ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ํŠน์ˆ˜ ์ž‘์—…์—์„œ๋Š” ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. "๋น„์‹ผ" "๋ณด์ฆ;
  • ๋ฉ”์‹œ์ง€ ๋ฐ ์‹ ํ˜ธ ์ „์†ก์€ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ๋ฐ ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ ๊ณตํ†ต ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํ˜ธํ•˜๋Š” ์˜ต์…˜์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋ณด๋‚ผ ํŽธ์ง€ํ•จ, ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ ํ…Œ์ด๋ธ”๊ณผ ๋ฆด๋ ˆ์ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. JEE ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๊ฒƒ์€ ๋กœ์ปฌ JTA ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ ํƒํ•œ ๋ธŒ๋กœ์ปค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์€ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. XA;
  • ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ ์ด๋ฒคํŠธ์˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋ฉด ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ๋„ ์ทจ์†Œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ „๋‹ฌ๋˜์ง€ ๋ชปํ•œ ๋ฉ”์‹œ์ง€๋Š” ๋ณ„๋„ ์ €์žฅ์†Œ์— ๋ณด๊ด€ D.L.Q. (๋ฐฐ๋‹ฌ ๋Œ€๊ธฐ์—ด). ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ์†์„ฑ๋ณ„๋กœ ์ธ๋ฑ์‹ฑํ•˜๊ณ (๋น ๋ฅธ ๊ทธ๋ฃนํ™” ๋ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด) ๋ฉ”์‹œ์ง€ ๋ณด๊ธฐ, ๋Œ€์ƒ ์ฃผ์†Œ๋กœ ์žฌ์ „์†ก ๋ฐ ๋ฉ”์‹œ์ง€ ์‚ญ์ œ๋ฅผ ์œ„ํ•œ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ณ„๋„์˜ ํ”Œ๋žซํผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๋Š” ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋กœ์ปค ์„ค์ •์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ DLQ์— ๋“ค์–ด๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‹ฌ ์žฌ์‹œ๋„ ํšŸ์ˆ˜์™€ ๋ฐฐ๋‹ฌ ์‚ฌ์ด์˜ ์ง€์—ฐ์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฒฝํ—˜์ ์œผ๋กœ ํ–‰๋™ํ•˜๊ณ  ์กฐ์ •ํ•˜๋Š” ๋™์•ˆ ์ž‘์—…);
  • DLQ ์ €์žฅ์†Œ๋Š” ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์‹ ์†ํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹คํŒจ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ์˜ค๋ฅ˜์˜ "์†์ƒ ์˜์—ญ"์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ํ†ตํ•ฉ ๋ฒ„์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ์‹œ์ ์ธ ๋ถ€์žฌ์— ๋‘”๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ ๊ตฌ๋…์€ ์ง€์† ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ณด์žฅ

๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์˜ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฒ˜๋ฆฌ๋Š” ๋ณ‘๋ ฌ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋‹จ์ˆœํ•˜๊ณ  ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ด ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฐ ์™ธ๋ถ€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

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

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

๊ทธ๋Ÿฌ๋‚˜ ๋น„๊ด€์  ์ž ๊ธˆ์€ ๊ต์ฐฉ ์ƒํƒœ๋กœ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ˜‘ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, SELECT FOR UPDATE๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์˜ ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ์— ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๊ฐ„ ์ œํ•œ์œผ๋กœ ์ œํ•œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์˜ˆ์ œ์—์„œ InitialPlayer ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์—๋Š” ์„ ์–ธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

uniqueConstraint = UniqueConstraints.singleton

๋”ฐ๋ผ์„œ ๋กœ๊ทธ์—๋Š” ํ•ด๋‹น ํ‚ค์˜ ์ž ๊ธˆ์„ ์ทจํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. uniqueConstraint๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ง€์† ์ƒํƒœ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค ๋ฌธ์ œ

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

๋ณ€ํ™”์˜ ๊นŠ์ด์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ–‰๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํ•œ๊ณ„์™€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‚ถ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒฐ์ •์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค.

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

๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

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

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

๋น„์ฆˆ๋‹ˆ์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

  • 18,8%์˜ˆ, ์ €๋Š” ์˜ค๋žซ๋™์•ˆ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • 12,5%๊ท€ํ•˜์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.2

  • 6,2%๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ต์ฒด๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค1

  • 18,8%์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค3

  • 18,8%ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ๋Œ€์ฒ˜ํ•˜๊ธฐ3

  • 25,0%๋‚˜๋งŒ์˜ ๊ธ€ ์“ฐ๊ธฐ4

16๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 7๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

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