, ์๋ ํ๋ธ ๋ฅด!
์ฐ๋ฆฌ ํ์ฌ๋ ERP๊ธ ์ํํธ์จ์ด ์๋ฃจ์ ๊ฐ๋ฐ์ ์ ๋ฌธ์ผ๋ก ํ๋ฉฐ, EDMS์ ๊ฐ์ ์์ฒญ๋ ์์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ํฌํ๋ก๋ฅผ ๊ฐ์ถ ํธ๋์ญ์ ์์คํ ์ด ๊ฐ์ฅ ํฐ ๋น์ค์ ์ฐจ์งํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ ์ ํ์ ์ต์ ๋ฒ์ ์ JavaEE ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ํ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ ๊ทน์ ์ผ๋ก ์คํํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์๋ฃจ์ ์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋๋ ์์ญ ์ค ํ๋๋ ์ธ์ ๋๋ฉ์ธ๊ณผ ๊ด๋ จ๋ ๋ค์ํ ํ์ ์์คํ ์ ํตํฉ์ ๋๋ค. ํตํฉ ์์ ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ํคํ ์ฒ ์คํ์ผ, ๊ธฐ์ ์คํ ๋ฐ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ํญ์ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ์์ง๋ง ์ต๊ทผ์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ง์ ์ด ์์์ต๋๋ค.
์ฌ๋ฌ๋ถ์ ๊ด์ฌ์ ๋ ๊ธฐ์ฌ์์๋ ์ง์ ๋ ์ง์ญ์์ NPO Krista์ ๊ฒฝํ๊ณผ ๊ฑด์ถ ์ฐ๊ตฌ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๋ํ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์์ ๊ด์ ์์ ํตํฉ ๋ฌธ์ ์ ๋ํ ๊ฐ๋จํ ์๋ฃจ์ ์ ์๋ฅผ ๊ณ ๋ คํ๊ณ ์ด๋ฌํ ๋จ์์ฑ ๋ค์ ์จ๊ฒจ์ง ๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ด ๋๋ค.
๋ถ์ธ ์ฑ๋ช
์ด ๊ธฐ์ฌ์ ์ค๋ช ๋ ์ํคํ ์ฒ ๋ฐ ๊ธฐ์ ์๋ฃจ์ ์ ํน์ ์์ ์ ๋งฅ๋ฝ์์ ๊ฐ์ธ์ ์ธ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ์ด๋ฌํ ์๋ฃจ์ ์ ๋ณดํธ์ ์ด๋ผ๊ณ ์ฃผ์ฅํ์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ์ฉ ์กฐ๊ฑด์์๋ ์ต์ ์ด ์๋ ์ ์์ต๋๋ค.
BPM์ด ๊ทธ๊ฒ๊ณผ ๋ฌด์จ ๊ด๋ จ์ด ์์ต๋๊น?
์ด ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ์๋ฃจ์ ์ ์ ์ฉ ๋ฌธ์ ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ์กฐ๊ธ ํ๊ณ ๋ค ํ์๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ํธ๋์ญ์ ์์คํ ์์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ์ฃผ์ ๋ถ๋ถ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ , ์ด ๋ฐ์ดํฐ๋ฅผ ์๋ ๋ฐ ์๋์ผ๋ก ํ์ธํ๊ณ , ์ผ๋ถ ์ํฌํ๋ก๋ฅผ ํต๊ณผํ๊ณ , ๋ค๋ฅธ ์์คํ /๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค/์์นด์ด๋ธ์ ๊ฒ์ํ๊ณ , ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๊ณ ๊ฐ์ ์ํ ์์คํ ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๋ถ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์๋ํ์ ๋๋ค.
ํธ์์ ํต์ ์์ "๋ฌธ์"๋ผ๋ ์ฉ์ด๋ ํน์ ์ํฌํ๋ก๋ฅผ "์ฐ๊ฒฐ"ํ ์ ์๋ ๊ณตํต ํค๋ก ํตํฉ๋ ๋ฐ์ดํฐ ์งํฉ์ ์ผ๋ถ ์ถ์ํ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ํตํฉ ๋
ผ๋ฆฌ๋ ์ด๋ป์ต๋๊น? ๊ฒฐ๊ตญ ํตํฉ ์์
์ ๊ณ ๊ฐ์ ์์ฒญ์ด ์๋๋ผ ์์ ํ ๋ค๋ฅธ ์์ธ์ ์ํฅ์ ๋ฐ์ ๋ถํ์ผ๋ก "์ ๋จ"๋๋ ์์คํ
์ํคํ
์ฒ์ ์ํด ์์ฑ๋ฉ๋๋ค.
- Conway์ ๋ฒ์น์ ์ํฅ์ผ๋ก;
- ์ด์ ์ ๋ค๋ฅธ ์ ํ์ฉ์ผ๋ก ๊ฐ๋ฐ๋ ํ์ ์์คํ ์ ์ฌ์ฌ์ฉํ ๊ฒฐ๊ณผ
- ๋น๊ธฐ๋ฅ์ ์๊ตฌ ์ฌํญ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ์๊ฐ ๊ฒฐ์ ํ ๋๋ก.
ํตํฉ ์ํฐํฉํธ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ค์ผ์ํค์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ์์คํ ์ ์ํคํ ์ฒ ํ๊ฒฝ์ ํน์ฑ์ ์กฐ์ฌํ์ง ์์๋ ๋๋๋ก ๊ธฐ๋ณธ ์ํฌํ๋ก์ ๋น์ฆ๋์ค ๋ก์ง์์ ํตํฉ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ค๋ ์ ํน์ด ํฝ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ด ์์ง๋ง ์ค์ ๋ก๋ ๋นํจ์จ์ ์ ๋๋ค.
- ํตํฉ ๋ฌธ์ ํด๊ฒฐ์ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์ํฌํ๋ก ๊ตฌํ์ ์ ํ๋ ํ์ฅ ์ง์ ์ผ๋ก ์ธํด ๋๊ธฐ์ ํธ์ถ ํํ์ ๊ฐ์ฅ ๊ฐ๋จํ ์ต์ ์ผ๋ก ๋ด๋ ค๊ฐ๋๋ค(๋๊ธฐ์ ํตํฉ์ ๋จ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ์กฐ).
- ํตํฉ ์ํฐํฉํธ๋ ๋ค๋ฅธ ํ์ ์์คํ ์ ํผ๋๋ฐฑ์ด ํ์ํ ๋ ์ฌ์ ํ ์ฃผ์ ๋น์ฆ๋์ค ๋ก์ง์ ์นจํฌํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ ํตํฉ์ ๋ฌด์ํ๊ณ ์ํฌํ๋ก๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฝ๊ฒ ์ค๋จํ ์ ์์ต๋๋ค.
- ์์คํ ์ ์ฌ์ฉ์์ ๊ด์ ์์ ๋ ์ด์ ํ๋์ ์ ์ฒด๊ฐ ์๋๋ฉฐ, ํ์ ์์คํ ๊ฐ์ "์ด์์"๊ฐ ๋์ ๋๊ณ , ํ ํ์ ์์คํ ์์ ๋ค๋ฅธ ํ์ ์์คํ ์ผ๋ก ๋ฐ์ดํฐ ์ ์ก์ ์์ํ๋ ์ค๋ณต ์ฌ์ฉ์ ์์ ์ด ๋ํ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ํตํฉ ์ํธ ์์ฉ์ ํต์ฌ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ๋ฐ ์ํฌํ๋ก์ ํ์์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ๊ธฐ์ ์๊ตฌ ์ฌํญ์ด ๊ธ์ฆํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ์๋ฃจ์ ์ ํ์ ์ํ ์ต์ํ์ ์ต์ ์ผ๋ก ์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ์๋ก์ด ํตํฉ ์ํธ ์์ฉ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ณด์ด๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ต์ต๋๋ค. ๋๊ตฌ๋ ์ฌ์ฉ์์๊ฒ ํ์ํ ๋ค์ํ ์ต์ ์ ์ ๊ณตํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋ ฅํด์ผ ํ๋ฉฐ ๋์์ ๋ฐ์ ์ด์ ๋ง์ ์ ์์ด์ผ ํฉ๋๋ค. ์์ง๋์ด๊ฐ ํตํฉ ์์ ์ ๋งฅ๋ฝ์์ ๋๋ตํด์ผ ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ์ผ์ ์์ ์์ ์๊ฐํด์๋ ์ ๋๋ ๋ง์ ์ง๋ฌธ์ด ์์ต๋๋ค. ์ ํ ๋ฐ ์ปจํ ์คํธ ์ ํ ๋ฑ ์ด๋ฌํ ๋ชจ๋ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์ด๋ฏธ ์จ๊ฒจ์ ธ ์๋ ๋งค์ฐ ๊ฐ๋จํ ๊ฒฐ์ ํ ํ๋ฆฟ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ํจํด์ ์ถฉ๋ถํ ์์ ํด์ผ ํฉ๋๋ค. ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๊ฐ ๋งค์ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ์ด ์ฆ๊ฐํ๊ณ ์ค๋ฅ ๋น์ฉ์ ์๋นํ ๋ฎ์ ์์ค์ผ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ BPM์ด ๊ทธ๊ฒ๊ณผ ๋ฌด์จ ๊ด๋ จ์ด ์์ต๋๊น? ์ํฌํ๋ก์ฐ ๊ตฌํ์ ์ํ ๋ง์ ์ต์
์ด ์์ต๋๋ค...
์ค์ ๋ก ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๋ ๋ค๋ฅธ ๊ตฌํ์ ์ํ ์ ํ ๋ค์ด์ด๊ทธ๋จ์ ์ ์ธ์ ์ค์ ๊ณผ ์ ํ์ ๋ํ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ๊ฐ ์๋ ํธ๋ค๋ฌ ์ฐ๊ฒฐ์ ํตํด ์๋ฃจ์
์์ ๋งค์ฐ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค. ๋์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์์ "๋ฌธ์"์ ํ์ฌ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ์ํ๋ "๋ฌธ์" ์์ฒด์ ์์ฑ์
๋๋ค.
์ด๊ฒ์ด ํ๋ก์ ํธ ์์ ์ ํ๋ก์ธ์ค์ ๋ชจ์ต์
๋๋ค.
์ด๋ฌํ ๊ตฌํ์ ์ธ๊ธฐ๋ ์ ํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์์ฑ์ ์๋์ ๋จ์์ฑ๊ณผ ์๋ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ํํธ์จ์ด ์์คํ ์ด ๋์ฑ ๋ณต์กํด์ง์ ๋ฐ๋ผ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์๋ํ๋ ๋ถ๋ถ์ด ์ปค์ง๊ณ ๋ณต์กํด์ง๋๋ค. ๊ฐ ๋ถ๊ธฐ๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋๋๋ก ๋ถํด, ํ๋ก์ธ์ค ์ผ๋ถ์ ์ฌ์ฌ์ฉ ๋ฐ ๋ถ๊ธฐ ํ๋ก์ธ์ค๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์์ ๋๊ตฌ๋ ๋ถํธํด์ง๊ณ ์ํ ์ ์ด ๋ค์ด์ด๊ทธ๋จ์ ์ ๋ณด ์ฝํ ์ธ ๋ฅผ ์์ต๋๋ค(ํตํฉ ์ํธ ์์ฉ์ ๋ค์ด์ด๊ทธ๋จ์ ์ ํ ๋ฐ์๋์ง ์์).
์ด๊ฒ์ ์๊ตฌ ์ฌํญ์ ๋ช
ํํ ํ๋ ๋ช ๋ฒ์ ๋ฐ๋ณต ํ ํ๋ก์ธ์ค์ ๋ชจ์ต์
๋๋ค.
์ด ์ํฉ์์ ๋ฒ์ด๋๋ ๋ฐฉ๋ฒ์ ์์ง์ ํตํฉ์ด์์ต๋๋ค.
๋ณต์กํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์์ ๋ถ๋ถ
์ฅ๊ธฐ์ ์ผ๋ก ์๋ฃจ์ ์ ๊ธฐ๋์ ๋ถ์ํ์ง ๋ชปํ์ต๋๋ค. ์๊ฐ์ ๋๊ตฌ๋ฅผ ํตํด ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋์ ๋ ธ๋ ๊ฐ๋๋ก ์ธํด ์์ฉ ๊ฐ๋ฅํ ์์ฐ์ฑ ์งํ๋ฅผ ๋ฌ์ฑํ ์ ์์๊ณ ๋๊ตฌ ์์ฒด๊ฐ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ๊ฐ์ฅ ์ซ์ดํ๋ ๋๊ตฌ ์ค ํ๋๊ฐ ๋์์ต๋๋ค. ์์ง์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ๋ถ๋ง๋ ์์๊ณ ์ด๋ก ์ธํด ๋ง์ "ํจ์น"์ "๋ชฉ๋ฐ"์ด ๋ฑ์ฅํ์ต๋๋ค.
jBPM ์ฌ์ฉ์ ๊ฐ์ฅ ๊ธ์ ์ ์ธ ์ธก๋ฉด์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค์ ๋ํด ์์ฒด์ ์ธ ์ง์ ์ํ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ด์ ๊ณผ ํด๋ก์์ ๊นจ๋ซ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ ํธ์ ๋ฉ์์ง๋ฅผ ํตํ ๋น๋๊ธฐ ์ํธ ์์ฉ์ ์ฌ์ฉํ์ฌ ์๋ก ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋ณต์กํ ํตํฉ ํ๋กํ ์ฝ์ ๊ตฌํํ๊ธฐ ์ํด ํ๋ก์ธ์ค ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ํ์ธํ์ต๋๋ค. ์ง์ ์ํ์ ์กด์ฌ๋ ์ฌ๊ธฐ์ ๊ฒฐ์ ์ ์ธ ์ญํ ์ ํฉ๋๋ค.
์์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค. BPM ์คํ์ผ์ ํ๋ก์ธ์ค ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ฐ๋ฆฌ๋ ์ ์ ๋ ๋ณต์กํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๊ธฐ ์ํ ๊ด๋ฒ์ํ ์์ ์ ํด๊ฒฐํ ์ ์๊ณ ํตํฉ ํ๋์ ์ด๋ฌํ ํ๋ก์ธ์ค์ ์กฐํ๋กญ๊ฒ ๋ง์ถ ์ ์์ผ๋ฉฐ ๊ตฌํ๋ ํ๋ก์ธ์ค๋ฅผ ์ ์ ํ ํ๊ธฐ๋ฒ์ผ๋ก ์๊ฐ์ ์ผ๋ก ํ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.
ํตํฉ ํจํด์ผ๋ก์ ๋๊ธฐ ํธ์ถ์ ๋จ์
๋๊ธฐ์ ํตํฉ์ ๊ฐ์ฅ ๋จ์ํ ์ฐจ๋จ ํธ์ถ์ ์๋ฏธํฉ๋๋ค. ํ๋์ ํ์ ์์คํ ์ ์๋ฒ ์ธก ์ญํ ์ ํ๋ฉฐ ์ํ๋ ๋ฉ์๋๋ก API๋ฅผ ๋ ธ์ถํฉ๋๋ค. ๋ ๋ค๋ฅธ ํ์ ์์คํ ์ ํด๋ผ์ด์ธํธ ์ธก ์ญํ ์ ํ๋ฉฐ ์ ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ํ์ฌ ํธ์ถํฉ๋๋ค. ์์คํ ์ ์ํคํ ์ฒ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ธก์ ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ํ๋ก์ธ์ค ๋๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ํธ์คํ ๋ ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ์ผ๋ถ RPC ๊ตฌํ์ ์ ์ฉํ๊ณ ๋งค๊ฐ๋ณ์ ๋ง์ฌ๋ง๊ณผ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ํตํฉ ํจํด์๋ ์๋นํ ํฐ ๋จ์ ์ด ์์ง๋ง ๋จ์์ฑ์ผ๋ก ์ธํด ์ค์ ๋ก ๋งค์ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ๊ตฌํ ์๋๋ ๊ธฐํ์ "์๋ชจ"ํ๋ ์กฐ๊ฑด์์ ์๋ฃจ์ ์ ๊ธฐ์ ๋ถ์ฑ์ ์์ฑํ๋ ์กฐ๊ฑด์์ ๊ณ์ํด์ ์ ์ฉํ๊ณ ์ ์ฉํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฝํ์ด ๋ถ์กฑํ ๊ฐ๋ฐ์๊ฐ ๋ถ์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊นจ๋ซ์ง ๋ชปํ๊ณ ๋ฌด์์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
ํ์ ์์คํ ์ ์ฐ๊ฒฐ์ฑ์ด ๊ฐ์ฅ ๋์ ๋๊ฒ ์ฆ๊ฐํ๋ ๊ฒ ์ธ์๋ "ํ์ฐ" ๋ฐ "์คํธ๋ ์นญ" ํธ๋์ญ์ ๊ณผ ๊ด๋ จ๋ ๋ ๋ถ๋ช ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ค์ ๋ก ๋น์ฆ๋์ค ๋ก์ง์ด ๋ณ๊ฒฝ๋๋ฉด ํธ๋์ญ์ ์ ํ์๋ถ๊ฐ๊ฒฐํ๋ฉฐ ํธ๋์ญ์ ์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ๋ ํน์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค๋ฅผ ์ ๊ธ๋๋ค. ์ฆ, ํ ํ์ ์์คํ ์ด ๋ค๋ฅธ ํ์ ์์คํ ์ ์๋ต์ ๊ธฐ๋ค๋ฆด ๋๊น์ง ํธ๋์ญ์ ์ ์๋ฃํ๊ณ ์ ๊ธ์ ํด์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ์ํฅ์ ์ํ์ ํฌ๊ฒ ์ฆ๊ฐ์ํต๋๋ค.
- ์์คํ ์๋ต์ฑ์ด ์์ค๋๊ณ ์ฌ์ฉ์๋ ์์ฒญ์ ๋ํ ์๋ต์ ์ค๋ ๊ธฐ๋ค๋ฆฝ๋๋ค.
- ์๋ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฒํ๋ก๋ ์ค๋ ๋ ํ๋ก ์ธํด ์ฌ์ฉ์ ์์ฒญ์ ๋ํ ์๋ต์ ์ค์งํฉ๋๋ค. ๋๋ถ๋ถ์ ์ค๋ ๋๋ ํธ๋์ญ์ ์ด ์ฐจ์งํ๋ ๋ฆฌ์์ค์ ์ ๊ธ์ "๋๊ธฐ"ํฉ๋๋ค.
- ๊ต์ฐฉ ์ํ๊ฐ ๋ํ๋๊ธฐ ์์ํฉ๋๋ค. ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ ํธ๋์ญ์ ๊ธฐ๊ฐ, ํธ๋์ญ์ ๊ณผ ๊ด๋ จ๋ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ๋ฐ ์ ๊ธ์ ์์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค.
- ํธ๋์ญ์ ์๊ฐ ์ด๊ณผ ๋ง๋ฃ ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค.
- ์์ ์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์๋ฒ๋ OutOfMemory์ "๋จ์ด์ง๋๋ค". ๋๊ธฐ์ ํตํฉ์ ์กด์ฌ๋ก ์ธํด ์ฒ๋ฆฌ๋ฅผ "๊ฐ๋ฒผ์ด" ํธ๋์ญ์ ์ผ๋ก ๋ถํ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
์ํคํ ์ฒ ๊ด์ ์์ ๋ณผ ๋ ํตํฉ ์ค์ ์ฐจ๋จ ํธ์ถ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ณ ํ์ ์์คํ ์ ํ์ง ๊ด๋ฆฌ๊ฐ ์์ค๋ฉ๋๋ค. ํ ํ์ ์์คํ ์ ํ์ง ๋ชฉํ๋ฅผ ๋ค๋ฅธ ํ์ ์์คํ ์ ํ์ง ๋ชฉํ์ ๋ถ๋ฆฌํ์ฌ ๋ณด์ฅํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ์ ์์คํ ์ด ๋ค๋ฅธ ํ์์ ๊ฐ๋ฐ๋๋ฉด ํฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
ํตํฉ ์ค์ธ ํ์ ์์คํ ์ด ์๋ก ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๊ณ ์์ชฝ์์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ํฉ์ด ๋์ฑ ํฅ๋ฏธ๋ก์์ง๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ํธ๋์ญ์ ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ณ๋์ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ๊ฐ๋ ฅํ ์์ธ ์ฒ๋ฆฌ ๋ฐ ๋ณด์์ด ์ ๊ณต๋์ด์ผ ํ๋ฉฐ ์ด๋ ๋๊ธฐ์ ํตํฉ์ ์ฃผ์ ์ด์ ์ธ ๋จ์์ฑ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค.
๋ถ์ฐ ํธ๋์ญ์ ๋ ์๊ฐ๋์ง๋ง ์ฐ๋ฆฌ ์๋ฃจ์ ์์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๊ฑฐ๋์ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก "์ฌ๊ฐ"
๋ง์ดํฌ๋ก ์๋น์ค์ ์ธ๊ธฐ๊ฐ ๋์์ง์ ๋ฐ๋ผ ์ด์ ๋ํ ์์๊ฐ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค.
์ด ํจํด์ ์์ ๊ธด ํธ๋์ญ์ ๋ฌธ์ ๋ฅผ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์ธก๋ฉด์์ ์์คํ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ํ์ฅํฉ๋๋ค. ์คํจํ ํธ๋์ญ์ ํ ๋ณด์์ ์์คํ ์ ์๋ ์ํ๋ก ๋กค๋ฐฑํ์ง ์์ ์ ์์ง๋ง ๋์์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฒฝ๋ก. ๋ํ ํ๋ก์ธ์ค๋ฅผ "์ข์" ์๋ฉ์ผ๋ก ๊ฐ์ ธ์ค๋ ค๊ณ ํ ๋ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ์ง ์๋๋ก ํฉ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ๋ชจ๋๋ฆฌ์ ์์คํ ์์ ์ด ํจํด์ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ํ์ ์์คํ ์ ํตํฉ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๊ธด ํธ๋์ญ์ ๋ฐ ํด๋น ๋ฆฌ์์ค ์ ๊ธ์ผ๋ก ์ธํ ๋ถ์ ์ ์ธ ์ํฅ์ด ์์ต๋๋ค.
BPM ์คํ์ผ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๊ด๋ จํ์ฌ Sagas๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ์ฌ์ด ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. Sagas์ ๊ฐ๋ณ ๋จ๊ณ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ด์ ํ๋์ผ๋ก ์ค์ ํ ์ ์์ผ๋ฉฐ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ง์์ ์ธ ์ํ๋ ๋ค์ ์ค์์ ๊ฒฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ๊ฒ, Sagas์ ๋ด๋ถ ์ํ. ์ฆ, ์ถ๊ฐ์ ์ธ ์กฐ์ ๋ฉ์ปค๋์ฆ์ด ํ์ํ์ง ์์ต๋๋ค. ํ์ํ ๊ฒ์ "์ ์ด๋ ํ ๋ฒ" ์ ์ก์ ๋ณด์ฅํ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์๋ฃจ์ ์๋ ์์ฒด "๊ฐ๊ฒฉ"๋ ์์ต๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ด ๋์ฑ ๋ณต์กํด์ง๋๋ค. ๋ณด์์ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
- ๋ชจ๋๋ฆฌ์ ์์คํ ์ ํนํ ๋ฏผ๊ฐํ ์ ์๋ ์์ ํ ์ผ๊ด์ฑ์ ํฌ๊ธฐํด์ผ ํฉ๋๋ค.
- ์ํคํ ์ฒ๊ฐ ์กฐ๊ธ ๋ ๋ณต์กํด์ง๊ณ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์ถ๊ฐ๋ก ํ์ํฉ๋๋ค.
- ์ถ๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ํ์ํ ๊ฒ์ ๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ด ๋ฐฉ๋ฒ๋ ์ข์ง๋ง ์์คํ ์๋น์ค ํ์ง์ด ํฅ์๋ฉ๋๋ค).
๋ชจ๋๋ฆฌ์ ์์คํ ์ ๊ฒฝ์ฐ "Sags"๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ช ํํ์ง ์์ต๋๋ค. ์ด๋ฏธ ๋ธ๋ก์ปค๊ฐ ์๊ณ ํ๋ก์ ํธ ์์ ์ ์์ ํ ์ผ๊ด์ฑ์ด ํฌ์๋ ๋ง์ดํฌ๋ก ์๋น์ค ๋ฐ ๊ธฐํ SOA์ ๊ฒฝ์ฐ, ํนํ ํธ๋ฆฌํ API๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ํจํด์ ์ฌ์ฉํ๋ ์ด์ ์ด ๋จ์ ๋ณด๋ค ํจ์ฌ ํด ์ ์์ต๋๋ค. ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ์์ค.
๋ง์ดํฌ๋ก์๋น์ค์ ๋น์ฆ๋์ค ๋ก์ง ์บก์ํ
์ฐ๋ฆฌ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค ์คํ์ ์์ํ์ ๋ ํฉ๋ฆฌ์ ์ธ ์ง๋ฌธ์ด ์๊ฒผ์ต๋๋ค. ๋๋ฉ์ธ ๋ฐ์ดํฐ ์ง์์ฑ์ ์ ๊ณตํ๋ ์๋น์ค์ ๊ด๋ จํ์ฌ ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋์ ๋ ๊ฒ์ธ๊ฐ?
๋ค์ํ BPMS์ ์ํคํ ์ฒ๋ฅผ ๋ณผ ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์์ฑ์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๊ธฐ ์ํ ํ๊ฒฝ ๋ฐ ์ปจํ ์ด๋๋ฅผ ํ์ฑํ๋ ํ๋ซํผ ๋ฐ ๋๋ฉ์ธ ๋ ๋ฆฝ์ ๋ง์ดํฌ๋ก ์๋น์ค ๊ณ์ธต์ ๋ง๋ค๊ณ ๋๋ฉ์ธ ๋ฐ์ดํฐ ์ง์์ฑ์ ๋ณ๋์ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๊ฐ๋ฒผ์ด ๋ง์ดํฌ๋ก ์๋น์ค ๊ณ์ธต. ์ด ๊ฒฝ์ฐ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ ์ง์์ฑ ๊ณ์ธต์ ์๋น์ค๋ฅผ ์ค์ผ์คํธ๋ ์ด์ ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์๋ ๋งค์ฐ ํฐ ์ฅ์ ์ด ์์ต๋๋ค. ํ๋ซํผ์ ๊ธฐ๋ฅ์ ์ํ๋ ๋งํผ ๋๋ฆด ์ ์์ผ๋ฉฐ ์ด์ ๋ฐ๋ผ ํ๋ซํผ ๋ง์ดํฌ๋ก ์๋น์ค์ ํด๋น ๊ณ์ธต๋ง "๋ฑ๋ฑํด์ง๋๋ค". ๋ชจ๋ ๋๋ฉ์ธ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ ํ๋ซํผ์ด ์ ๋ฐ์ดํธ๋๋ ์ฆ์ ํ๋ซํผ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐํ๋ฅผ ์ป์ต๋๋ค.
๋ณด๋ค ์์ธํ ์ฐ๊ตฌ์์๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ค์ํ ๋จ์ ์ ๋ฐํ์ต๋๋ค.
- ์ฌ๋ฌ ๋๋ฉ์ธ์ ๋น์ฆ๋์ค ๋ก์ง์ ํ ๋ฒ์ ์คํํ๋ ํ๋ซํผ ์๋น์ค๋ ๋จ์ผ ์คํจ ์ง์ ์ผ๋ก ํฐ ์ํ์ ์๊ณ ์์ต๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ์์ฃผ ๋ณ๊ฒฝํ๋ฉด ์์คํ ์ ๋ฐ์ ์ค๋ฅ๋ก ์ด์ด์ง๋ ๋ฒ๊ทธ ์ํ์ด ์ฆ๊ฐํฉ๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ๋น์ฆ๋์ค ๋ก์ง์ ์ข๊ณ ๋๋ฆฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฐ์ดํฐ์ ํจ๊ป ์๋ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ ๋ค์ ํ ๋ฒ ๋ง์ฌ๋ง๋๊ณ ๋คํธ์ํฌ ์คํ์ ํตํด ํํ๋ฉ๋๋ค.
- ๋๋ฉ์ธ ์๋น์ค๋ ์๋น์ค์ ์ธ๋ถ API ์์ค์์ ์ฟผ๋ฆฌ ๋งค๊ฐ ๋ณ์ํ ๊ธฐ๋ฅ์ด ์ถฉ๋ถํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌ์ ํ์ํ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ๋ถ๋ถ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ์์ฒญํ ์ ์์ต๋๋ค(๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ ์ธ์ ๋น์ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ์ํํ ์ ์์ง๋ง ์ด๋ ์ํคํ ์ฒ๋ฅผ ๋์ฑ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋ฐ์ดํฐ ์ ์ ๋ ๋ฐ ์บ์ ๋ฌดํจํ ๋ฌธ์ ๋ฅผ ์์ฑํฉ๋๋ค).
- ํธ๋์ญ์
๋ฌธ์ :
- ํ๋ซํผ ์๋น์ค์ ์ํด ์ ์ฅ๋ ์๊ตฌ ์ํ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ ๋๋ฉ์ธ ๋ฐ์ดํฐ์ ์ผ์นํ์ง ์์ผ๋ฉฐ ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ํธ๋์ญ์ ์์ ๋๋ฉ์ธ ๋ฐ์ดํฐ ์ ๊ธ ์ด๋: ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ๋จผ์ ์ค์ ๋ฐ์ดํฐ์ ์ ํ์ฑ์ ํ์ธํ ํ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์์ ๊ฒฝ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋ฐฐ์ ํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ์ ์ธ๋ถ ์ฐจ๋จ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง ์ด๋ฌํ ์๋ฃจ์ ์ ์ถ๊ฐ์ ์ธ ์ํ์ ์๋ฐํ๊ณ ์์คํ ์ ์ ๋ฐ์ ์ธ ์์ ์ฑ์ ๊ฐ์์ํต๋๋ค.
- ์ ๋ฐ์ดํธ ์ ์ถ๊ฐ ๋ณต์ก์ฑ: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ง์์ฑ ์๋น์ค ๋ฐ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ฅผ ๋๊ธฐ์์ผ๋ก ๋๋ ์๊ฒฉํ ์์๋ก ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
๊ฒฐ๊ตญ ๋๋ฉ์ธ ๋ฐ์ดํฐ์ ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ํ๋์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์บก์ํํ๋ ๊ธฐ๋ณธ์ผ๋ก ๋์๊ฐ์ผ ํ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ง์ดํฌ๋ก ์๋น์ค๋ฅผ ์์คํ ์ ํตํฉ ๊ตฌ์ฑ ์์๋ก ์ธ์ํ๋ ๊ฒ์ ๋จ์ํํ๊ณ ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋ฌด๋ฃ๊ฐ ์๋๋๋ค:
- ๋น์ฆ๋์ค ๋ก์ง(ํนํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ์ฌ์ฉ์ ํ๋์ ์ ๊ณตํ๊ธฐ ์ํด) ๋ฐ API ํ๋ซํผ ์๋น์ค์์ ์ํธ ์์ฉ์ ์ํด API ํ์คํ๊ฐ ํ์ํฉ๋๋ค. API ๋ณ๊ฒฝ์ ๋ํ ๋ณด๋ค ์ธ์ฌํ ์ฃผ์, ์ ๋ฐฉ ๋ฐ ํ๋ฐฉ ํธํ์ฑ์ด ํ์ํฉ๋๋ค.
- ์ด๋ฌํ ๊ฐ ๋ง์ดํฌ๋ก ์๋น์ค์ ์ผ๋ถ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ๊ธฐ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ถ๊ฐ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ฉฐ, ์ด๋ก ์ธํด ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์๋ก์ด ์๊ตฌ ์ฌํญ์ด ๋ฐ์ํฉ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ์ถ์ ํด์ผ ํฉ๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ค๋ซ๋์ ๋ง๋ฌด๋ฆฌ๋์ง ์์ ๊ฒฝ์ฐ ์ค๋๋ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ์ด๊ฒ์ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐ ์์์น ๋ชปํ ์ฅ์ ๋ฌผ์ด ๋ ์ ์์ผ๋ฉฐ ๋ฒ์ ๊ฐ์ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์๋น์ค์ ์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ์ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ํคํ ์ฒ์๋ ํ๋ซํผ ์๋น์ค ๊ณ์ธต๋ ์กด์ฌํ์ง๋ง ์ด ๊ณ์ธต์ ๋ ์ด์ ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํ ์ปจํ ์ด๋๋ฅผ ํ์ฑํ์ง ์๊ณ ๋ณด์กฐ "ํ๋ซํผ" ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๊ฒฝ๋ง ํ์ฑํฉ๋๋ค. ์ด๋ฌํ ๊ณ์ธต์ ๋๋ฉ์ธ ๋ง์ดํฌ๋ก ์๋น์ค์ ๊ฒฝ๋์ฑ์ ์ ์งํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๊ด๋ฆฌ๋ฅผ ์ค์ ์ง์คํํ๋ ๋ฐ๋ ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ฌ์ฉ์ ํ๋์ ์์ ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ ์ ์ํํ ๋ ์ฌ์ฉ์๋ ์ผ๋ฐ ๋ชฉ๋ก์์ ๋ชจ๋ ๋๋ฉ์ธ์ ์์ ์ ํ์ธํด์ผ ํฉ๋๋ค. ์ฆ, ๋๋ฉ์ธ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๊ฐ ์ ๊ฑฐ๋ ์ ์ ํ ์์ ๋ฑ๋ก ํ๋ซํผ ์๋น์ค๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ด ์ปจํ ์คํธ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์บก์ํ๋ฅผ ์ ์งํ๋ ๊ฒ์ ์๋นํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด๊ฒ์ ์ด ์ํคํ ์ฒ์ ๋ ๋ค๋ฅธ ์ ์ถฉ์์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ๊ด์ ์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ํตํฉ
์์์ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ ์ฐ์ํ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๊ธฐ๋ํ ์ ์๋๋ก ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธ ์์ฉ์ ๊ตฌํํ๋ ๊ธฐ์ ๋ฐ ์์ง๋์ด๋ง ๊ธฐ๋ฅ์์ ์ถ์ํ๋์ด์ผ ํฉ๋๋ค.
๊ธฐ์ฌ๋ฅผ ์ํด ํน๋ณํ ๊ณ ์๋ ๋ค์ ์ด๋ ค์ด ํตํฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ด ์๋ค. ์ด๊ฒ์ "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 ํ๊ธฐ๋ฒ์ ์ฝ๊ฐ ๋จ์ํํ์ต๋๋ค).
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}")
}
๋ํ:
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 ์ฃผ์ ํ๋์ ํจ๊ป ์๋ํฉ๋๋ค. ๋จ์ผ ๋๊ธฐ์ด์ ํตํด ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๊ทธ ์์ฒด๋ก ํํ์ ๋๋ค. ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ์์ค์์ ์ด์ ์์คํ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ํ๋ ๋งํผ ์๋ก์ด ์ ํ์ ๋ฉ์์ง๋ฅผ ๋์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋นํ ๋จ์ํ์ด์ง๋ง ์ผ๋ฐ์ ์ธ ์์ ์ ๋งฅ๋ฝ์์ ์ฐ๋ฆฌ์๊ฒ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํน์ ์ํ์ ์๋ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ๋ฏธ๋ฌํจ์ด ์์ต๋๋ค. ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ฉ์ธ ์ด๋ฆ๋ณ๋ก ์ ๊ตฌ์ ๋๊ธฐ์ด์์ "์๊ธฐ" ๋ฉ์์ง๋ฅผ ํํฐ๋งํฉ๋๋ค. ๋ํ ์ ํธ์ "๋ฒ์"๋ฅผ ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ํธ์์ ๋๋ฉ์ธ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฒ์ค์ ๋์ญํญ์ ์ฆ๊ฐ์์ผ์ผ ํ์ง๋ง ๋น์ฆ๋์ค ๋ก์ง์ ์ด์ ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์๋ํด์ผ ํฉ๋๋ค. ๋ฉ์์ง ์ฃผ์ ์ง์ ์๋ ํ์์ด๊ณ ์ ํธ์๋ ๋ฐ๋์งํฉ๋๋ค.
ํตํฉ ๋ฒ์ค์ ์ ๋ขฐ์ฑ ๋ณด์ฅ
์ ๋ขฐ์ฑ์ ์ฌ๋ฌ ๊ฐ์ง๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ ํํ ๋ฉ์์ง ๋ธ๋ก์ปค๋ ์ํคํ ์ฒ์ ์ค์ํ ๊ตฌ์ฑ ์์์ด์ ๋จ์ผ ์คํจ ์ง์ ์ ๋๋ค. ์ถฉ๋ถํ ๋ด๊ฒฐํจ์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ์ข์ ์ง์๊ณผ ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ๊ฐ ์๋ ์ค๋ ์๊ฐ ํ ์คํธ๋ฅผ ๊ฑฐ์น ๊ตฌํ๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ํตํฉ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค(๋น์ฆ๋์ค ๋ก์ง์ด ์ ์ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ต๊ณ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค).
- ๋ธ๋ก์ปค๋ "์ ์ด๋ ํ ๋ฒ" ๋ฐฐ์ก ๋ณด์ฆ์ ์ ๊ณตํ ์๋ฌด๊ฐ ์์ต๋๋ค. ์ด๋ ํตํฉ ๋ฒ์ค์ ์์ ์ ์ธ ์๋์ ์ํ ํ์ ์๊ตฌ ์ฌํญ์ ๋๋ค. "์ ํํ ํ ๋ฒ" ์์ค ๋ณด์ฅ์ด ํ์ํ์ง ์์ต๋๋ค. ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์์ง ๋๋ ์ด๋ฒคํธ์ ๋ฐ๋ณต ๋์ฐฉ์ ๋ฏผ๊ฐํ์ง ์์ผ๋ฉฐ ์ด๊ฒ์ด ์ค์ํ ํน์ ์์ ์์๋ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋น์ฆ๋์ค ๋ก์ง์ ์ถ๊ฐ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. "๋น์ผ" "๋ณด์ฆ;
- ๋ฉ์์ง ๋ฐ ์ ํธ ์ ์ก์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ฐ ๋๋ฉ์ธ ๋ฐ์ดํฐ์ ์ํ ๋ณ๊ฒฝ๊ณผ ํจ๊ป ๊ณตํต ํธ๋์ญ์
์ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ ํธํ๋ ์ต์
์ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
ํธ๋์ญ์ ๋ณด๋ผ ํธ์งํจ , ํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐ ํ ์ด๋ธ๊ณผ ๋ฆด๋ ์ด๊ฐ ํ์ํฉ๋๋ค. JEE ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๊ฒ์ ๋ก์ปฌ JTA ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ํํ ์ ์์ง๋ง ์ ํํ ๋ธ๋ก์ปค์ ๋ํ ์ฐ๊ฒฐ์ ๋ชจ๋์์ ์๋ํ ์ ์์ด์ผ ํฉ๋๋ค.XA ; - ๋ค์ด์ค๋ ๋ฉ์์ง ๋ฐ ์ด๋ฒคํธ์ ํธ๋ค๋ฌ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํธ๋์ญ์ ๊ณผ ํจ๊ป ์๋ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋๋ฉด ๋ฉ์์ง ์์ ๋ ์ทจ์๋์ด์ผ ํฉ๋๋ค.
- ์ค๋ฅ๋ก ์ธํด ์ ๋ฌ๋์ง ๋ชปํ ๋ฉ์์ง๋ ๋ณ๋ ์ ์ฅ์์ ๋ณด๊ด
D.L.Q. (๋ฐฐ๋ฌ ๋๊ธฐ์ด). ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฉ์์ง๋ฅผ ์ ์ฅ์์ ์ ์ฅํ๊ณ ์์ฑ๋ณ๋ก ์ธ๋ฑ์ฑํ๊ณ (๋น ๋ฅธ ๊ทธ๋ฃนํ ๋ฐ ๊ฒ์์ ์ํด) ๋ฉ์์ง ๋ณด๊ธฐ, ๋์ ์ฃผ์๋ก ์ฌ์ ์ก ๋ฐ ๋ฉ์์ง ์ญ์ ๋ฅผ ์ํ API๋ฅผ ๋ ธ์ถํ๋ ๋ณ๋์ ํ๋ซํผ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. ์์คํ ๊ด๋ฆฌ์๋ ์น ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๋ธ๋ก์ปค ์ค์ ์์ ๋ฉ์์ง๊ฐ DLQ์ ๋ค์ด๊ฐ ๊ฐ๋ฅ์ฑ์ ์ค์ด๊ธฐ ์ํด ๋ฐฐ๋ฌ ์ฌ์๋ ํ์์ ๋ฐฐ๋ฌ ์ฌ์ด์ ์ง์ฐ์ ์กฐ์ ํด์ผ ํฉ๋๋ค(์ต์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ฒฝํ์ ์ผ๋ก ํ๋ํ๊ณ ์กฐ์ ํ๋ ๋์ ์์ );
- DLQ ์ ์ฅ์๋ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง๋์ด์ผ ํ๋ฉฐ ๋ชจ๋ํฐ๋ง ์์คํ ์ ์ ๋ฌ๋์ง ์์ ๋ฉ์์ง๊ฐ ๋ฐ์ํ ๋ ์์คํ ๊ด๋ฆฌ์๊ฐ ๊ฐ๋ฅํ ํ ์ ์ํ๊ฒ ๋์ํ ์ ์๋๋ก ์์คํ ๊ด๋ฆฌ์์๊ฒ ์๋ ค์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํจ ๋๋ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ์ค๋ฅ์ "์์ ์์ญ"์ด ์ค์ด๋ญ๋๋ค.
- ํตํฉ ๋ฒ์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ์์ ์ธ ๋ถ์ฌ์ ๋๊ฐํด์ผ ํฉ๋๋ค. ์ฃผ์ ๊ตฌ๋ ์ ์ง์ ๊ฐ๋ฅํด์ผ ํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฉ์ธ ์ด๋ฆ์ ๊ณ ์ ํด์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ๋์ ๋ค๋ฅธ ์ฌ๋์ด ํ์์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ค๊ณ ์๋ํ์ง ์์ต๋๋ค.
๋น์ฆ๋์ค ๋ก์ง์ ์ค๋ ๋ ์์ ์ฑ ๋ณด์ฅ
๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๋์ผํ ์ธ์คํด์ค๋ ํ ๋ฒ์ ์ฌ๋ฌ ๋ฉ์์ง์ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์์ผ๋ฉฐ ์ฒ๋ฆฌ๋ ๋ณ๋ ฌ๋ก ์์๋ฉ๋๋ค. ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๊ฒ๋ ๋ชจ๋ ๊ฒ์ด ๋จ์ํ๊ณ ์ค๋ ๋๋ก๋ถํฐ ์์ ํด์ผ ํฉ๋๋ค.
ํ๋ก์ธ์ค ๋น์ฆ๋์ค ๋ก์ง์ ์ด ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๊ฐ๋ณ์ ์ผ๋ก ์ํฅ์ ๋ฏธ์น๋ ๊ฐ ์ธ๋ถ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ์ด๋ฒคํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค ์์
- ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ด์ ํ๋๊ณผ ๊ด๋ จ๋ ์ฌ์ฉ์ ์์
- ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค๊ฐ ๋ฑ๋ก๋ ๋ฉ์์ง ๋๋ ์ ํธ ์์
- ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค์ ์ํด ์ค์ ๋ ํ์ด๋จธ ๋ง๋ฃ
- API๋ฅผ ํตํ ์ ์ด ์์ (์: ํ๋ก์ธ์ค ์ค๋จ).
์ด๋ฌํ ๊ฐ ์ด๋ฒคํธ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ผ๋ถ ํ๋์ ์ข ๋ฃ๋๊ณ ๋ค๋ฅธ ํ๋์ ์์๋ ์ ์์ผ๋ฉฐ ์๊ตฌ ์์ฑ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํ๋์ ์ข ๋ฃํ๋ฉด ๋ค์ ํ๋ ์ค ํ๋ ์ด์์ด ํ์ฑํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ฑฐ๋ ์ถ๊ฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๋์ผํ ํธ๋์ญ์ ์์ ์๋ฃํ ์ ์์ต๋๋ค. ํธ๋์ญ์ ์ ๋ซ๊ธฐ ์ ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์๋ก์ด ์ํ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ด ๋ค์ ์ธ๋ถ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์๊ตฌ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ฐ์ดํฐ๋ SELECT FOR UPDATE๋ฅผ ์ฌ์ฉํ ๋ ๋งค์ฐ ํธ๋ฆฌํ ์ฒ๋ฆฌ ๋๊ธฐํ ์ง์ ์ ๋๋ค. ํ๋์ ํธ๋์ญ์ ์ด ๋ณ๊ฒฝ์ ์ํด ๋ฒ ์ด์ค์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋ณ๋ ฌ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ค๋ฅธ ๋ณ๊ฒฝ์ ๋ํด ๋์ผํ ์ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ ์ฒซ ๋ฒ์งธ ํธ๋์ญ์ ์ด ์๋ฃ๋ ํ ๋ ๋ฒ์งธ ํธ๋์ญ์ ์ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์์ ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
DBMS ์ธก์์ ๋น๊ด์ ์ ๊ธ์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋น๊ด์ ์ ๊ธ์ ๊ต์ฐฉ ์ํ๋ก ์ฐ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ์ฆ, SELECT FOR UPDATE๋ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ์ฌ๊ฐํ ๊ฒฝ์ฐ์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ฌ์ ํ ํฉ๋ฆฌ์ ์ธ ์๊ฐ ์ ํ์ผ๋ก ์ ํ๋์ด์ผ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์์ ๋๊ธฐํ์ ๋๋ค. ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค๊ฐ ์๋ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ํ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ช ๋ ๋ฐฉ๋ฒ์ด ์๋ํ์ง ์์ต๋๋ค. ํน์ ๋ฒ์์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ธ์คํด์ค์ ๊ณ ์ ์ฑ์ ํ์ธํ๋ ค๋ฉด ํ๋ก์ธ์ค ํด๋์ค ๋ฐ ํด๋น ๋ฒ์์ ์ฐ๊ฒฐ๋ ์ผ์ข ์ ๋๊ธฐํ ๊ฐ์ฒด๊ฐ ํ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ถ ์๋น์ค๋ฅผ ํตํด URI ํ์์ ํค๋ก ์ง์ ๋ ์์์ ๋ฆฌ์์ค๋ฅผ ์ ๊ธ ์ ์๋ ๋ค๋ฅธ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค.
์์ ์์ InitialPlayer ๋น์ฆ๋์ค ํ๋ก์ธ์ค์๋ ์ ์ธ์ด ํฌํจ๋์ด ์์ต๋๋ค.
uniqueConstraint = UniqueConstraints.singleton
๋ฐ๋ผ์ ๋ก๊ทธ์๋ ํด๋น ํค์ ์ ๊ธ์ ์ทจํ๊ณ ํด์ ํ๋ ๋ฉ์์ง๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ค๋ฅธ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๋ํด์๋ ์ด๋ฌํ ๋ฉ์์ง๊ฐ ์์ต๋๋ค. uniqueConstraint๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.
์ง์ ์ํ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ฌธ์
๋๋ก๋ ์ง์์ ์ธ ์ํ๋ฅผ ๊ฐ๋ ๊ฒ์ด ๋์์ด ๋ ๋ฟ๋ง ์๋๋ผ ์ค์ ๋ก ๊ฐ๋ฐ์ ๋ฐฉํดํ๊ธฐ๋ ํฉ๋๋ค.
๋ฌธ์ ๋ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ ๋ฐ/๋๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ชจ๋ธ์ ๋ณ๊ฒฝํด์ผ ํ ๋ ์์๋ฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ด์ ์ํ์ ํธํ๋์ง ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ "๋ผ์ด๋ธ" ์ธ์คํด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ์ผ๋ก ์ธํด jBPM์ ์ฌ์ฉํ ๋ ์ข
์ข
๋ฐ์ํ๋ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ณํ์ ๊น์ด์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ๋ํ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ ํ๊ณผ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ์ ์ํํ์ง ์๋๋ก ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ ํ์ ์์ฑํ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์์ํ ๋ ์ด์ ์ ํ ๋์ ์ฌ์ฉํ์ญ์์ค. ์ด์ ์ธ์คํด์ค๋ "์ด์ ๋ฐฉ์"์ผ๋ก ๊ณ์ ์๋ํฉ๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ ์ ๋ฐ์ดํธํ ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ง์์ ์ธ ์ํ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ ๊ฐ๋จํ์ง๋ง ํ๊ณ์ ๋จ์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ง์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค ๋ชจ๋ธ์์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ณต์ , ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ฆ๊ฐ;
- ์ข ์ข ์๋ก์ด ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก์ ์ฆ๊ฐ์ ์ธ ์ ํ์ด ํ์ํฉ๋๋ค(๊ฑฐ์ ํญ์ ํตํฉ ์์ ์ธก๋ฉด์์).
- ๊ฐ๋ฐ์๋ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ธ์ ์ญ์ ํ ์ ์๋ ์์ ์ ์ ์ ์์ต๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ์ฌ์ฉํ์ง๋ง ์ถ์ ๋จ์ํํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๊ฒฐ์ ์ ๋ด๋ ธ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ง์์ ์ธ ์ํ๋ ์ฝ๊ฒ ์ฝ๊ณ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ํ์์ธ JSON ํ์ ๋ฌธ์์ด๋ก ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์ ์ธ๋ถ ๋ชจ๋์์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํํ ์ ์์ต๋๋ค. ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์๋ ํธ๋ค์ ์ฌ์ฉํ์ฌ ์กฐ์ ํ ์๋ ์์ต๋๋ค(ํนํ ๋๋ฒ๊น ์ค ๊ฐ๋ฐ์ ์ ์ฉํจ).
- ํตํฉ ๋น์ฆ๋์ค ๋ก์ง์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ธ์ ๋ ์ง ์ฐธ์ฌ ํ๋ก์ธ์ค ์ค ํ๋์ ๊ตฌํ์ ์ ์ด๋ฆ(์: "InitialPlayerV2")์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ๋ฐ์ธ๋ฉ์ ๋ฉ์์ง ๋ฐ ์ ํธ์ ์ด๋ฆ์ ํตํด ๋ฐ์ํฉ๋๋ค.
- ํ๋ก์ธ์ค ๋ชจ๋ธ์๋ ๋ฒ์ ๋ฒํธ๊ฐ ์์ผ๋ฉฐ, ์ด ๋ชจ๋ธ์ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฉด ์ฆ๊ฐํ๊ณ ์ด ๋ฒํธ๋ ํ๋ก์ธ์ค ์ธ์คํด์ค์ ์ํ์ ํจ๊ป ์ ์ฅ๋ฉ๋๋ค.
- ํ๋ก์ธ์ค์ ์ง์ ์ํ๋ ๋ชจ๋ธ์ ๋ฒ์ ๋ฒํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ๊ฐ ์์ ํ ์ ์๋ ํธ๋ฆฌํ ๊ฐ์ฒด ๋ชจ๋ธ๋ก ๊ธฐ๋ณธ์์ ๋จผ์ ์ฝํ์ง๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฐจ๋ ๋น์ฆ๋์ค ๋ก์ง ์์ ๋ฐฐ์น๋๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ณต์ํ ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๊ฐ ์ธ์คํด์ค์ ๋ํด "์ง์ฐ"์ด๋ผ๊ณ ํฉ๋๋ค.
- ๋ชจ๋ ํ๋ก์ธ์ค ์ธ์คํด์ค์ ์ํ๋ฅผ ์ ์ํ๊ณ ๋๊ธฐ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ ๋ง์ ํด๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃจ์ ์ด ์ฌ์ฉ๋์ง๋ง ๊ฑฐ๊ธฐ์์ JSON์ผ๋ก ์์ ํด์ผ ํฉ๋๋ค.
๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ํ์ํฉ๋๊น?
๊ธฐ์ฌ์ ์ค๋ช ๋ ์๋ฃจ์ ์ ํตํด ์ฐ๋ฆฌ์ ์ถ์ ํฌ๊ฒ ๋จ์ํํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์์ค์์ ํด๊ฒฐ๋๋ ๋ฌธ์ ์ ๋ฒ์๋ฅผ ํ์ฅํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ๋ง์ดํฌ๋ก ์๋น์ค๋ก ๋ถ๋ฆฌํ๋ ์์ด๋์ด๋ฅผ ๋์ฑ ๋งค๋ ฅ์ ์ผ๋ก ๋ง๋ค ์ ์์์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ง์ ์์ ์ด ์ํ๋์์ผ๋ฉฐ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์ํ ๋งค์ฐ "๊ฐ๋ฒผ์ด" ํ๋ ์์ํฌ์ ๋ค์ํ ์์ฉ ์์ ์ ๋งฅ๋ฝ์์ ์๋ณ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๋น์ค ๊ตฌ์ฑ ์์๊ฐ ๋ง๋ค์ด์ก์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ๊ณ ๊ณตํต ๊ตฌ์ฑ ์์์ ๊ฐ๋ฐ์ ์์ ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๊ณต๊ฐ ์ก์ธ์ค๋ก ๊ฐ์ ธ์ค๊ณ ์ ํฉ๋๋ค. ์ฝ๊ฐ์ ๋ ธ๋ ฅ๊ณผ ์๊ฐ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฌํ ์๋ฃจ์ ์ ๋ํ ์์๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ถ๊ฐ์ ์ธ ์ธ์ผํฐ๋ธ๊ฐ ๋ ์ ์์ต๋๋ค. ์ ์๋ ๊ธฐ์ฌ์์๋ ํ๋ ์์ํฌ ์์ฒด์ ๊ธฐ๋ฅ์ ๊ฑฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์ง๋ง ์ผ๋ถ๋ ์ ์๋ ์์ ์์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ํ๋ ์์ํฌ๋ฅผ ๊ฒ์ํ๋ฉด ๋ณ๋์ ๊ธฐ์ฌ๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋์ ๋ค์ ์ง๋ฌธ์ ๋ตํ์ฌ ์ฝ๊ฐ์ ํผ๋๋ฐฑ์ ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฑ๋ก๋ ์ฌ์ฉ์๋ง ์ค๋ฌธ ์กฐ์ฌ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์ํ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ํ์ํฉ๋๊น?
-
18,8%์, ์ ๋ ์ค๋ซ๋์ ์ด์ ๊ฐ์ ๊ฒ์ ์ฐพ๊ณ ์์์ต๋๋ค.
-
12,5%๊ทํ์ ๊ตฌํ์ ๋ํด ๋ ์๊ณ ์ถ์ต๋๋ค. ์ ์ฉํ ์ ์์ต๋๋ค.2
-
6,2%๊ธฐ์กด ํ๋ ์์ํฌ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ต์ฒด๋ฅผ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค1
-
18,8%์ฐ๋ฆฌ๋ ๊ธฐ์กด ํ๋ ์์ํฌ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค3
-
18,8%ํ๋ ์์ํฌ ์์ด ๋์ฒํ๊ธฐ3
-
25,0%๋๋ง์ ๊ธ ์ฐ๊ธฐ4
16๋ช
์ ์ฌ์ฉ์๊ฐ ํฌํํ์ต๋๋ค. 7๋ช
์ ์ฌ์ฉ์๊ฐ ๊ธฐ๊ถํ์ต๋๋ค.
์ถ์ฒ : habr.com