
์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ์์ค โDaprโ
์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ์์ค โDaprโ ๊ด๋ จ
๋ณธ๋ฌธ์ ์์ฆIT์ ๋ฒ์ญ๊ฐ Jane Heo๊ฐ ํจ๊ป ํ ๋ง์ค ๋นํ๋ (Thomas Vitale), ๋ง์ฐ๋ฆฌ์์ค ์ด๋ผํฐ๋ ธ(Mauricio Salatino)์ ๊ธ <Open-Source Dapr for Spring Boot Developers>์ ๋ฒ์ญํ ๊ธ์ ๋๋ค. ํ์์ธ ํ ๋ง์ค ๋นํ๋ ๋ 1985๋ ์ ์ค๋ฆฝ๋ ๊ตญ์ ์ ์ธ IT ํ์ฌ์ธ ์์คํฐ๋งคํฑ(Systematic)์์ ์ํํธ์จ์ด ์ํคํ ํธ๋ก ํ๋ ์ค์ด๋ฉฐ, ๋ง์ฐ๋ฆฌ์์ค ์ด๋ผํฐ๋ ธ๋ ๋ํผ(Dapr)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ด๋ฆฌํ ์๋น์ค์ ์ํฐํ๋ผ์ด์ฆ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๋ค์ด์๊ทธ๋ฆฌ๋(Diagrid)์์ OSS ์ํํธ์จ์ด ์์ง๋์ด๋ก ๊ทผ๋ฌดํ๊ณ ์์ต๋๋ค.
์คํ๋ง ๋ถํธ[1]์ ๋ํผ(Dapr)[2]๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ๋ณต์กํ [3]์ฟ ๋ฒ๋คํฐ์ค(Kubernetes, K8s) ํด๋ฌ์คํฐ ์์ด๋ ๋ก์ปฌ์์ ๋ํผ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ, ํ ์คํธ, ๋๋ฒ๊ทธํ ์ ์์ด ๊ฐ๋ฐ ๊ณผ์ ์ด ๋ ๊ฐ๋จํด์ง๋๋ค.
์ค๋๋ ๊ฐ๋ฐ์๋ค์ ๋ค์ํ ๋๊ตฌ์ ํด๋ผ์ฐ๋ ์๋น์ค๋ค์ ํ๊ฐํ๊ณ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๋ณต์กํ ๋ด๋ถ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ผ์ผ ํ๋ ์ํฉ์ ์ง๋ฉดํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์คํ์์ค ํ๋ก์ ํธ์ธ ๋ํผ๊ฐ ์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ค์ด ๋ ๊ฒฌ๊ณ ํ๊ณ ํ๊ฒฝ์ ์ข ์๋์ง ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ ์ค ์ ์๋์ง ์ดํด๋ด ๋๋ค. ๋ํ ๊ฐ๋ฐ์๋ค์ด ๊ธฐ์กด์ ๋ด๋ถ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ ์งํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๊ฐ๋ฐ์๋ค์ด ์๋ ๊ณณ์์ ์ถ๋ฐํ๊ธฐ
์คํ์ธ ๋ฐ๋ฅด์ ๋ก๋์์ ์ด๋ฆฐ ์คํ๋ง I/O ์ปจํผ๋ฐ์ค์์ ์คํ๋ง ์ปค๋ฎค๋ํฐ๋ฅผ ์ง์ ๋ง๋ ๊ธฐํ๊ฐ ์์์ต๋๋ค. ์ด ์ปจํผ๋ฐ์ค๋ ์คํ๋ง ํ๋ ์์ํฌ ์ ์ง ๊ด๋ฆฌ์, ํต์ฌ ๊ธฐ์ฌ์, ์ต์ข ์ฌ์ฉ์๋ค์ด ๋งค๋ ๋ชจ์ฌ ํ๋ ์์ํฌ์ ์ต์ ์ถ๊ฐ ๊ธฐ๋ฅ, ๋ด์ค, ์ ๊ทธ๋ ์ด๋ ๋ฐ ํฅํ ๊ณํ์ ๋ ผ์ํ๋ ์๋ฆฌ์ ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค, ์ปจํ ์ด๋, ๊ทธ๋ฆฌ๊ณ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ ๋ฑ ๋ง์ ๋ฐํ๋ฅผ ๋ณผ ์ ์์๋๋ฐ, ์ด๋ฌํ ์ฃผ์ ๋ ํญ์ ์คํ๋ง ๊ฐ๋ฐ์๋ค์๊ฒ ์ ํฉํ ๋ฐฉ์์ผ๋ก ๋ค๋ค์ก์ต๋๋ค. ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ ์๊ฐ๋๋ ๋๋ถ๋ถ์ ๋๊ตฌ๋ ์๋ก์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ๋ฐ์ ์์ ์ ๋ณ๊ฒฝํ๋๋ก ์๊ตฌํ๋ฉฐ, ๋๋ก๋ ๋ณต์กํ ๊ตฌ์ฑ์ด๋ ์๊ฒฉ ํ๊ฒฝ์ด ํฌํจ๋๊ธฐ๋ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ํผ ํ๋ก์ ํธ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ค์นํ ์ ์์ง๋ง, ์ด๋ฅผ ๋ก์ปฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํฌํจํ๋ ค๋ฉด ์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ถ๊ฐ๋ก ์ํํด์ผ ํฉ๋๋ค. ์ผ๋ถ ๊ฐ๋ฐ์๋ ๋ก์ปฌ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํฌํจํ๋ ๋ฐ ์ต์ํ ์ ์์ง๋ง, ๋ค๋ฅธ ํ๋ค์ ํ ์คํธ์ปจํ ์ด๋์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ฝ๋ ๋ณ๊ฒฝ์ ํ ์คํธํ ์ ์๋ ์์ ํ๊ฒฝ์ ๋ก์ปฌ์์ ๊ฐ๋จํ๊ฒ ์์ฑํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋ํผ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ด๊ณ์์ด ์ผ๊ด๋ [4]API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํผ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๋น๋ฉ ๋ธ๋ก(์ํ ๊ด๋ฆฌ, ๋ฐํ/๊ตฌ๋ , ์๋น์ค ํธ์ถ, ์กํฐ(Actors), ์ํฌํ๋ก์ฐ ๋ฑ)์ ์ ๊ณตํฉ๋๋ค.

