[MSA] - 2. API Gateway๊ฐ ํ์ํ ์ด์
์๋ ํ์ธ์. ์ด๋ฒ ๊ธ์ MSA์ ๋ํ ๊ธ์ ์ด์ด์ API Gateway์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์ ํฉ๋๋ค.
์ง๋ MSA ๊ธ์์๋ MSA๋ฅผ ์ ์จ์ผํ๋์ง, ์ด๋จ ๋ ํ์ํ๊ณ , ๋ฌด์จ ์ฅ๋จ์ ์ด ์๋์ง๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํด๋ณด๋ ์์ฃผ ์ฌ์ด ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ค๋ดค์ต๋๋ค. ์ฌ์ค MSA์ ๊น์ด๋ ๊ทธ๊ฒ๋ณด๋ค ๊น๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์ ํ๋ค๋ฉด, ๋ง์ ์ด์ผ๊ธฐ๊ฐ ๋ ๊ฒ ๊ฐ์ ์งง๊ฒ ํ์ํ ๋ถ๋ถ์ ์ค๋ช ๋๋ฆฐ ๊ฒ์ด๊ตฌ์. ํ ๊ธ์์ ์ข ๋ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ค๋ณผ๊น ํฉ๋๋ค.
Spring Cloud๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ API๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๋ ์์๊ณ , ์ด์ ๋น์ทํ๊ฒ Python์ Django, Flask ๋ฑ ํ ์ธ์ด, ํ ํ๋ ์์ํฌ์์๋ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ ์๋์ง ๊ฐ์ด ์กํ์ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค.
์ค๋์ ์ด๋ค API๋ฅผ ๊ทธ๋ฃนํ ์์ผ์ฃผ๋ API Gateway์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
API Gateway
API Gateway? ์ด๋์ ๋ง์ด ๋ค์ด๋ณธ ๋ง์ด๋ค. ์๋ง AWS์์ Serverless Stack์ ๋ค๋ค๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด, Lambda์ API Gateway๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด์ ๊ฒฝํํด๋ณด์ ๋ถ๋ค์ผ ๊ฒ์ ๋๋ค. ๋ค, ๋ง์ต๋๋ค. ์ค์ ๋ก ํด๋น ์๋ฃจ์ ์์ ์ ๊ณตํ๋ API Gateway์ ๋์ผํ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก MSA์ API Gateway ์ ๋๋ค.
AWS, GCP ๋ฑ์ ํด๋ผ์ฐ๋๋ฅผ ์ด์ฉํ์ฌ REST API๋ฅผ ๋ง๋ค๊ณ ์ด์ํ๋ ๋ฐฉ๋ฒ์๋ ๋ํ์ ์ธ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- IaaS (EC2, VM Instance ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ Tomcat, JBoss ๋ฑ์ WAS ๋ฐฐํฌ๋ฅผ ํตํ ์ด์.
- PaaS (ElasticBeansTalk ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ war ํน์ jar ํ์ผ์ ๋ฐฐํฌ๋ฅผ ํตํ ์ด์.
- FaaS (Lambda, Functions ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฐฐํฌ๋ฅผ ํตํ ์ด์.
์ด ์ค์์ API Gateway๋ฅผ ํํ ์ฌ์ฉํ์ฌ REST API์ URI๋ฅผ ์ก์์ค์ผ ํ๋ ๊ฒ์ 3๋ฒ์ ํด๋นํฉ๋๋ค. IaaS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋, ์น ์๋ฒ์์ ์ ๊ณตํ๋ URI๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ณ , PaaS ์ญ์ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
ํ์ง๋ง FaaS๋ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ด๊ฒจ์ ธ ์๋ ์ฝ๋๋ง ๋ค์ด์์ต๋๋ค. ๋ฐ๋ผ์ ํจ์์ ์ด๋ฆ๊ณผ ๋ก์ง๋ง ๋ด๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ฝ๋๊ฐ ์ด๋ URI๋ฅผ ํ์ผํ๋์ง์ ๋ํ ์ ๋ณด๊ฐ ์ ํ ๋ด๊ฒจ์ ธ ์์ง ์์ผ๋ฏ๋ก ์ด์ ๋ํ URI ์ฃผ์๋ฅผ ๋งค๊ฒจ์ค์ผ ํฉ๋๋ค. API Gateway๋ ์ด๋ฐ URI๋ฅผ ํ๋๋ก ํตํฉํ๋ ์ญํ ์ ๋งก๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด MSA์์๋ ์ด๊ฑธ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ฒ ๋ ๊น์? MSA๋ ํฐ ์๋น์ค๋ฅผ ์๊ฒ ์ชผ๊ฐ์ด ๊ฐ๊ฐ์ ์ญํ ์ ๋ถ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด URI ์ฃผ์๊ฐ ์ ๋ถ ๋ฌ๋ผ์ง๊ฒ ๋๊ณ , ์ด ๋ง์ ํฌํธ ์ฃผ์ ๋ฑ์ ํฌํจํ ๋ชจ๋ ์ฃผ์๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด ์๊ธฐ๋ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ง์ API ํธ์ถ์ ๊ธฐ๋ก ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ์ง ์์.
- ๋ด๋ถ ๋น์ฆ๋์ค ๋ก์ง, ์ธํ๋ผ ๋ฑ ์ฃผ์๊ฐ ์ ๋ช ํ๊ฒ ๋ ธ์ถ๋์ด ๋ณด์์ ์ทจ์ฝ.
- ๊ฐ ์๋น์ค ๋ง๋ค ์ธ์ฆ ๋ฑ์ ๊ณตํต ๋ก์ง์ ์ค๋ณต ๊ตฌํ ํด์ผ ํ๋ ๋ฌธ์ ์ ์กด์ฌ.
ํนํ ์ธ ๋ฒ์งธ์ ํด๋นํ๋ ๋ฌธ์ ์ ์ ์๋น์ค ์ด์์ ์์ด ๊ฐ์ฅ ํฐ ํ์ ์ ๋จ๊ธฐ๊ฒ ๋ฉ๋๋ค. ๊ฐ๋ฐ์ ์์ด์ ๋ถํธํ ์ ๋ณด๋ค๋ ๋ ํฌ๋ฆฌํฐ์ปฌํ ๋ฌธ์ ์ผ ํ ๋๊น์.
์ข ๋ ์ฝ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ค๋ช ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ง๋ Spring Cloud ์ค์ต์ ๊ทธ๋๋ก ์ธ์ฉํด์ Note API๋ฅผ ์์ฑํ์ ๋, ์ฐ๋ฆฌ๋ ์ด๋ ๊ฒ ์์ ๊ฐ์ด ํฌํธ ์ฃผ์๋ฅผ ๋ค๋ฅด๊ฒ ๋งค๊ฒจ์ ํ ์คํธ๋ฅผ ํ์ต๋๋ค. ๋ฌผ๋ก ๊ฐ์ ํ๊ฒฝ์ด์๊ธฐ ๋๋ฌธ์, ๊ฐ์ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ณ ์์์ฃ . ๊ทธ๋ฐ๋ฐ, ์ค์ ์ค๋ฌด์์๋ ์ด๋ฅผ ๊ฐ์ ์๋ฒ์์ ์ด์ํ๋ค๊ณ ํ๋๋ผ๋, ์ปจํ ์ด๋ํ ์์ผ์ Docker ๋ฑ์ผ๋ก ์ด์ํ๊ฒ ๋๋ฉด IP ์ฃผ์๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๊ณ , ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์ง์ง ๋ค๋ฅธ ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฆผ์ฒ๋ผ API Gateway๋ API ์๋ฒ ์๋จ์์ ๋ชจ๋ ์๋ํฌ์ธํธ๋ฅผ ๋จ์ผํ ํด์ฃผ๋ ๋ ๋ค๋ฅธ ์๋ฒ์ ์ญํ ์ ํฉ๋๋ค. ์ ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋๋ฉ์ธ์ธ neonkid.xyz๋ฅผ ์๋ก ๋ค์ด์ ํํ์ ํ ๊ฒ์ ๋๋ค. ๋ง์ฝ ์ ๊ฐ ์ ๋ฐ API๋ฅผ ๋ง๋ค๊ณ API Gateway๋ฅผ ์ฌ์ฉํด์ ๋จ์ผํ ํ๋ค๋ฉด ์ ๋ ๊ฒ๋ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ด์ฃ .
์๋ง ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ์ด์ํ์๋ ๋ถ๋ค์ด์๋ผ๋ฉด, ๋ฆฌ๋ฒ์ค ํ๋ก์(Reverse Proxy) ๊ธฐ์ ์ ์ฐ์ํ ๊ฒ์ ๋๋ค. ๋ง์ต๋๋ค. ๊ทธ๊ฒ๊ณผ ๊ฑฐ์ ๋น์ทํ ์ญํ ์ ํ๋ ์กด์ฌ์ ๋๋ค.
์ฌ๊ธฐ์ API Gateway๋ ์ธ์ฆ ์๋น์ค๋ฅผ ์ถ๊ฐ๋ก ๊ฐ์ง๊ณ ์์ด, ์์ฒญ, ์๋ต์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์ ์๋ ๋ง์ดํฌ๋ก ์๋น์ค๋ก ๋ผ์ฐํ ํ๋ ์ญํ ๋ ํฌํจํฉ๋๋ค.
์ด ์ธ์๋ ๋ค์ํ ๊ธฐ๋ฅ์ด ์กด์ฌํฉ๋๋ค.
API Gateway์ ์ฃผ์ ๊ธฐ๋ฅ
1. ์ธ์ฆ/์ธ๊ฐ ์๋น์ค
์ธ์ฆ/์ธ๊ฐ ์๋น์ค๋ ์๋น์ค ํธ์ถ์ ์์ด์ ๋งค์ฐ ์ค์ํ ์ญํ ์ค ํ๋์ ๋๋ค. ๊ด๋ฆฌ์์ ์ฌ์ฉ์๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ ์น ์๋น์ค๋ค์ด ๋๋ถ๋ถ์ธ๋ฐ, ๊ทธ๋ค์ ํธ์ถ์ด ์์ ๋กญ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ฒ ์ฃ .
๊ทธ๋ฐ๋ฐ, ์๋น์ค๊ฐ ๋ถ๋ฆฌ๋๋ค๋ฉด, ์ด๋ฌํ ๋ณด์ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํด์ค์ผ ํ ๊น์? ๊ธฐ์กด ๋ชจ๋๋ฆฌํฑ ์ํคํ ์ฒ์์๋ ๊ณ ๋ฏผํ ํ์๋ ์์ด ์ด๋ฌํ ๋ณด์์ฒ๋ฆฌ๋ฅผ ๋ํ๋์๋ฅผ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๊ฒ ์ฃ . ํ์ง๋ง ์๋น์ค๊ฐ ๊ฐ๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๋ฉด? ๊ทธ๋ค ๋ํ๋์๋ฅผ ๊ฐ API๋ง๋ค ๋ง๋ค์ด์ค๋ค๋ฉด ์์ค๊ฐ ์ค๋ณต๋๊ณ , ๊ทธ๊ฒ ์ฌํด์ง๋ฉด ์ ์ง ๋ณด์๊ฐ ์ ๋ง ํ๋ค์ด์ง๋๋ค.
Spring์ผ๋ก ์๋ฅผ ๋ค์๋ฉด, ๊ฐ ์๋น์ค์ Spring Security ๋ํ๋์ ๋ฃ๊ณ , ๋ง๋ค์ด์ฃผ๋ ๊ฑฐ๋ ๊ฐ์ฃ ...
API Gateway์์๋ ์ด๋ฌํ ์ธ์ฆ, SSL ๋ฑ์ ์๋น์ค๋ฅผ ์คํ๋ก๋ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ถํธํจ์ ํด์์์ผ์ค ์ ์์ต๋๋ค.
2. ๋ผ์ฐํ ๊ณผ ๋ก๋๋ฐธ๋ฐ์ฑ
๋์ฉ๋ ์ฒ๋ฆฌ ์๋น์ค์ ์์ด ๊ฐ์ฅ ํ์์ธ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ด์ ๋ ๊ฑฐ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์๊ฐ ๋์ด๋ฒ๋ ธ์ฃ . ๋ค๋ง ์ฅ์ ์ด ์๋ค๋ฉด, ๋ชจ๋๋ฆฌํฑ ์ํคํ ์ฒ์์๋ ๋ชจ๋ ์๋น์ค๋ค์ ๋ํด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํด์คฌ๋ค๋ฉด, ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ ์ฒ์์๋ ์ค์ ๋ก ์์ฒญ์ด ๋ง์ ์๋น์ค์ ๋ํด์๋ง ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ ์ ์๋ค๊ฑฐ๋ ์ค์ผ์ผ ์ -์์์ ์์ ๋๊ฐ ์ฆ๊ฐํ๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค์.
๋ํ API ์๋ฒ๋ฅผ ์ ๊ทธ๋ ์ด๋ ํ๊ฑฐ๋ ํ ์คํธ ์ค์ ๋ค๋ฅธ URI๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ ์ ์๋๋ก ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋๋ค.
3. ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ (Service Discovery)
MSA์ ์์ด ๊ฐ์ฅ ํ์ํ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. ์๋น์ค๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ ์ํฉ์์ ๊ฐ ์๋น์ค๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ ์๋น์ค๋ง๋ค ๊ณ ์ ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ IP์ ํฌํธ ์ฃผ์๋ฅผ ์๊ณ ์์ด์ผ ํฉ๋๋ค. API ๊ฐฏ์๊ฐ ๊ทธ๋ฆฌ ๋ง์ง ์๋ค๋ฉด ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์๊ฒ ์ง๋ง API ๊ฐฏ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋ง๊ณ , ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด์ ์ฌ๋ฌ ์๋น์ค๊ฐ ์์ง์ด๊ณ ์๋ค๋ฉด, ์ฝ์ง ์์ ๊ฒ์ ๋๋ค.
์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ ๋ด๊ฐ ์ํ๋ ์๋น์ค์ IP, ํฌํธ ์ฃผ์๋ฅผ ์ฐพ์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์ค์ ๋ก ์ด ๊ธฐ๋ฅ์ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ๊ณณ์ด ๋ฐ๋ก ํด๋ผ์ฐ๋์ธ๋ฐ, ํด๋ผ์ฐ๋์ ๊ฒฝ์ฐ๋ ์ค์ผ์ผ ์ -๋ค์ด์ด ์์ฃผ ๋ฐ์ํ๊ณ , ๊ทธ๋ ๊ฒ ๋๋ฉด ์ปจํ ์ด๋ ์์ฑ, ์๋ฉธ์ ๋ฐ๋ผ IP, ํฌํธ ์ฃผ์๊ฐ ๋ฌ๋ผ์ง ๋ฟ๋๋ฌ ๋ ๊ณ ์ ๋ ๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ํ๋ ์๋น์ค๋ฅผ ๊ฒ์ํ์ฌ ์ด๋ค ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ ๊ทธ์ผ ๋ง๋ก ํ์๋ผ๊ณ ํ ์ ์์ฃ .
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง, API Gateway์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋ช ๊ฐ์ง ๋ค๋ค๋ดค์ต๋๋ค. ์์ธํ ํ์ด๋ณด๋ฉด, ๊ธฐ์กด ์ธํ๋ผ ํ๊ฒฝ์์ ํธํ๊ฒ ์ฐ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋ณด์ผ ๊ฒ์ด๊ณ , ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํด๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด, ํ ๋ฒ ์ฏค ๊ฒฝํํด ๋ณธ ๊ณ ๋ฏผ๋ค์ผ ๊ฒ์ ๋๋ค.
์ด ๊ธ์ ์ฐ๋ฉด์ ์ฐธ๊ณ ํ ๊ธ์ด ์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ์๋ ๋ด์ฉ ์ค์๋ SOA ํ๋ก์ ํธ์ ์คํจ ์ฌ๋ก ํฐ ๊น๋ญ์ด ์ ํ์๋๋ฐ์. ๊ทธ ์ค์ ํ๋๊ฐ ๋ฐ๋ก ESB ๋ด๋ถ ๋ก์ง ์ฒ๋ฆฌ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ต๋๋ค. ๊ณผ๊ฑฐ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ์ ์์ฒญ/์๋ต์ XML๋ก ์ฒ๋ฆฌํ๋๋ฐ, XML์ ํ ๋ฒ ํ์ฑํด๋ณด๊ฑฐ๋ ์จ๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ๋๋ผ์๊ฒ ์ง๋ง ๊ต์ฅํ ํ์ฑ๋ ์ด๋ ต๊ณ , ์ฒ๋ฆฌ ์๋ ๋ํ ๋ฌด์ง์ฅ ๋๋ฆฝ๋๋ค..
์ง๊ธ์ JSON, GraphQL์ ๋ง์ด ์ฌ์ฉํ๊ณ ์๊ณ , ์ ๋ํ ๊ทธ๊ฒ์ ๋ง์ด ์งํฅํ๊ณ ์์ต๋๋ค. ์์ผ๋ก ๊ฐ์๋ก ๋์ฉ๋ ์ฒ๋ฆฌ ์๋น์ค์ ์์๋ ๊ณ์ ๋์ด๋ ๊ฒ์ด๊ณ , ์ด๋ฌํ ์ค๋ฒํค๋ ๊ฐ์, ํจ์จ์ ์ธ ์ํคํ ์ฒ์ ์ค๊ณ๋ ํฐ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ก ๋จ๊ฒ ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค์.
๋ค์ ํฌ์คํธ์์๋ Spring Cloud๋ฅผ ์ด์ฉํ์ฌ ์ด ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ํด ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.