โ ๋ฆฌ์กํธ์์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ซ์์ ๋ฌธ์๊ฐ ์์ธ ์์์ 6์๋ฆฌ ์ธ์ฆ๋ฒํธ๋ฅผ ๋ณด๋ด๊ณ ์ด๋ฅผ ์ค๋งํธ๋ฏธ๋ฌ์ ๋ฐ์ฐ๊ฒ ํ๋ค. ๋ชจ๋ฐ์ผ ํ์์ ์ฑ์์ ํ์ธ์ฆ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น accesstoken ๊ณผ refreshtoken์ ๋ฐ๊ธํ์ฌ ๊ธฐ์กด ์ค๋งํธ ๋ฏธ๋ฌ ํ์๊ณผ ๋ชจ๋ฐ์ผ ํ์์ ์ฐ๋์ํค๋ ๋ฐฉ์์ ์ฑํํ์๋ค.
์ต์ข ์ ์ผ๋ก ์ด๋ ๊ฒ ์ค๊ณํ๋ค.
Ingress Controller๋ก๋ NGINX Ingres Controller๋ก ์ ํ์๊ณ , ๋ฆฌ๋ฒ์คํ๋ก์๋ฅผ ์ํด์ Certbot๊ณผ Let's Encrypt๋ฅผ ์ด์ฉํ ์์ ์ด๋ฉฐ Helm์ ์ด์ฉํ ์์ ์ด๋ค.
3๊ฐ์ ์ธ์คํด์ค ์ค ํ๋๋ฅผ ๋ง์คํฐ ๋ ธ๋๋ก ์ง์ ํ์ฌ Gateway์ Redis, MySQL, Mongo DB (DB ๋์ปค ์ปจํ ์ด๋) ๋ฅผ ์ค์นํ ์์ ์ด๋ฉฐ ๋๋จธ์ง 2๊ฐ์ ์ํฌ๋ ธ๋์ ๊ฐ๊ฐ MSA ์คํ๋ง ์๋ฒ๋ค๊ณผ ๋จธ์ ๋ฌ๋ ์๋ฒ๋ฅผ ๋ ํ๋ฆฌ์นด ๋ณต์ ํด์ ํ๋์ฉ ๋ฐฐํฌํ๊ณ CNI๋ก ์ฐ๊ฒฐํ ์์ ์ด๋ค. ๋ ๊ฒ์ดํธ ์จ์ด์์ ์ต์ ์ฐ๊ฒฐ ์๋ต ์๊ฐ ๋ฐฉ์์ผ๋ก (Haproxy ๋ ์๋๋ฉด ๋ผ์ด๋๋ก๋นํํ๋ก ๋จธ์ ๋ฌ๋ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋๊ธฐ) ๋ก๋๋ฐธ๋ฌ์ฑ์ ํตํด ๊ฐ๊ฐ์ ์๋ฒ์ ํต์ ์ ๋ณด๋ผ๊ฒ์ด๋ค.
๋ํ, Argo CD, ํ๋ก๋ฉํ ์ฐ์ค, ๊ทธ๋ผํ๋๋ ํจ๊ป ์ฌ์ฉํ ์์ ์ด๋ค.
์ด๋ฒ์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค๊ณํ๋ฉด์ ๋ง์ ๊ถ๊ธ์ฆ์ด ์๊ฒจ์ ์ง๋ฌธํํ๋ก ์ ๋ฆฌํด๋์๋ค.
- Jasypt, MySQL๊ฐ์ ๋น๋ฐ๋ฒํธ ymlํ์ผ์ด๋ ์ ํจ์ค ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ์์ ๊ด๋ฆฌํ๋๋ฐ secret๋ก ๊ผญ ์์ฑํด์ผ ํ๋์?
- ๊ทธ์ ์๋ Eureka๋ผ๋ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ์ผ๋๋ฐ ๋ณ๋์ ์ค์น์์ด ๋งค๋ํ์คํธ(yaml)ํ์ผ์ service ํญ๋ชฉ๋ง ์์ฑํ๋ฉด ๋๋์??
- Spring Cloud Gateway๋ฅผ ๊ทธ์ ์ ์ผ๋๋ฐ Eureka ๋ถ๋ถ๋ง ์์ ํด์ ์ฐ๋ฉด๋๋์?? ์ด๋ ์ ํฌ ํ์ด์ฌ ์๋ฒ๊ฐ Fast Api๋ฅผ ์ฌ์ฉํ๋๋ฐ ์คํ๋ง ์๋ฒ๋ ๋๊ฐ์ด url๋ง ๊ด๋ฆฌํ๋ฉด ๋๋๊ฑด๊ฐ์?? ๋ Config Map์ด๋ Secret๋ ๊ผญ ์์ฑํด์ผํ๋์??
- Certbot ๊ณผ Let's Encrypt๋ฅผ NGINX์์ ์ฌ์ฉํ๋๋ฐ NGINC INGRESS CONTROLLER๋ฅผ ์์ง์์ค๋์ ์ด๋ค๋ฉด ๋๊ฐ์๋ฐฉ์์ผ๋ก ํ๋ฉด ๋๋๊ฑด๊ฐ์??
- ๋ก๋๋ฐธ๋ฐ์๋ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ก๋๋ฐธ๋ฌ์๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด yaml ํ์ผ์์ ๊ด๋ฆฌ๊ฐ๋ฅํ๋ค๋๋ฐ ๋ผ์ด๋๋ก๋น ํํ๋ง ์ง์ํ๋๊ฑธ๋ก ์๊ณ ์์ต๋๋ค! ์ ํฌํ๋ก์ ํธ ํน์ฑ์ ๋จธ์ ๋ฌ๋ ์๋ฒ์ชฝ์ ๋ถํ๋ ์๊ฐ์ด ๋ง์ด ์์๋๋๋ฐ ๋ฐ๋ผ์ ์ต์์ฐ๊ฒฐ์ด๋ ์ต์์๋ต์๊ฐํํ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ์์ํด Ha proxy๊ฐ์๊ฑธ ์จ์ผํ๋์ง ์๋๋ฉด ํ์ด์ฌ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ํ๊ณ๋ฅผ ๋์ด์ ๋ผ์ด๋๋ก๋นํํ๋ ๊ฐ๋ฅํ๊ฒ ํ๋๊ฒ ์ข์์ง
- ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค์ ๋ชจ๋ ํ๋๊ฐ ๋์ผํ ๋คํธ์ํฌ๋ฅผ ๊ฐ๊ธฐ์ํด ํ๋ ๋์ปค ๋คํธ์ํฌ๊ฐ ๋ญ์ง ์์ค๊น์?? ์ด๊ฒ CNI ์ธ๊ฐ์?? ๋๊ตฌ ์ง๋ฌธ์ ๋๋ค!
- ์ง๊ธ๊ตฌ์์ ingress controller, certbot, Let's encrypt, Helm, Argo cd, ํ๋ก๋ฉํ ์ฐ์ค, ๊ทธ๋ผํ๋ ์ด๋ฐ ๋๊ตฌ๋ฑ์ ์ฌ์ฉํ ์์ ์ธ๋ฐ ๊ฐ์ฅ ์ฌ์ด๋ฐฉ๋ฒ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋บ๊ป ์์๊น์?? ์๋๋ฉด ์ต์ํ์ ์ฟ ๋ฒ๋คํฐ์ค ๊ธฐ๋ฅ์ ์ํด ๋ํด์ผํ๋๊ฒ ์์๊น์??
- ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ํด(green,blue ์ ์ฑ ๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค) ์ง๊ธ์ ์ธ์คํด์ค ๊ฐฏ์๊ฐ ์ถฉ๋ถํ๊ฐ์?? ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํด 2๋์ ์ธ์คํด์ค์ ๋ณต์ ํด์ ์ฌ์ฉ์ค์ธ๋ฐ ๋ง์ฝ ํ๋ค๋ค๋ฉด ๋ก๋๋ฐธ๋ฐ์ฑ์ ํฌ๊ธฐํ๊ณ ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๊ฐ์??
์ ๋ง ๋ง์ ์ฌ๋๋ค๊ณผ ์ด์๋ํด ํ ๋ก ํด๋ณด์๋ค ๋๋ถ๋ถ ๋ด๊ฐ ์๊ฐํ๋ ๋ฐฉ์์ด ๋ง์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฅ ์ฒ์ ์ค๊ณํ ๋ฐฉ์์ผ๋ก ์งํํ๊ธฐ๋ก ํ๋ค.
๐ ์์ธํ ์ฌํญ์ [ All about ์ฟ ๋ฒ๋คํฐ์ค ] ์ด ๊ฒ์๊ธ ์์ ํ์ธํ์!
โ ์์ฝ๊ฒ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ค์ ํ๋๋ฐ ์๊ฐ์ด ๋ง์ด ๋ถ์กฑํ๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ ๋ ๊ฐํธํ ๋์ปค์ค์์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค.
๋งค๋ฒ ์ฌ๋ฌ ์ข ๋ฅ์ ํฌ์ค ๋ฐ์ดํฐ๊ฐ์ ์ ์ฅํ๋ ๋ก๊น ํํ์ ๊ฒฝ์ฐ ์คํค๋ง๋ฆฌ์ค ๋ฐ Document ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฉ์ดํ Mongo DB๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์๊ณ
ํ๋ฃจ๊ฐ ๋๋๋ฉด Scheduled๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋จ์์ ๊ฐ์ ์ ์ฅํ์ฌ ํธ๋์ญ์ ์ ์ง์ํ๋ (๋ฐ์ดํฐ์ ์ ํ์ฑ๊ณผ ์ผ๊ด์ฑ์ด ์ค์ํ๋ฏ๋ก ๊ทธ๋ฆฌ๊ณ ์ด ๋ฐ์๋ ๋ฐ์ดํฐ์ ์์ ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ, ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ) MySQL์ ์ ์ฅํ๊ธฐ๋ก ํ์๋ค.
๐ ๊ด๋ จ ๋ด์ฉ์ [ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ดํดํ๊ธฐ: MySQL, MongoDB, PostgreSQL, Redis ]
์๋ง๋ ๋์์ฑ ์ด์ ๋๋ ๋คํธ์ํฌ ์ง์ฐ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
mongodb ๋์ปค ์ปจํ
์ด๋๋ ๋งค๋์ ๋
ธ๋์ ์๊ณ ํฌ์ค ์๋น์ค๋ 2๊ฐ์ ์ํฌ๋
ธ๋์ ๋ ํ๋ฆฌ์นด๋ก ๋ณต์ ํด์ ์ฌ์ฉํ๊ณ ์๋ค.
๐ MongoDB Reactive๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์๋ค.
MongoDB Reactive๋ ๋น๋๊ธฐ ๋ฐ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๋ฉด์๋, ๊ฐ ์์ฒญ์ด ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์๊ฒ ํฉ๋๋ค.
๋ฐ๋ผ์ ํ ์์ฒญ์ด ๋คํธ์ํฌ ์ง์ฐ์ด๋ ๋ค๋ฅธ ๋ฌธ์ ๋ก ์ธํด ์ง์ฐ๋๋๋ผ๋,
๋ค๋ฅธ ์์ฒญ๋ค์ด ๊ทธ๋ก ์ธํด ์ฐจ๋จ๋์ง ์๊ณ ๊ณ์ ์คํ๋ ์ ์์ต๋๋ค.
๋์ปค์ค์์ ํ์ํ๊ธฐ๋ก ํ์๋ค. ํ๊ฐ์ ๋งค๋์ ๋ ธ๋์ 2๊ฐ์ ์ํฌ๋ ธ๋๋ก ํ๋์ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํ๊ณ ์ค๋ฒ๋ ์ด ๋คํธ์ํฌ(Overlay network)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ๊ธฐ๋ก ํ์๋ค.
๐๊ด๋ จ ๋ด์ฉ์ [ Docker Swarm Network ์ข ๋ฅ ] ์์ ํ์ธํ์!
๋งค๋์ ๋
ธ๋์ ํผ๋ธ๋ฆญ IP๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ํด๋ฌ์คํฐ๋ก ์ฐ๊ฒฐํ๊ธฐ๋ก ํ์๋ค. ๋ง์ฝ 3๊ฐ๋ค ๊ฐ์ VPC๋ผ๋ฉด ํ๋ผ์ด๋น IP๋ฅผ ์ฌ์ฉํ์ฌ๋ ๋ฌด๊ดํ๋ค.
๐ ๊ด๋ จ ๊ฒ์๊ธ [ Public IP ์ Private IP ]์ ์ฐธ๊ณ ํ์!
๐ ๊ฐ์๊ธฐ ํ๋ก ํธ์์ CORS์๋ฌ๊ฐ ์๊พธ ๋๋ค๊ณ ํ๋ค. Swagger์ ํฌ์คํธ๋งจ์์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์๋๋ฐ ํน์ controller URL ๋งคํ์์๋ง ๋ฌธ์ ๊ฐ ์ผ์ด๋๋ค๊ณ ํ๋ค. ์ญ ๊ฒ์ฌํด๋ณด๋ AuthenticationFilter(ํ ํฐ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ํต๊ณผํด์ผ ํ๋ ํํฐ)๋ฅผ ๊ฑธ์ด์ค ๊ฒ์ค์
predicates:
- Path=/health/**
- Method=GET,POST,PUT,DELETE
์ฌ๊ธฐ ๊ฒ๋ง ์๊พธ ์๋๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
โ
์ ๋ง ๋ง์ ์ฌ๋๊ณผ ์ด์ผ๊ธฐ ํด๋ณธ ๊ฒฐ๊ณผ ์์ธ์ ์ฐพ์ ์ ์์๋ค. ํ๋ก ํธ์๋์์ ํ๋ฆฌํ๋ผ์ดํธ๋ผ๋ ์์ฒญ์ ๋จผ์ ๋ณด๋ธ๋ค๊ณ ํ๋ค. (accesstoken์ ์ ํจ์ฑ์ ํ์ธํด๋ณด๊ธฐ ์ํด) ๊ทธ๋ฐ๋ฐ ์ด ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ด ํํ์ด๋ฉด method๊ฐ options๋๋ค! ๊ทธ๋์ CORS๊ฐ ์ผ์ด๋๋ ๊ฑฐ์๋ค.
๋ฐ๋ผ์, ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์ฌ ํด๊ฒฐํ์๋ค.
predicates:
- Path=/health/**
- Method=GET,POST,PUT,DELETE,OPTIONS
ํ๋ฆฌํ๋ผ์ดํธ์ ๋ํด์๋ [ CORS ์ preflight ] ์ด ๋ธ๋ก๊ทธ์์ ์์ธํ ์ ์ ์๋ค.