๋ํผ์ ๋ํ ๋ณต์กํ ์ค๋ช ์ ์๊ฐ์ ํ ์ ํ๊ธฐ๋ณด๋ค, ์ด๋ฒ ๊ธ์์๋ ๋ํผ ํ๋ก์ ํธ์ ์คํ๋ง ๋ถํธ ํ๋ ์์ํฌ ๊ฐ ํตํฉ์ด ๋ํผ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ด๋ป๊ฒ ๋จ์ํํ ์ ์๋์ง ์ค์ ์ ์ผ๋ก ๋ค๋ฃน๋๋ค. ํนํ, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ์คํํ์ง ์๊ณ ๋ ๋ก์ปฌ์์ ์คํ, ํ ์คํธ, ๋๋ฒ๊น ์ด ๊ฐ๋ฅํ ๋ฐฉ์์ ์ดํด๋ด ๋๋ค.
์ค๋๋ ์ฟ ๋ฒ๋คํฐ์ค์ [5]ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐํ์
์ค๋๋ ๋ํผ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์๊ด์์ด ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ํผ๋ฅผ ์ค์นํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค์ ์ปจํ ์ด๋ ๋ฐํ์์ ํ์ฌ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ํํ ์ฌ์ฉ๋๋ ์คํ ํ๊ฒฝ์ ๋๋ค.
๊ทธ๋ฌ๋ ์๋ฐ ๊ฐ๋ฐ์๋ค์๊ฒ ๋งค์ผ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ์์ ํ๋๋ก ์์ฒญํ๋ ๊ฒ์ ๊ทธ๋ค์ ์ต์ํ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ผ์ผ ์ ์์ต๋๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ฟ ๋ฒ๋คํฐ์ค ์ฌ์ฉ๋ฒ์ ๊ต์กํ๋ ๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉฐ, ๋ํผ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํด๋ฌ์คํฐ์ ์ค์นํ๋ ๋ฐฉ๋ฒ๋ ๋ฐฐ์์ผ ํฉ๋๋ค.

์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ผ๋ฉด, ๋๋ถ๋ถ ๋ก์ปฌ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋ฉํ๊ณ ์คํํ๋ฉฐ ๋๋ฒ๊น ํ๊ณ ํ ์คํธํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋ํผ๋ ํ ์คํธ์ปจํ ์ด๋ํ๊ณผ ํ๋ ฅํ์ฌ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์ด ๋ก์ปฌ์์ ๋ํผ๋ฅผ ํ์ฉํ ์ ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํ๊ฒ ๋์์ต๋๋ค.
์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ํผ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฐฐ์ฐ์ง ์์๋ ๋ํผ API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.

์ด ํ ์คํธ๋ ํ ์คํธ์ปจํ ์ด๋๊ฐ @ClassRule ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ํผ ๋ฐํ์์ ์ค์ (provision)ํ๋ ๋ฐฉ์์ ๋ณด์ฌ์ค๋๋ค. ์ด ์ ๋ ธํ ์ด์ ์ ๋ํผ ๋ฐํ์์ ๋ถํธ์คํธ๋ฉ(์ด๊ธฐํ)ํ๋ ์ญํ ์ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ ๋ํผ API๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๊ณ , ๋น๋๊ธฐ ๋ฉ์์ง๋ฅผ ๊ตํํ๋ฉฐ, ๊ตฌ์ฑ์ ๊ฐ์ ธ์ค๊ณ , ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ๊ณ , ๋ํผ์ ์กํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ์ผ๋ฐ์ ์ธ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ป๊ฒ ๋น๊ต๋ ๊น์? ์๋ฅผ ๋ค์ด, ๋ ๋์ค(Redis)[6], ํฌ์คํธ๊ทธ๋ SQL(PostgreSQL)[7], ๋๋น์ ํ(RabbitMQ)[8]๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๋ฉฐ, ์นดํ์นด(Kafka)[9]๋ฅผ ํตํด ๋น๋๊ธฐ ๋ฉ์์ง๋ฅผ ๊ตํํ๋ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๋๋ [์ฌ๊ธฐ (salaboy/example-voting-app
)](java/
๋๋ ํ ๋ฆฌ ์๋์ ์๋ฐ ๊ตฌํ ์ฝ๋๊ฐ ์์ต๋๋ค) ์์ ํ์ธํ ์ ์์ต๋๋ค.

