CI/CD ํจํด
CI(Continuos Integration) / CD(Continuous Delivery/Deloyment)
MSA ํ๊ฒฝ์์ ๋น์ง๋์ค ๋ฏผ์ฒฉ์ฑ์ ํค์ฐ๊ธฐ ์ํด์๋ ๋ฐฐํฌ ์๋ํ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์๋ค.
์ด๋, ์๋ํ๋ ๋น๋๋ ๋ฐฐํฌ ์์
์ ๋ณดํต CI/CD๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ผ๋ฐ์ ์ธ ํ๋ก์ฐ๋ ์๋์ ๊ฐ๋ค.
- ์๋ก์ด ๋ฒ์ ์ ์ฝ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ํจ๊ป Github์ ๊ฐ์ ํ์ ๊ด๋ฆฌ ์์คํ ์ Push ํ๋ค.
- ๋น๋ ๋๊ตฌ์์ ํน์ ์๊ฐ์ ํ์ ๊ด๋ฆฌ ์์คํ ์ผ๋ก๋ถํฐ ์ฝ๋๋ฅผ Pullํด์ ํตํฉํ ํ์, ์๋์ผ๋ก ๋น๋ํ๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ์ฌ ํ ์คํธ๋ฅผ ์ํํ๋ค.
- ํ ์คํธ ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ก๊ทธ ํ์ผ์ ๋ฆฌํฌํ ํ๊ณ , ๋น๋๋ ์์ค์ฝ๋๋ฅผ ์คํ ์ด์ง ํ๊ฒฝ์ ์๋์ผ๋ก ๋ฐฐํฌํ๋ค.
- QA ํ ์คํฐ๊ฐ ์คํ ์ด์ง ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์ํํ๊ณ , ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์ด์ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ค.
Netflix์ ๊ฒฝํ์ด ๋ง์ดํฌ๋ก ์๋น์ค ์ํ๊ณ๋ก
Micro Service๋ฅผ ๊ตฌ์ถํ๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ทํ๋ฆญ์ค๊ฐ ํด๊ฒฐํ๋ ๋ฐ ๋ง์ ๊ธฐ์ฌ๋ฅผ ํ๋ค๊ณ ํ๋ค.
Netflix OSS๋ Netflix๊ฐ Micro Service๋ฅผ ๊ฐ๋ฐํ๊ณ ์ด์ํ๋ฉด์ ์๊ธด ๋
ธํ์ฐ๋ฅผ ์คํ์์ค๋ก ๊ณต๊ฐํ ๊ฒ์ด๋ค.
์ด๋ก ์ธํด, ๋ง์ดํฌ๋ก์๋น์ค ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ์ ํ์ ์ธ ํจํด์ผ๋ก ์๋ฆฌ ์ก์๋ค.
์๋ฅผ ๋ค์ด, API G/W, Service Discovery, Monitoring, Tracing ๋ฑ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ด๋ฆฌ ๋ฐ ์ด์ํ๊ธฐ ์ํ ํ๋ซํผ ํจํด์ผ๋ก ์ถํ์ ์ด๋ฌํ ํจํด์ ์ ์ฉํ ๋ค๋ฅธ ์ฌ๋ฌ ์คํ ์์ค๊ฐ ์๊ฒจ๋๊ฒ ๋์๋ค.
Spring Cloud (Spring Boot + Netflix OSS)
Netflix OSS๋ฅผ ๋ ์ฝ๊ฒ ์ธ ์ ์๋๋ก Spring ์ง์์์๋ ๊ธฐ์กด Spring Boot์์ ์ ๋์๊ฐ ์ ์๋๋ก Netflix OSS ๋ชจ๋๋ค์ Spring Framework๋ก ๊ฐ์ธ์ Spring Cloud๋ผ๋ ๋ช ์นญ์ผ๋ก ๋ฐํํ๋ค.
Service Discovery ํจํด
MSA์ Cloud๋ฅผ ํจ๊ป ์ฌ์ฉํ ํ๊ฒฝ์์ Auto Scaling๋ฑ์ ์ํด์ ์๋น์ค๊ฐ ๋์ ์ผ๋ก ์์ฑ๋๊ฑฐ๋ ์ปจํ
์ด๋ ๊ธฐ๋ฐ์ ๋ฐฐํฌ๋ก ์ธํด,
์๋น์ค์ IP๊ฐ Dynamicํ๊ฒ ๋ณ๊ฒฝ๋๋ ์ผ์ด ๋ง์์ง๊ฒ ๋๋ค.
๋ฐ๋ผ์, ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค๋ฅผ ํธ์ถํ ๋ ์๋น์ค์ ์์น ์ฆ, IP์ฃผ์์ Port๋ฅผ ์์๋ผ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ Service Discovery ํจํด์ด๋ผ๊ณ ํ๋ค.
Client Side Discovery
Client Side Discovery๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Service Client๊ฐ Service Registry์์ ์๋น์ค์ ์์น๋ฅผ ์์๋ด๊ณ ํธ์ถ ํ๋ ๋ฐฉ์์ด๋ค.
Server Side Discovery
Server Side Discovery๋ ํธ์ถ ๋๋ ์๋น์ค ์์ ์ผ์ข ์ Proxy ์๋ฒ(๋ก๋๋ฐธ๋ฐ์)๋ฅผ ๋ฐฐ์นํ๊ณ , Service Client๋ Proxy์ธ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํธ์ถํ๋ฉด ๋ก๋๋ฐธ๋ฐ์๊ฐ Service Registry๋ก๋ถํฐ ๋ฑ๋ก๋ ์๋น์ค์ ์์น๋ฅผ ์์๋ด์ด, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ํ๋ ๋ฐฉ์์ด๋ค.
AWS์ ELB๊ฐ ๋ํ์ ์ธ Server Side Discovery์ด๋ค!
Service Registry
์ด์ , Service Discovery ํจํด์ ์ฌ์ฉ๋๋ Service Registry๋ Netfilx OSS์ Eureka๊ฐ ๋ํ์ ์ธ ์๋น์ค์ด๋ค.
๊ฐ ์๋น์ค Instance๊ฐ ๋ก๋ฉ๋ ๋ ์์ ์ ์๋น์ค ์ด๋ฆ๊ณผ ํ ๋น๋ IP ์ฃผ์๋ฅผ Service Registry์ ๋ฑ๋กํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์๋น์ค๋ช ์ ํธ์ถํ ๋ ๋ผ์ฐํฐ๊ฐ Service Registry๋ฅผ ๊ฒ์ํ์ฌ ํด๋น ์๋น์ค์ ์ด๋ฆ๊ณผ ๋งคํ๋ IP ์ ๋ณด๋ฅผ ํ์ธํ ํ ํธ์ถํ๋ค.
์ด๋ ๊ฒ, ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ฒ์ ์คํ๋ ๋ ์์ ์ ์์น ์ ๋ณด๋ฅผ Service Registry์ ์ ์ฅํ๊ณ , ์๋น์ค๊ฐ ์ข ๋ฃ๋ ๋ ์์น ์ ๋ณด๋ฅผ ์ญ์ ํ๋ค.
MSA์ Spring Cloud์ ์ฐ๊ณ ํ๋ฆ
- ๋ง์ดํฌ๋ก ์๋น์ค๋ ์ธํ๋ผ์ ์ข ์๋์ง ์๋๋ก DB, ํ์ผ ๋ฑ ์ฌ๋ฌ ์ค์ ์ ๋ณด๋ฅผ ํ์ ๊ด๋ฆฌ ์์คํ ์ ์ฐ๊ณ๋ Config Server์์ ๊ฐ์ ธ์ ์ค์ ์ ๋ณด๋ฅผ ์ฃผ์ ํ๋ค.
- ๋ก๋ฉ๊ณผ ๋์์ Service Registry์ ์์ ์ ์๋น์ค๋ช ๊ณผ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ก๋ถํฐ ํ ๋น๋ฐ์ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๋งคํํ์ฌ ๋ฑ๋กํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ API Gateway๋ฅผ ํตํด ๋ง์ดํฌ๋ก์๋น์ค์ ์ ๊ทผํ๊ณ , ์ด๋ API ๊ฒ์ดํธ์จ์ด๋ ์ ์ ํ ๋ผ์ฐํ ๋ฐ ๋ถํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํํ๋ค.
- ๋ํ, API Gateway์์ ํด๋ผ์ด์ธํธ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ ์ ๊ทผํ๊ธฐ ์ํ ์ฃผ์๋ฅผ ์์๋ด๊ธฐ ์ํด Service Registry์๊ฒ ์์ฒญํ์ฌ ์ฃผ์๋ฅผ ์์๋ธ๋ค.
- ๋์์ API Gateway๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ ์๋น์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๋์ง ๊ถํ ์๋น์ค์ ์ฐ๊ณํ์ฌ ์ธ์ฆ/์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
- ์ด๋ฌํ, ๋ชจ๋ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํธ์ถ ํ๋ฆ์ Monitoring Service์ Tracing(์ถ์ ) Service์ ์ํด ๋ชจ๋ํฐ๋ง๋๋ค.
์ด๋ฌํ ํจํด์ Spring Cloud ์ด์ธ์๋ ์ฌ๋ฌ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ธ AWS, Azure, GCP ๋ฑ์์๋ ์ ์ฌํ ํํ๋ก ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
BFF(Backend For Frontend)
์ต๊ทผ์๋ PC ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ์ฅ์น ๋ฐ ํ๋ซํผ (Web, Android, iOS)์ ์ง์ํ๋ฉด์ ๋ค์ํ ํด๋ผ์ด์ธํธ๋ฅผ ์ํด ํนํ๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ํฉ์ด ์๊ธด๋ค.
์ํ๋ ๋ฐ์ดํฐ ํํ์ ๋๋ฌํ๊ธฐ ์ํด์ ์ฌ๋ฌ API์ Response ๊ฐ์ ์กฐ์ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ฉฐ, Frontend์์ ๋ณต์กํ ๋น์ง๋์ค ๋ก์ง์ ์์ฑํด์ผ ํ๋ฉฐ, ์ฝ๋ ๋ฒ ์ด์ค๊ฐ ๊ฑฐ๋ํด์ง๊ณ ๋ณต์กํด์ง๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ UI ๋ ๋๋ง์ด ๋๋ ค์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ค์ API๋ฅผ Direct๋ก ์์กดํ ๋ ๋ฐ์ํ๋ฉฐ, Backend For Frontend ํ๋ก ํธ์๋๋ฅผ ์ํ ๋ฐฑ์๋ ์ค๊ฐ ์๋ฒ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
๊ฐ ์ฅ์น๋ค์ Entry Point๋ฅผ ํ๋๋ก ๋์ง ์๊ณ , ํด๋ผ์ด์ธํธ์ ์ข ๋ฅ์ ๋ฐ๋ผ ํนํ๋ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ BFF๋ฅผ ์ ๋จ์ ๋๊ณ ๋ค์ ํตํฉ์ ์ธ API G/W๋ฅผ ๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
BFF์ ์ญํ ์?
- MSA ํ๊ฒฝ์์ API Endpoint๊ฐ ๋ถ๋ฆฌ๋ ๋ Follow Up
- ๋ธ๋ผ์ฐ์ ์ ๋จ์ด์ง ์ ์๋ CORS ์ฒ๋ฆฌ
- API๊ฐ ์ง์ ์ ์ผ๋ก ์ฌ๋ฌ ํ๋ซํผ์ ๋ง์ถฐ์ค ํ์ ์๊ฒ ํด์ค
- ํ๋ซํผ๋ณ๋ก ๋ค๋ฅธ ์ธ์ฆ ๋ฐฉ์ ์ฒ๋ฆฌ (iOS๋ FaceID๋ผ๋ Android์๋ ์๋ ์ธ์ฆ ๋ฐฉ์์ด ์์)
- ํ๋ฉด์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์ ์ ์๋๋ก ํจ
GraphQL์ ์ฌ์ฉํ BFF
BFF๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๊ตฌํ์ฒด๋ก GraphQL์ ์ฌ์ฉํ ์ ์๋ค.
GraphQL๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด POST ๋ฐฉ์์ผ๋ก ์์ฒญ์ด ๋ฐ์ํ๊ณ ๋ธ๋ผ์ฐ์ ์ ์บ์ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํด์ฃผ๊ฒ ๋๋ค.
๋ํ, API ์๋ต๊ฐ์ BFF์์ ๋ฐ์์ ๊ฐ ํ๋ซํผ(FE)์์ ์ํ๋ ๋ชจ๋ธ ํ์ ์ผ๋ก Convert ํด์ค์ Response ํด์ค๋ค.
CQRS ํจํด
์ฟ ํก, ๋ฐฐ๋ฏผ ๋ฑ ์ฌ๋ฌ ์๋น์ค๋ฅผ ์๊ฐํด๋ณด๋ฉด CUD ์์ ๋ณด๋ค Read ์์ ์ด ํจ์ฌ ๋ง๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ฌํ ๋น์ง๋์ค ๋ชจ๋ธ์์ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ CRUD ๋ชจ๋ ๊ธฐ๋ฅ์ ํ๋๋ก ๊ตฌ์ฑํ๋ฉด ์กฐํ ์์ฒญ ๋น๋๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ช ๋ น ๊ธฐ๋ฅ๋ ํ์ฅํด์ผ ํด์ ํจ์จ์ ์ด์ง ์๋ค.
๋ํ, ์ฐ๊ธฐ ํธ๋์ญ์ ์์ ์์ ํ ์ด๋ธ์ Lock ๋งค์ปค๋์ฆ์ด ์ ์ฉ๋๋ค๋ฉด ์กฐํ ์๋ต ์๋๊ฐ ๋จ์ด์ง ์ ๋ฐ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ CQRS(Command Query Responsibility Segregation) ํจํด์ ์ด์ฉํ ์ ์๋ค.
ํ๋์ ์ ์ฅ์์ ์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋ณํ์์ผ ์ฐ๊ธฐ ์๋น์ค์ ์กฐํ ์๋น์ค๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค.
๋ ํฐ ์์คํ
์์๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ธฐ ํธ๋์ญ์
์ฉ ์ ์ฅ์์ ์กฐํ์ฉ ์ ์ฅ์๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ ์๋ ์๋ค.
DB ๋จ๊ณ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฉํด๋ณด์ง๋ ๋ชปํ์ง๋ง, ์ด๊ฒ์ ์ฝ๋๋จ๊ณ๋ก ์์ฉํด์ Write ์์ ์ฉ ์๋น์ค ๋ฐ DAO์ Read ์์ ์ฉ ์๋น์ค ๋ฐ DAO๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฐ๋ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ํด๋ณธ์ ์ ์์๊ณ ๊ฐ์ธ์ ์ผ๋ก ๋งค์ฐ ์ข์ํ๋ ๋ฐฉ์์ด๋ค.