์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ ๋์ค ํด๋ผ์ด์ธํธ๋ฟ๋ง ์๋๋ผ, ํฌ์คํธ๊ทธ๋ SQL JDBC ๋๋ผ์ด๋ฒ[10]์ ๋๋น์ ํ ํด๋ผ์ด์ธํธ๋ ์ข ์์ฑ์ผ๋ก ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ํ ๋ ๋์ค๋ฅผ ์ํ Spring Data KeyValue[11], ํฌ์คํธ๊ทธ๋ SQL์ ์ํ Spring Data JDBC[12], ๋๋น์ ํ๋ฅผ ์ํ ์คํ๋ง ๋ถํธ Messaging ๋๋น์ ํ์ ๊ฐ์ ์คํ๋ง ๋ถํธ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
์ด๋ฌํ ์ถ์ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๋ณธ ๋ ๋์ค, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋๋น์ ํ ํด๋ผ์ด์ธํธ์ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ ์คํ๋ง ๋ถํธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ ํฉํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค. ์คํ๋ง ๋ถํธ๋ ๋จ์ํ ํด๋ผ์ด์ธํธ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๊ทธ์น์ง ์๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ตฌํํ ์ ์๋๋ก ์ง์ํ๊ณ , ๊ทธ ๊ณผ์ ์์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ฅผ ์ ์๋๋ก ๋์ต๋๋ค.

์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ค์ด ๋ํผ API๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๋ณด์ฌ์ค ํ ์คํธ๋ฅผ ๋๋์๋ณด๋ฉด, ์ํธ์์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.

๋ ๋ฒ์งธ ๋ค์ด์ด๊ทธ๋จ์์๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ํผ API์๋ง ์์กดํฉ๋๋ค. ์์์ ์ค๋ช ํ ๋ํผ API๋ฅผ ์ฌ์ฉํ๋ ๋จ์ ํ ์คํธ์ ์ด์ ๋ค์ด์ด๊ทธ๋จ ๋ชจ๋์์ HTTP๋ gRPC(gRPC Remote Procedure Call)[13] ์์ฒญ์ ํตํด ๋ํผ API์ ์ง์ ์ฐ๊ฒฐํ๋ ๋์ , ๋ํผ Java SDK๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ํด๋์คํจ์ค์๋ ๋๋น์ ํ, ๋ ๋์ค ํด๋ผ์ด์ธํธ๋ JDBC ๋๋ผ์ด๋ฒ๊ฐ ํฌํจ๋์ง ์์์ต๋๋ค.
๋ํผ๋ฅผ ์ฌ์ฉํ๋ ์ด ์ ๊ทผ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋์ค๋ ๋๋น์ ํ ํด๋ผ์ด์ธํธ๋ฅผ ํฌํจํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์์กด์ฑ์ด ์ค์ด๋ญ๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ํฌ๊ธฐ๊ฐ ์์์ง ๋ฟ๋ง ์๋๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋๋ ํ๊ฒฝ์ ํน์ ์ธํ๋ผ ๊ตฌ์ฑ ์์์ ๋ ์์กดํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ํด๋ผ์ด์ธํธ์ ๋ฒ์ ์ ํน์ ํ๊ฒฝ์์ ์คํ ์ค์ธ ๊ตฌ์ฑ ์์์ ์ธ์คํด์ค์ ์ผ์นํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
์ต๊ทผ์๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ ๋ฐฐํฌ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ง๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฉ์์ง ๋ธ๋ก์ปค ๊ฐ์ ๊ตฌ์ฑ ์์์ ๋ฒ์ ์ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ๊ธฐ ์ด๋ ค์ด ํ๊ฒฝ์ด ํํฉ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ฅผ ๋ก์ปฌ ํ๊ฒฝ์์ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํด ์คํํ๋ฏ๋ก, ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ๋ฒ์ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋์ค, ๋๋น์ ํ, ํฌ์คํธ๊ทธ๋ SQL์ ์ง์ ์ฐ๊ฒฐํ์ง ์์ต๋๋ค. ์ฐ๊ฒฐ ํ ๊ตฌ์ฑ ๋ฐ ๊ธฐํ ์ธ๋ถ ์ฌํญ์ ์ธํ๋ผ์ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ ์์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ๋ถ๋ฆฌ๋๊ณ ๋ํผ API ๋ค๋ก ํตํฉ๋๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๊ฐ๋จํด์ก์ต๋๋ค.
์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์๋ ๋๋น์ ํ, ํฌ์คํธ๊ทธ๋ SQL, ๋ ๋์ค์ ์๋ ๋ฐฉ์์ ๋ฐฐ์ธ ํ์๊ฐ ์์ต๋๋ค. ๋ํผ API๋ ์์ฒด์ ์ผ๋ก ๋ช
ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์
์ํ๋ฅผ ์ ์ฅํ๋ ค๋ฉด saveState()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ค๋ฉด publishEvent()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. IDE๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ API๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐํ์์ ๊ตฌ์ฑํ๋ ํ์ ์ ํธํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ฌ์ฉํ ์ ์๋ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์์ฒด ๊ด๋ฆฌํ๋ ๋ ๋์ค ์ธ์คํด์ค๋ฅผ Google Cloud In-Memory Store๋ก ์ ํํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ ๋์ค ์ธ์คํด์ค๋ฅผ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์์ฒด ๊ด๋ฆฌํ๋ ์นดํ์นด ์ธ์คํด์ค๋ฅผ Google Pub/Sub ๋๋ Amazon SQS/SNS๋ก ๊ต์ฒดํ๋ ค๋ฉด ๋ํผ ์ค์ ๋ง ์กฐ์ ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด, saveState
/getState
, publishEvent
๊ฐ์ API๋ ์ด๋ป๊ฒ ๋๋ ๊ฑธ๊น์? ๊ตฌ๋
(subscription
)์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์? ์ด๋ฒคํธ๋ฅผ ์๋นํ๋ ๋ฐฉ๋ฒ์? ์ด๋ฌํ API ํธ์ถ์ ์คํ๋ง ๋ถํธ์ ๋ ์ ํตํฉํด, ๊ฐ๋ฐ์๊ฐ ์๋ก์ด API๋ฅผ ๋ฐฐ์ฐ์ง ์์๋ ๋๋๋ก ๊ฐ์ ํ ์ ์์๊น์?
๋ด์ผ: ํตํฉ๋ ํฌ๋ก์ค ๋ฐํ์ ๊ฒฝํ
๋๋ถ๋ถ์ ๊ธฐ์ ๋ฌธ์์ ๋ฌ๋ฆฌ, ์ฌ๊ธฐ์์์ ๋ต์ โ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋คโ๊ฐ ์๋๋๋ค. ๋ฌผ๋ก ๋ต์ YES์ ๋๋ค. ์ฐ๋ฆฌ๋ ์คํ๋ง ๋ฐ์ดํฐ์ ๋ฉ์์ง(Messaging) ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ผ, ์คํ๋ง ๋ถํธ์ ์๋ฒฝํ ํตํฉ๋ ๋ ํ๋ถํ ๋ํผ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ(ํ ์คํธ์ปจํ ์ด๋ ์ฌ์ฉ)๊ณผ ๊ฒฐํฉํ๋ฉด, ํ์ด ๋ก์ปฌ, ์ฟ ๋ฒ๋คํฐ์ค, ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ๋น ๋ฅด๊ฒ ์คํ๋๋ฉฐ, ๋ณ๊ฒฝ ์์ด ์๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ๊ณ ์ฝ๋ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
์ด๋ฏธ ๋ ๋์ค, ํฌ์คํธ๊ทธ๋ SQL ๋ฐ/๋๋ ๋๋น์ ํ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์คํ๋ง ๋ฐ์ดํฐ์ ์คํ๋ง ๋๋น์ ํ/์นดํ์นด/ํ์ฌ(Pulsar)[14]์ ๊ฐ์ ์คํ๋ง ๋ถํธ ์ถ์ํ๋ฅผ ๋น๋๊ธฐ ๋ฉ์์ง์ ์ํด ์ฌ์ฉํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
Spring Data KeyValue์ ๋ํ ์์ธํ ๋ด์ฉ์ โA Guide to Spring Data Key Valueโ ๊ฒ์๋ฌผ์ ์ฐธ๊ณ ํ์ธ์.
@Bean
public KeyValueOperations keyValueTemplate() {
return new KeyValueTemplate(keyValueAdapter ());
}
@Bean
public KeyValueAdapter keyValueAdapter() (
return new MapKeyValueAdapter (WeakHashMap.class);
}
Employee employee = new Employee(1, "Mile", "IT", "5000");
keyValueTemplate.insert(employee);
ID๋ก ์ง์์ ์กฐํํ๋ ค๋ฉด,
Optional<Employee> savedEmployee = keyValueTemplate.findById(id, Employee.class);
๋น๋๊ธฐ ๋ฉ์์ง์ ์ํด ์คํ๋ง ์นดํ์นด, ์คํ๋ง ํ์ฌ, ์คํ๋ง ๋๋น์ ํ๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค. ์ด๋ค ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ , ์๋นํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. (๊ด๋ จ ์๋ฃ: Messaging with RabbitMQ)
์นดํ์นด๋ก ๋ฉ์์ง๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํฉ๋๋ค.
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String msg) (
kafkaTemplate.send(topicName, msg);
}
์นดํ์นด ๋ฉ์์ง๋ฅผ ์๋นํ๋ ๊ฒ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
@KafkaListener (topics = "topicName", groupId = "foo")
public void listenGroupFoo(String message) {}
System.out.println("Received Message in group foo:" + message):
}
๋๋น์ ํ์ ๊ฒฝ์ฐ์๋ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
@Autowired
private final RabbitTemplate rabbitTemplate;
๊ทธ๋ฆฌ๊ณ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋๋ค.
rabbitTemplate.convertAndSend(topicExchangeName, "foo.bar.baz", "Hello from RabbitMQ!");
๋๋น์ ํ์์ ๋ฉ์์ง๋ฅผ ์๋นํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
String foo = (String) rabbitTemplate.receiveAndConvert("nyqueue");
์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์์ ๊ฒฝํ ํฅ์์ ์ํ ๋ํผ ํ์ฉ
์ด์ ์๋ก์ด ๋ํผ ์คํ๋ง ๋ถํธ ์คํํฐ๋ฅผ ์ฌ์ฉํ์ ๋ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
DaprKeyValueTemplate
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@Autowired
private final DapzleyValueTerplate keyValueTemplate;
์ด์ KeyValueTemplate
์ ์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ์ Vote ๊ฐ์ฒด๋ฅผ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค.
Vote vote- nev Votevoteใ voterid, a0inctcocution, Voterid
// Store the vote
keyValuetemplate.insert (vote);
KeyValue
์ ์ฅ์์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์ ์ฅ๋ ๋ชจ๋ ํฌํ๋ฅผ ์ฐพ์๋ณด๊ฒ ์ต๋๋ค.
KeyValueQuezy<String> keyValueQuezy = new ReyValueQuezy<String>("'type' == 'vote'");
Iterable<Voteโบ votes = kejValuelenplate.find(keyValueQuery, Vote.class);
์ ์ด๊ฒ ์ค์ํ ๊น์? ๋ํผ KeyValueTemplate
์ ์คํ๋ง Data KeyValue์์ ์ ๊ณตํ๋ KeyValueOperations
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ฐ, ์ด๋ ๋ ๋์ค, ๋ชฝ๊ณ DB(MongoDB)[15], ๋ฉค์บ์๋(Memcached)[16], ํฌ์คํธ๊ทธ๋ SQL, MySQL ๋ฑ๊ณผ ๊ฐ์ ๋๊ตฌ๋ค์ ์ํด ๊ตฌํ๋ฉ๋๋ค. ํฐ ์ฐจ์ด์ ์ ์ด ๊ตฌํ์ด ๋ํผ API์ ์ฐ๊ฒฐ๋๋ฉฐ, ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ํ์๋ก ํ์ง ์๋๋ค๋ ์ ์
๋๋ค.
๋์ผํ ์ฝ๋๋ ๋ ๋์ค, ํฌ์คํธ๊ทธ๋ SQL, ๋ชฝ๊ณ DB ๋ฐ AWS ๋ค์ด๋๋ชจDB(DynamoDB)[17], ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ์ด์ด์คํ ์ด(Google Cloud Firestore)[18]์ ๊ฐ์ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๊ด๋ฆฌ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ํผ์์๋ 30๊ฐ ์ด์์ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ง์ํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์์กด์ฑ์ ๋ํ ๋ณ๊ฒฝ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋น์ทํ๊ฒ DaprMessagingTemplate
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@Autowired
private final DaprMessagingTemplate<Vote> messagingTemplate
์ด์ ๋ฉ์์ง/์ด๋ฒคํธ๋ฅผ ๋ฐํํด ๋ณด๊ฒ ์ต๋๋ค.
messagingTemplate.send(voteProperties.topic(), vote);
๋ฉ์์ง/์ด๋ฒคํธ๋ฅผ ์๋นํ๋ ค๋ฉด ์นดํ์นด ์์ ์ ์ ์ฌํ ์ฃผ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Topic(name = topiclame, pubsubllane = pubSubllame)
@PostMapping("/ subsesibe")
public void handlellessages(@RequestBody CloudEvent<Vote> event) {
LOG.info("*+++++CONSUME ()-====-*, event);
}
์ค์ํ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ํผ๊ฐ CloudEvents๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ๊ตํํ๋ค๋ ๊ฒ์ ๋๋ค(๋ค๋ฅธ ํ์๋ ์ง์๋จ). ์ด๋ ๋ด๋ถ ๊ตฌํ์ ๊ด๊ณ์์ด ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. @Topic ์ฃผ์์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํน์ Dapr PubSub ๊ตฌ์ฑ ์์์์ ์ง์ ๋ Topic์ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋๋ก ๊ตฌ๋ ํฉ๋๋ค.
๋ค์ ๋งํด, ์ด ์ฝ๋๋ ์นดํ์นด, ๋๋น์ ํ, ์ํ์น ํ์ฌ์ ๊ฐ์ ๋ชจ๋ ์ง์๋๋ Dapr PubSub ๊ตฌ์ฑ ์์ ๊ตฌํ๋ฟ๋ง ์๋๋ผ Azure Event Hub, Google Cloud PubSub, AWS SNS/SQS์ ๊ฐ์ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๊ด๋ฆฌ ์๋น์ค์๋ ์ ์ฉ๋ฉ๋๋ค(์์ธํ ๋ด์ฉ์ Dapr Pub/sub ๋ธ๋ก์ปค ๋ฌธ์ ์ฐธ์กฐ).
DaprKeyValueTemplate
๊ณผ DaprMessagingTemplate
์ ๊ฒฐํฉํ๋ฉด ๊ฐ๋ฐ์๋ ํตํฉ๋ API๋ฅผ ํตํด ๋ฐ์ดํฐ ์กฐ์๊ณผ ๋น๋๊ธฐ ๋ฉ์์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์
์์กด์ฑ์ ์ถ๊ฐํ์ง ์์ผ๋ฉฐ, ํ๊ฒฝ๊ณผ ๊ด๊ณ์์ด ํฌํฐ๋ธํฉ๋๋ค. ์ฆ, ๋์ผํ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์ ๊ณต์
์ฒด ์๋น์ค์์ ์คํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์คํ๋ง ๋ถํธ์ ๋ ๋น์ทํด ๋ณด์ด์ง๋ง, ๋ ๋ง์ ์์
์ด ํ์ํฉ๋๋ค. Spring Data KeyValue ์์ Spring Repository ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ CRUDRepository
๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ํ ํ
์คํธ์ ๋ํ ์ผ๋ถ ๋ฏธ๋นํ ๋ถ๋ถ์ด ์๊ณ , ๊ฐ๋ฐ์๊ฐ ์ด API๋ฅผ ๋น ๋ฅด๊ฒ ์์ํ ์ ์๋๋ก ํ๋ ๋ฌธ์๊ฐ ํ์ํฉ๋๋ค.
์ฅ์ ๊ณผ ํธ๋ ์ด๋์คํ
์๋ก์ด ํ๋ ์์ํฌ๋ ํ๋ก์ ํธ, ๋๊ตฌ๋ฅผ ๊ธฐ์กด์ ๊ธฐ์ ์คํ์ ์ถ๊ฐํ ๋, ๊ทธ ๋๊ตฌ๊ฐ ๋์๊ฒ ์ด๋ป๊ฒ ์๋ํ ์ง ์ดํดํ๋ ๋ฐ ์์ด ํธ๋ ์ด๋์คํ๋ฅผ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ํผ์ ๊ฐ์น๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋์๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ 80% ๋ 20% ๊ท์น์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- 80%์ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์์ง ๋ธ๋ก์ปค, ํค/๊ฐ ์ ์ฅ์, ๊ตฌ์ฑ ์๋ฒ ๋ฑ๊ณผ ๊ฐ์ ์ธํ๋ผ ๊ตฌ์ฑ ์์์ ๋ํด ๊ฐ๋จํ ์์ ์ ์ํํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ฉฐ ๋น๋๊ธฐ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ ์๋นํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์๋๋ฆฌ์ค์์๋ ๋ํผ๋ก๋ถํฐ ๊ฐ์ฅ ํฐ ๊ฐ์น๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- 20%์ ๊ฒฝ์ฐ, ํน์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋ํ ๊น์ ์ ๋ฌธ ์ง์์ด ํ์ํ๊ฑฐ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ์ฑ๋ฅ ์ข์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ตฌ์ถํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ๋ํผ API๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค. ์๋ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ํน์ ์ธํ๋ผ ๊ธฐ๋ฅ์ ์ ๊ทผํด์ผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ก์ด ๋๊ตฌ๋ฅผ ์ดํด๋ณผ ๋ ์ด๋ฅผ ๊ฐ๋ฅํ ๋ง์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง์ถ๋ ค๊ณ ์ผ๋ฐํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๋ํผ์์๋ ๋ํผ API๊ฐ ์ฌ์ฉ์์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง์ ๋ ๊ฐ๋ฐ์์๊ฒ ๋์์ ์ฃผ๋ ๋ฐ ์ง์คํด์ผ ํฉ๋๋ค. ๋ํผ API๊ฐ ๋ง์ง ์๊ฑฐ๋ ํน์ API๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์ ๊ณต์๋ณ SDK/ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค.
๋ํผ API๊ฐ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ๊ธฐ์ ์ถฉ๋ถํ ๋์ ๊ทธ๋ ์ง ์์ ๋๋ฅผ ๋ช ํํ ์ดํดํจ์ผ๋ก์จ, ํ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ค ๊ธฐ์ ์ด ํ์ํ์ง ๋ฏธ๋ฆฌ ์ค๊ณํ๊ณ ๊ณํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋น์ ํ/์นดํ์นด๋ SQL ๋ฐ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๊ฐ ๊ณ ๊ธ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ๊ฐ์?
๋ํ ์ฐ๋ฆฌ๊ฐ ํผํด์ผ ํ ๋ ๋ค๋ฅธ ์ค์๋ ๋๊ตฌ๊ฐ ์ฐ๋ฆฌ์ ๋ฐฐํฌ ๊ดํ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ง ์๋ ๊ฒ์ ๋๋ค. ํ๊ฒฝ ๊ฐ ๋ง์ฐฐ์ ์ค์ด๋ ๋ฐ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๊ฐ๋ฐ์๊ฐ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์์ ์คํํ ๋ ํ์ํ ๋์ผํ API์ ์์กด์ฑ์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋๋ก ํ ์ ์๋ค๋ฉด ์ข์ต๋๋ค.
์ด ์ ๋ค์ ์ผ๋์ ๋๊ณ ์ฅ์ ๊ณผ ํธ๋ ์ด๋์คํ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฅ์
- ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ตฌํ๋ ๊ณตํต๋ ๋์์ ์ ๊ทผํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ชจ๋์ด๋ ๊ณ์ธต์ ๊ฑธ์ณ์ ๊ณตํต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๋ ๊ฐ๊ฒฐํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ณต์๋ ฅ(์ฌ์๋ ๋ฐ ํ๋ก ์ฐจ๋จ ๋ฉ์ปค๋์ฆ), ๊ฐ์์ฑ(์คํ ํ ๋ ๋ฉํธ๋ฆฌ(OpenTelemetry)[19] ์ฌ์ฉ, ๋ก๊ทธ, ํธ๋ ์ด์ค ๋ฐ ๋ฉํธ๋ฆญ), ๋ณด์(์ธ์ฆ์ ๋ฐ ์ํธ TLS(mTLS)[20])๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ํผ์ ์์ํ ์ ์์ต๋๋ค.
- ์๋ก์ด ์คํ๋ง ๋ถํธ ํตํฉ ๋๋ถ์ ๊ฐ๋ฐ์๋ ๊ธฐ์กด์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ํผ์ ํ ์คํธ์ปจํ ์ด๋ ํตํฉ ๋๋ถ์ ๊ฐ๋ฐ์๋ ๋ํผ๋ฅผ ์คํํ๊ฑฐ๋ ๊ตฌ์ฑํ๋ ๋ฐ ๊ฑฑ์ ํ ํ์๊ฐ ์๊ณ , ๊ธฐ์กด ๊ฐ๋ฐ ๋ฃจํ์ ์ธ๋ถ ๋๊ตฌ๋ฅผ ๋ฐฐ์ฐ์ง ์์๋ ๋ฉ๋๋ค. ๋ํผ API๋ ๊ฐ๋ฐ์๊ฐ ๋ก์ปฌ์์ ๊ธฐ๋ฅ์ ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋๋ฒ๊น ํ ์ ์๋๋ก ์ ๊ณต๋ฉ๋๋ค.
- ๋ํผ API๋ ๊ฐ๋ฐ์๊ฐ ์ธํ๋ผ์ ์ํธ ์์ฉํ ๋ ์๊ฐ์ ์ ์ฝํ ์ ์๋๋ก ๋์์ค๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์นดํ์นด/ํ์ฌ/๋๋น์ ํ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ฐฐ์ฐ๋ ๋์ , ๋ํผ API๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ ์๋นํ๋ ๋ฐฉ๋ฒ๋ง ๋ฐฐ์ฐ๋ฉด ๋ฉ๋๋ค.
- ๋ํผ๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์์ ํฌํฐ๋น๋ฆฌํฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ์ฝ๋ ๋ณ๊ฒฝ ์์ด ๋ก์ปฌ ๋๋ ํด๋ผ์ฐ๋ ๊ด๋ฆฌ ์ธํ๋ผ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์์ต๋๋ค. ๋ํผ๋ ์ด์/ํ๋ซํผ ํ์ด ๋ค์ํ ์ง์๋๋ ๊ตฌ์ฑ ์์์์ ์ธํ๋ผ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋๋ก ๋ช ํํ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํธ๋ ์ด๋์คํ
๋ํผ API์ ๊ฐ์ ์ถ์ํ ๊ณ์ธต์ ๋์ ํ๋ฉด ํญ์ ์ผ๋ถ ํธ๋ ์ด๋์คํ๊ฐ ๋ฐ๋ฆ ๋๋ค.
- ๋ํผ๋ ๋ชจ๋ ์๋๋ฆฌ์ค์ ๊ฐ์ฅ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ํน์ ํด๋ผ์ด์ธํธ/๋๋ผ์ด๋ฒ๊ฐ ํ์ํ ๋ณต์กํ ๊ธฐ๋ฅ์ ๋ณ๋์ ๋ชจ๋์ด๋ ์๋น์ค๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ํผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋์ ํ๊ฒฝ์์ ํ์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํผ๊ฐ ์กด์ฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋๋ก ์๋ํ๋๋ก ํ์ํ ์ธํ๋ผ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ง์ฝ ์ด์/ํ๋ซํผ ํ์ด ์ด๋ฏธ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ๋ํผ๋ [21]CNCF(Cloud Native Computing Foundation) ํ๋ก์ ํธ๋ก์ ์๋นํ ์ฑ์ํ ํ๋ก์ ํธ๋ก 3,000๋ช ์ด์์ ๊ธฐ์ฌ์๊ฐ ์์ผ๋ฏ๋ก ์ฝ๊ฒ ๋์ ํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ธํ๋ผ ๊ตฌ์ฑ ์์ ์ฌ์ด์ ์ถ๊ฐ์ ์ธ ์ถ์ํ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฌธ์ ํด๊ฒฐ์ด ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค. ์คํ๋ง ๋ถํธ ํตํฉ์ ํ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ค๋ฅ๊ฐ ๊ฐ๋ฐ์์๊ฒ ์ผ๋ง๋ ์ ์ ๋ฌ๋๋์ง๋ก ์ธก์ ํ ์ ์์ต๋๋ค.
์ฅ์ ๊ณผ ํธ๋ ์ด๋์คํ๋ ๊ทํ์ ํน์ ์ํฉ๊ณผ ๋ฐฐ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด ๋ชฉ๋ก์ ๋น ์ง ๋ด์ฉ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋ฌธ์ํด ์ฃผ์ธ์.
์์ฝ ๋ฐ ๋ค์ ๋จ๊ณ
Dapr Statestore (KeyValue)์ PubSub (Messaging)์ ๋ค๋ฃฌ ๊ฒ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ๋ถ๊ณผํ๋ฉฐ, ์คํ๋ง ๋ถํธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋ ๊ณ ๊ธ ๋ํผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ ฅํ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ํ์ํ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์์ต๋๋ค. TODO ๋ชฉ๋ก์ ๋ํผ Workflows๋ฅผ ํตํ ๋ด๊ตฌ์ฑ ์๋ ์คํ์ด ํฌํจ๋์ด ์์ผ๋ฉฐ, ์๋น์ค ๊ฐ ๋ณต์กํ๊ณ ์ฅ๊ธฐ ์คํ๋๋ ์ค์ผ์คํธ๋ ์ด์ ์ ๊ฐ๋ฐํ๋ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ๋๋ค.
์ ๊ฐ ์คํ๋ง ๋ถํธ์ ๋ํผ ํตํฉ ์์ ์ ์ด์ ์ ์ผ๋ก ์งํํ ์ด์ ์ค ํ๋๋ ์๋ฐ ์ปค๋ฎค๋ํฐ๊ฐ ์์ฐ์ฑ๊ณผ ์ผ๊ด๋ ์ธํฐํ์ด์ค์ ์ง์คํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋ค๋ฌ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ ์๋ฐ ์ปค๋ฎค๋ํฐ์์ ์์ธ ๋ชจ๋ ์ง์์ด ๋ํผ API๋ฅผ ๋ค์ ๋จ๊ณ๋ก ๋์ด์ฌ๋ฆฌ๋ ๋ฐ ํ์ฉ๋ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๊ธฐ์กด API๋ก ๋ค๋ฃฐ ์ ์๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฒ์ฆํ๊ณ ๊ฐญ์ ์ฐพ์๋ด์ด ๋ ๋์ ํตํฉ์ ๊ตฌ์ถํ๊ณ ๋ค์ํ ์ธ์ด์์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์๋์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
Spring I/O์์ ์ ์ํ ์์ ์ ๋ชจ๋ ์์ค ์ฝ๋๋ ์ด ๊ธ์ โToday, Kubernetes, and Cloud-Native Runtimesโ ์น์ ์ ๋งํฌ๋์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์คํ๋ง ๋ถํธ์ ๋ํผ ํตํฉ ์ฝ๋๋ฅผ Dapr Java SDK์ ๋ณํฉํ์ฌ ์คํ๋ง ๋ถํธ์์ ์์ ํ ๋ ๊ธฐ๋ณธ ๋ํผ ๊ฒฝํ์ผ๋ก ๋ง๋ค ์์ ์ ๋๋ค. ๋ฌธ์๋ ๊ณง ์ ๊ณตํ ๊ฑฐ๊ณ ์. ๋ง์ฝ ์ด ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๊ฑฐ๋ ๋ํผ๊ฐ ์คํ๋ง ๋ถํธ์ ๋ ์ ํตํฉ๋ ์ ์๋๋ก ๋์์ฃผ๊ณ ์ถ๋ค๋ฉด ์ฐ๋ฆฌ์๊ฒ ์ฐ๋ฝ์ฃผ์ธ์.
์๋ฌธ
์คํ๋ง ๋ถํธ: ์น์ฌ์ดํธ๋ ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ๊ฐ์ ์ํํธ์จ์ด๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ โฉ๏ธ
๋ํผ: ํฐ ์ํํธ์จ์ด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ์๋น์ค๋ก ๋๋์ด ์ฝ๊ฒ ๊ฐ๋ฐํ๊ณ ์ด์ํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ ์์ค ๋๊ตฌ โฉ๏ธ
์ฟ ๋ฒ๋คํฐ์ค: ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ๊ด๋ฆฌํ๋ ์๋ํ ๋๊ตฌ โฉ๏ธ
ํ ์์คํ ์ด ๋ค๋ฅธ ์์คํ ๊ณผ ํต์ ํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋๋ก ์ ๊ณตํ๋ ๊ท์น, ํ๋กํ ์ฝ, ๊ทธ๋ฆฌ๊ณ ๋๊ตฌ์ ์งํฉ โฉ๏ธ
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐ, ๋ฐฐํฌ, ์คํํ ์ ์๋๋ก ์ค๊ณ๋ ์คํ ํ๊ฒฝ โฉ๏ธ
Redis: Remote Dictionary Server์ ์ฝ์๋ก, ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ก ์ฌ์ฉ๋๋ ์คํ ์์ค ์ํํธ์จ์ด โฉ๏ธ
PostgreSQL: ์คํ ์์ค ๊ธฐ๋ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (RDBMS) โฉ๏ธ
RabbitMQ: ์คํ ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker) ์ํํธ์จ์ด๋ก, ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ก์์ ํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ โฉ๏ธ
Kafka: ๋๊ท๋ชจ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ๊ณผ ๋ฉ์์ง ํ์์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์์คํ ์ผ๋ก, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๊ณผ ๋ด๊ตฌ์ฑ์ ์ ๊ณต โฉ๏ธ
JDBC(Java Database Connectivity): API๋ฅผ ์ฌ์ฉํ์ฌ Java ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ์ํํธ์จ์ด ์ปดํฌ๋ํธ โฉ๏ธ
Spring Data KeyValue: ํ๋ก์ ํธ์ ์ผํ์ผ๋ก ์ ๊ณต๋๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ โฉ๏ธ
Spring Data JDBC: JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ์คํ๋ง ๋ฐ์ดํฐ ํ๋ก์ ํธ์ ๋ชจ๋ โฉ๏ธ
๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ๊ณ ์ฑ๋ฅ, ์คํ ์์ค ์๊ฒฉ ํ๋ก์์ ํธ์ถ(RPC) ์์คํ โฉ๏ธ
๊ณ ์ฑ๋ฅ์ ๋ถ์ฐ ๋ฉ์์ง ์์คํ ์ผ๋ก, ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ ๋ฉ์์ง์ ์ง์ํ๋ฉฐ, ๋ฐ์ด๋ ๋ด๊ตฌ์ฑ, ํ์ฅ์ฑ, ๋ฉํฐ ํ ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์คํ ์์ค ํ๋ซํผ โฉ๏ธ
MongoDB: NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ๋๋ก, ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ โฉ๏ธ
Memcached: ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์บ์ ์์คํ ์ผ๋ก, ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ๋๊ณ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋์์ฃผ๋ ์์คํ โฉ๏ธ
DynamoDB: AWS์์ ์ ๊ณตํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋น์ค โฉ๏ธ
Google Cloud Firestore: ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค โฉ๏ธ
๋ถ์ฐ ์์คํ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ถ์ ํ๊ณ ๋ชจ๋ํฐ๋งํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ์์ค ํ๋ก์ ํธ โฉ๏ธ
Mutual TLS์ ์ฝ์. ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก๋ฅผ ์ธ์ฆํ๋ ๋ณด์ ํ๋กํ ์ฝ โฉ๏ธ
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ปดํจํ ์ฌ๋จ โฉ๏ธ