๐ก์๋น์ค/ํ๋ก์ ํธ ์๊ฐ
All in One ํตํฉ ๋ฌ๋ ์๋น์ค์
๋๋ค.
๋ฌ๋ ๊ธฐ๋ก ๊ด๋ฆฌ, ํฌ๋ฃจ ํ๋, ๋ํ ์ ์ฒญ ๋ฑ ๋ฌ๋๊ณผ ๊ด๋ จ๋ ์๋น์ค๋ค์ ์์ ์ ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
๐ฏ์๋น์ค/ํ๋ก์ ํธ ๋ชฉํ
๋๊ท๋ชจ ํธ๋ ํฝ ๋์
MSA ๊ตฌ์กฐ๋ก ์ฅ์ ๋์ ๋ฐ ํ์ฅ์ฑ ํ๋ณด
Kafka๋ฅผ ์ด์ฉํด ๊ณ ์ฑ๋ฅ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ ๊ตฌํ
Redis๋ก ์ฒ๋ฆฌ ์๋ ํฅ์
์์ ์ ์ธ ๋ชจ๋ํฐ๋ง
Prometheus, Grafna ์ด์ฉ
์์คํ
, ์ดํ๋ฆฌ์ผ์ด์
์งํ ๊ด๋ฆฌ
๋ฐฐํฌ
Docker๋ฅผ ์ด์ฉํด ์คํ ํ๊ฒฝ ํต์ผ, ๋ฐฐํฌ ๋จ์ํ
๋ฌ๋ ๊ธฐ๋ก
์ฌ์ฉ์ ID, ๋ฌ๋ฆฐ ๊ฑฐ๋ฆฌ, ๋ฌ๋ฆฐ ์๊ฐ, ํ๊ท ํ์ด์ค๋ฅผ ์
๋ ฅ ๋ฐ์ ๊ด๋ฆฌํ๋ ์๋น์ค์
๋๋ค.
๋ฌ๋ ๊ธฐ๋ก ๋ฑ๋ก ๋ฐ ์ ์ฅ์ ํฉ๋๋ค.
๋ฌ๋ ๊ธฐ๋ก ๋ฑ๋ก ์ Kafka๋ฅผ ์ด์ฉํ์ฌ ์
์ ์๋น์ค๋ก ๋ฌ๋ ๊ธฐ๋ก ์์ฑ ์ด๋ฒคํธ๋ฅผ ๋ ๋ฆฝ๋๋ค.
๋ญํน
๋ฌ๋ ๊ธฐ๋ก ๊ธฐ๋ฐ ๋ญํน ์๋น์ค์
๋๋ค.
์ฌ์ฉ์๋ค๊ฐ ํน์ ํฌ๋ฃจ๊ฐ ๊ธฐ๋ก์ ํ์ธํ์ฌ, ๊ฒฝ์์ ๋ถ์ถ๊ธธ ์ ์์ต๋๋ค.
๊ฐ์ธ ๋ญํน ์ฐ์ ์ ์ผ์ ๊ธฐ๊ฐ๋ง๋ค ๋์ ๋ฌ๋ฆฐ ๊ฑฐ๋ฆฌ(Km) , ๋์ ๋ฌ๋ฆฐ ์๊ฐ , ํ๊ท ํ์ด์ค๋ก ๊ฐ ๋ญํน์ด ์ฐ์ ๋ฉ๋๋ค.
ํฌ๋ฃจ ๋ญํน ์ฐ์ ์ ํฌ๋ฃจ์ ํ์ฌ ๊ฐ์
๋ ํฌ๋ฃจ์ ์ , ๋ชจ์์ ์ฐธ์ฌ์จ ๋ฑ์ผ๋ก ๋ญํน์ด ์ฐ์ ๋ฉ๋๋ค.
๋ญํน์ ์ผ์ ๊ธฐ๊ฐ๋ง๋ค ์ค์ผ์ฅด๋ง์ผ๋ก ์ค๋
์ท ํํ๋ก ๊ธฐ๋ก๋ฉ๋๋ค.
์
์
๋ฌ๋ ๊ธฐ๋ก ๊ธฐ๋ฐ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ ์
์ ์ ๋ฌ์ฑํ๋์ง ํ์ธํด์ฃผ๋ ์๋น์ค์
๋๋ค.
์
์ ์๋น์ค๋ฅผ ํตํด ๋ฌ๋ ๋ชฉํ ๋ฌ์ฑ์ ์ ๋ํด์ค๋๋ค.
Kafka๋ฅผ ํตํด ๋ฌ๋ ๊ธฐ๋ก ์์ฑ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์
์ ๋ฌ์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ค, ๋ฌ์ฑ ์ ์๋ฆผ ์๋น์ค๋ก ์ฌ์ฉ์๋ค์๊ฒ ์
์ ๋ฌ์ฑ ์๋ฆผ์ ๋จ๊น๋๋ค.
์ด์ฉ์ ๋ณด๊ณ ์ (ReCap)
์ฌ์ฉ์ ๋ฌ๋ ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฝ ๋ณด๊ณ ์๋ฅผ ์์ฑํด์ฃผ๋ ์๋น์ค์
๋๋ค.
์ฌ์ฉ์ ๋ฌ๋ ๊ธฐ๋ก ๋ฐ์ดํฐ์ ์๋ ์์น๋ฅผ ์ด์ฉํ์ฌ ์ด์ฉ์์๊ฒ ์๋ฏธ ์๋ ํต๊ณ๋์ ๊ณ์ฐํ์ฌ ์ ๊ณตํฉ๋๋ค.
๋ฌ๋ ํฌ๋ฃจ
ํฌ๋ฃจ ๊ธฐ๋ฅ
์ด์ฉ์๋ค์ด ๋ง์ ๋ง๋ ์ฌ๋๋ค๊ณผ ํจ๊ป ๋ฌ๋ ๊ฒฝํ์ ๊ณต์ ํ ์ ์๋๋ก ํฌ๋ฃจ๋ฅผ ๋ชจ์งํ๊ฑฐ๋ ๊ธฐ์กด ํฌ๋ฃจ์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
ํฌ๋ฃจ ์ฅ์ด ํฌ๋ฃจ ํ์์ ๊ด๋ฆฌํ์ฌ ๊ฐ์
์ ์ฒญ์ ๊ด๋ฆฌํ๊ณ , ์ด๋ฏธ ๊ฐ์
์ค์ธ ๋ฉค๋ฒ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
ํ๋ฐํ ํฌ๋ฃจ ํ๋์ ์ํด ํฌ๋ฃจ ๋ด ๋ชจ์์ ๋ชจ์งํ ์ ์๋ ๊ธฐ๋ฅ๊ณผ, ํฌ๋ฃจ์๋ค์ด ์ฌ์ฉํ ์ ์๋ ๊ฒ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํฌ๋ฃจ ๋ด ๋ชจ์ ๊ธฐ๋ฅ
ํฌ๋ฃจ ์ ๊ธฐ ๋ชจ์์ด๋ , ํฌ๋ฃจ์์ด ์์ ๋กญ๊ฒ ํฌ๋ฃจ ์์์ ๋ชจ์์ ๋ชจ์งํ์ฌ ๊ฐ์ด ๋ฌ๋ ํ๋์ ํ ์ ์์ต๋๋ค.
๊ฒ์ํ ๊ธฐ๋ฅ
ํฌ๋ฃจ ๋ด ์ ๋ณด ๊ฒ์๋ฅผ ๋ด๋นํ๋ ๊ธฐ๋ฅ์
๋๋ค.
๊ฒ์๊ธ ์์ฑ, ์กฐํ, ๊ฒ์, ์์ , ์ญ์ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
๋ํ
๋ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ
๊ณต์ ๋ํ๋ฅผ ๋ฑ๋กํ์ฌ ๋ฌ๋๋ค์๊ฒ ๋ํ ์ฐธ๊ฐ๋ฅผ ์ ๋ํด์ฃผ๋ ์๋น์ค์
๋๋ค.
๋ํ ์์ฑ, ์กฐํ, ๊ฒ์, ์์ , ์ญ์ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
์ฃผ์ต์๋ณ ๋ํ ๊ด๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ์ฐฉ์/์ถ์ฒจ ๋ฐฉ์์ ๋ค์ํ ์ ์ ์ ํ ์ง์ํฉ๋๋ค.
์ฐธ๊ฐ ์ ์ฒญ ํ๋ก์ธ์ค
Saga Pattern์ ํ์ฉํ์ฌ ๋ถ์ฐ ํธ๋์ญ์
์ ๊ด๋ฆฌํฉ๋๋ค.
์ฝ๊ด ๋์ โ ๊ธฐ๋
ํ ์ ํ โ ๋ฐฐ์ก์ง ์
๋ ฅ โ ๊ฒฐ์ โ ์ฐธ๊ฐ ํ์ ์ ๋จ๊ณ์ ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
Redis๋ฅผ ํ์ฉํ Saga ์ํ ๊ด๋ฆฌ๋ก ํธ๋์ญ์
์ผ๊ด์ฑ ์ ์งํ๊ณ ์์ต๋๋ค.
์๋ฆผ ์๋น์ค
Kafka๋ฅผ ํ์ฉํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ ๊ตฌํํ์์ต๋๋ค.
์ฑ๋ด
์ฌ์ฉ์์ ๋ฐ๋์ ๊ดํ ์ง๋ฌธ์๋ํด AI์ฑ๋ด์ด ๋ฏธ๋ฆฌ ์ ์ฅ๋ ๋ฐ๋์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
๊ด๋ฆฌ์๊ฐ vector storeํ
์ด๋ธ ์ ์ฅ API๋ฅผ ์ด์ฉํด์ ๋ฐ๋๊ด๋ จ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ง๋ฌธ์ ์์ฒญํ๋ฉด ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ์ ์ฌ๋๊ฐ ๋น์ทํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋กฌํํธ๋ฅผ ์์ฑํฉ๋๋ค.
ํ๋กฌํํธ ์์ง๋๋ง์ ํ๋ฅด์๋ ํจํด์ ์ ์ฉํด AI์ ๋ฐ๋ ์ ์ ์ถ์ ์ฝ์น๋ผ๋ ์ญํ ์ ๋ถ์ฌํ์ฌ ๋ต๋ณ์ ์ ํ๋๋ฅผ ๋์
๋๋ค.
์์ฑ๋ ๋ต๋ณ์ SSE๋ก ์ค์๊ฐ์ผ๋ก ์๋ตํฉ๋๋ค.
์๋ฆผ
์
์ ๋ฌ์ฑ, ๋ํ ์ ์ฒญ ์๋ฃ ๋ฑ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ์ Slack์ผ๋ก ์๋ฆผ ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.
์๋ฆผ ์๋น์ค์์ Kafka ์ปจ์๋จธ๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ Slack API๋ฅผ ํธ์ถํด ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.
Kafka์ปจ์๋จธ Lag, ๋ฉ์์ง ์ ์ก ์ฑ๊ณต/์คํจ ๋ฑ์ Grafana๋์๋ณด๋๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง์ ํฉ๋๋ค.
์นดํ
๊ณ ๋ฆฌ
๊ธฐ์
๋ฒ์
๊ทผ๊ฑฐ/ ๋ชฉ์
์ธ์ด
Java
17
LTS ์ง์ ์ต์ ์ธ์ด
๋น๋
Gradle
1.1.7
๋น๋ ๊ด๋ฆฌ ์๋ํ
ํ๋ ์์ํฌ
Spring Boot
3.4.4
์ค์ ๊ฐ์ํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ
Netflix Eureka
Spring Cloud 2024.0.1
MSA ํ๊ฒฝ์์ ์๋น์ค ์ธ์คํด์ค ์๋ ๋ฑ๋กยท๊ฒ์
Spring Boot JPA
SQL ์์ด๋ ๊ฐ๋จํ ๊ตฌํ
Spring Boot Kafka
๋น๋๊ธฐ ์ฒ๋ฆฌํ์ฌ ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ํ์ฅ์ฑ ํ๋ณด
Jackson2JsonRedisSerializer
JSON ํํ๋ก ์ ์ฅยท์กฐํ
Swagger(springdoc-openapi)
2.8.5
API ๋ช
์ธ ์๋ ์์ฑ, ํ
์คํธ ํธ์์ฑ
Infra
Docker
๊ฐ๋ฐยทํ
์คํธ ํ๊ฒฝ ์ผ์น
PostgreSQL
ankane/pgvector:latest
๋ฒกํฐ ๊ฒ์ ๊ธฐ๋ฅ ํฌํจ
Redis
redis/redis-stack
Zookeeper
wurstmeister/zookeeper
์คํ์
๊ด๋ฆฌยทํํฐ์
๋ฉํ๋ฐ์ดํฐ ์กฐ์จ
Apache Kafka
wurstmeister/kafka
๋ฉฑ๋ฑยท์ฌ์๋ ์ค์
UI
kafka-ui
provectuslabs/kafka-ui
๋ชจ๋ํฐ๋ง
Prometheus
prom/prometheus
๋ฉํธ๋ฆญ์ ์คํฌ๋ํํด ์๊ณ์ด ๋ฐ์ดํฐ ์์ง
Grafana
grafana/grafana
๋ฉํธ๋ฆญ์ ๋์๋ณด๋ํ
Loki
grafana/loki
๋ก๊ทธ๋ฅผ ๋ผ๋ฒจ๋งํด ์ค์์ง์ค์ ์ ์ฅ
Micrometer Registry Prometheus
๋ชจ๋ํฐ๋ง ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐ
Test
Spring Boot Starter Test
JUnit Platform Launcher
ํตํฉ ํ
์คํธ์ ์ฐ๋ ํ
์คํธ ์ง์
๐ฅ ๊ธฐ์ ์ ์์ฌ๊ฒฐ์
๐ฅ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ ์ ์ฉ
Kafka๋ฅผ ์ ํํ ์ด์
๐ฅ ์ค๊ฐ ์ํ ์ ์ฅ
Redis ๋ฅผ ์ ํํ ์ด์
๐ฌ Running-Record ์์ฑ API ์ฒ๋ฆฌ๋ ๊ฐ์
RunningRecord ์์ฑ API์ ์ฑ๋ฅ ๋ณ๋ชฉ ์์ธ ๋ถ์ ๋ฐ ์ฒ๋ฆฌ๋ ๊ฐ์ ๊ณผ์
๐ฌ AWS ํ๊ฒฝ์ ๋ฐฐํฌ ํ Spring Cloud Gateway ๊ฐ Eureka Client ๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๋ฌธ์
ECS์์ ์ปจํ
์ด๋๊ฐ ์๋ชป๋ IP๋ก Eureka์ ๋ฑ๋ก๋๋ ๋ฌธ์ ๋ถ์ ๋ฐ ํด๊ฒฐ
๐ฌ ์ฌ์ฉ์ ์ธ์ฆ์ธ๊ฐ ์๋ฒ๋ถ๋ฆฌ์ ๊ฒ์ดํธ์จ์ด ์ํ์ฐธ์กฐ ์ค๋ฅ
FeignClient ๋น ์์ฑ ์ ์ GatewayFilter๊ฐ ๋จผ์ ์ฃผ์
์ ์๊ตฌํ๋ฉด์ ์๋ก ์ฐธ์กฐํ๋ ๊ตฌ์กฐ ๊ฐ์
ํ์๋ช
ํฌ์ง์
๋ด๋น
๊นํ๋ธ ๋งํฌ
๊ฐ๋ฏผ
ํ์
โถ ๋ฌ๋๊ธฐ๋ก - ๋ฌ๋๊ธฐ๋ก ์๋น์ค๋ ์ ์ ID, ๋ฌ๋ฆฐ ๊ฑฐ๋ฆฌ, ๋ฌ๋ฆฐ ์๊ฐ, ํ๊ท ํ์ด์ค๋ฅผ ์
๋ ฅ๋ฐ์ ๋ฌ๋ ๊ธฐ๋ก์ผ๋ก ์ ์ฅํ๋ ์๋น์ค์
๋๋ค. - ์จ์ด๋ฌ๋ธ ๋๋ฐ์ด์ค์ ๋ฐ๋ผ ๋ฌ๋ ๊ธฐ๋ก์ ํ์์ด ์ฝ๊ฐ์ฉ ์ฐจ์ด๊ฐ ์์ ์๋ ์์ง๋ง, ์ฐ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌ๋ ๊ธฐ๋ก ํ์์ ๊ตฌํํ์์ต๋๋ค. - ๋ฌ๋ ๊ธฐ๋ก ์์ฑ, ๋จ๊ฑด ์กฐํ, ์ ์ฒด ๋ชฉ๋ก ์กฐํ, ๊ฒ์, ์ญ์ ๋ฅผ ๊ตฌํํ์์ต๋๋ค. - ๋ฌ๋ ๊ธฐ๋ก ์์ฑ์, ์
์ ํ์ธ์ ์ํด ์
์ ์๋น์ค์ Kafka๋ฅผ ์ด์ฉํ์ฌ ๋ฌ๋ ๊ธฐ๋ก ์์ฑ ์ด๋ฒคํธ๋ฅผ ๋ณด๋
๋๋ค. โถ ์
์ - ์
์ ์๋น์ค๋ ๋ฌ๋ ๊ธฐ๋ก ๊ธฐ๋ฐ์ผ๋ก ์
์ ์ ํ์ธํด์ฃผ๋ ์๋น์ค์
๋๋ค. - Kafka๋ฅผ ์ด์ฉํ์ฌ ๋ฌ๋ ๊ธฐ๋ก ์์ฑ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ด๋ฒคํธ ๋ด์ฉ์ธ ๋ฌ๋ ๊ธฐ๋ก ์์น์ ์
์ ๊ธฐ์ค ๋ฐ ์์น๋ฅผ ๋น๊ตํ์ฌ ์
์ ๋ฌ์ฑ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค. - ์
์ ๋ฌ์ฑ์, ํด๋น ์ด์ฉ์์๊ฒ ์๋์ ๋ณด๋ด๊ธฐ์ํด kafka๋ฅผ ์ด์ฉํ์ฌ ์๋ ์ด๋ฒคํธ๋ฅผ ์๋ ์๋น์ค์ ๋ณด๋
๋๋ค. - ์
์ ํ์ธ ์ธ ์
์ ๋ฑ๋ก, ๋จ๊ฑด ์กฐํ, ์ ์ฒด ๋ชฉ๋ก ์กฐํ, ์ฌ์ฉ์ ๋ณ ์กฐํ, ๊ฒ์, ์ญ์ ๋ฅผ ๊ตฌํํ์์ต๋๋ค.
๊น๋ํ
ํ์
โถ ์ฑ๋ด - Spring AI, Google Vertext AI๋ฅผ ์ฌ์ฉํ์ฌ RAG๊ธฐ๋ฐ์ AI์ฑ๋ด ์๋น์ค ๊ฐ๋ฐํ์์ต๋๋ค. - SSE๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต์ ์ฌ์ฉ์์๊ฒ ์ค์๊ฐ์ผ๋ก ์ ๋ฌํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. โถ ์๋ฆผ - ๋ํ, ์
์ ๋๋ฉ์ธ์์ ์ค๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ Kafka ์ปจ์๋จธ ๊ฐ๋ฐํ์์ต๋๋ค. - Kafka ์ปจ์๋จธ์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฌ๋ ๋ฉ์์ง ์ ์กํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. - Prometheus, kafka expoter, Loki, Grafana๋ฅผ ์ฌ์ฉํ์ฌ Kafka Lag, ๋ฉ์์ง ์ ์ก ์ฑ๊ณต/์คํจ ๋ฑ ๋ชจ๋ํฐ๋ง ๊ตฌํํ์์ต๋๋ค.
๊น์ฌํ
ํ์ฅ
โถ ์ฌ์ฉ์ - ์ฌ์ฉ์ ์๋น์ค๋ ์ ์ ์ ํ์๊ฐ์
, ํ์ํํด , ํ์์ ๋ณด ์์ , ํ์์ ๋ณด ์กฐํ, ํ์ ๊ฒ์๋ฑ์ ์ง์ํ๋ ์๋น์ค ์
๋๋ค. - ์ฌ์ฉ์ ์๋น์ค๋ ์ฑ
์ ๋ถ๋ฆฌ ์์น์ ๋ฐ๋ผ ์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ(Authorization) ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ณ๋์ Auth ์๋น์ค์์ ๊ตฌํํ์ต๋๋ค. - ์ฌ์ฉ์ ์ ๋ณด ์์ฑ, ์์ , ์ญ์ ๋ ์ธ์ฆ ์๋ฒ๋ก Kafka ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ์์๋ฐ์ค(outbox)ํจํด์ ํ์ฉํ์ฌ ๋ ์๋น์ค๊ฐ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ์ฅ์ ์์๋ ์ด๋ฒคํธ์ ์ ์ค ์์ด ๋ณต๊ตฌ ๋ฐ ์ฌ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณํ์ต๋๋ค. โถ ์ธ์ฆ/์ธ๊ฐ & Gateway - JWT ๊ธฐ๋ฐ์ Stateless ์ธ์ฆ ๋ฐฉ์ ๊ตฌํ - Spring Security๋ฅผ ์ ์ฉํ์ฌ ๋ก๊ทธ์ธ ์, Access Token ์ ์งง์ ์ ํจ๊ธฐ๊ฐ์ผ๋ก ๋ฐ๊ธํ๊ณ , Refresh Token ์ ๊ฐ์ด ๋ฐ๊ธํ์ฌ Redis ์ ์๋ฒ ๋ด๋ถ์ ์ค์ ํด๋ ์ ํจ๊ธฐ๊ฐ๋งํผ TTL ์ค์ ์ ํ์ฌ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅ ๋ฐ ๊ด๋ฆฌํ์ฌ , ์ธ์ฆ ์ฒ๋ฆฌ ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ต์ํ ํ์ต๋๋ค. ๋ ๋ก๊ทธ์์์ ๋๋ ๋ธ๋๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ์ฌ Access Token ์ ํ์ทจ ๋นํ๋๋ผ๋ ๋ ์ด์ ์ด์ฉ ํ ์ ์๊ฒ ๋ง๋ค์์ต๋๋ค. - ์ธ์ฆ/์ธ๊ฐ ์๋น์ค๋ ๊ฒ์ดํธ์จ์ด์์ ์ง์ ์ ๋ฌ๋ JWT Access Token ์ ํํฐ์์ ๋ด๋ถ ๋ก์ง์ ๋ฐ๋ผ ๊ฒ์ฆํ๊ณ , ์ ํจ์ฑ์ ํ์ธ ํ ๋ถ์ํ์ฌ X-User-Id, X-User-Name, X-User-Role ๋ฑ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํค๋์ ์ฝ์
ํ ๋ค , ๊ฒ์ดํธ์จ์ด์ ๋ณด๋ด ๊ฐ ์๋น์ค๋ก ์ ํํ๋๋ก ๊ตฌํํ์ต๋๋ค. - ์ด๋ฅผ ํตํด ๊ฐ ๋ง์ดํฌ๋ก ์๋น์ค์์๋ ๋ณ๋์ ์ธ์ฆ ๋ก์ง ์์ด ํค๋์ ํฌํจ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ทผ(์ญํ , ๋ณธ์ธํ์ธ) ์ ์ํ ํ ์ ์์ผ๋ฉฐ, ์ ์ฒด ์์คํ
์์ ์ค์ ์ง์ค์ ์ธ์ฆ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ์ฌ ๋ณด์ ์ ์ฑ
์ ์ผ๊ด์ฑ๊ณผ ์ ์ง๋ณด์ ํจ์จ์ฑ์ ํ๋ณด ํ ์ ์์์ต๋๋ค. - CheckPermission ์ด๋ผ๋ Custom AOP ๊ตฌํํ์ฌ ๊ฐ ์๋น์ค์ ์ปจํธ๋กค๋ฌ ๋จ์์ ์ฌ์ฉ์์ ์ญํ ์ ๊ฒ์ฆ ํ ์ ์์ต๋๋ค. - Gateway์์ Swagger UI๋ฅผ ์ฐ๋ํ์ฌ , ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ API๋ฅผ ์ค์์์ ํตํฉ ๋ฌธ์ํ ํ์์ต๋๋ค. โถ ๋ญํน - ๋ญํน ์๋น์ค๋ ์ผ์ ๊ธฐ๊ฐ(๋งค์ฃผ ์์์ผ ์ค์ 2์) ๋ง๋ค ์ค์ผ์ฅด๋ง์ ํตํด ๋ฌ๋๊ธฐ๋ก ๋ฐ์ดํฐ ๋๋ ํฌ๋ฃจ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ , ๋ญํน์ ์ฐ์ ํ์ฌ ์ด์ฉ์๋ค์ ๋๊ธฐ๋ถ์ฌ ๋ฐ ์๊ทน์ด ๋ ์ ์๊ฒ ํ์์ต๋๋ค. - ๋ญํน์ด ๊ธฐ์ค์ด ๋๋ ์งํ๋ ๋ฆฌํ๋์
(Reflection) ๊ธฐ๋ฅ์ ํตํด ๊ตฌํ ํ์์ผ๋ฉฐ , ๊ฐ์ธ ๋ญํน์ ๊ฒฝ์ฐ ๋ฌ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด์์ ์ด ๊ฑฐ๋ฆฌ , ์ด ์๊ฐ , ํ๊ท ํ์ด์ค , ํฌ๋ฃจ์ ์ , ๋ชจ์์ฐธ์ฌ ์ธ์๋ฑ์ ํ๋๋ฅผ ๋์ ์ผ๋ก ์ถ์ถํ์ฌ ํด๋น ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ญํน์ ์ฐ์ ํ ์ ์๋๋ก ํ์์ต๋๋ค. - ๊ฐ ์๋น์ค์ ์ ๋ณด๋ฅผ ์์ฒญํ ๋, ํด๋น ๋ฐ์ดํฐ๋ ์ค์๊ฐ์ฑ์ด ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ , ๋น๋๊ธฐ๋ ์บ์ฑ์ด ํ์์๋ ๋จ์ ์์ฒญ-์๋ต ๊ตฌ์กฐ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด FeignClient๋ฅผ ํ์ฉํ์ฌ ํต์ ํ์์ต๋๋ค. - ๋ญํน ์ฐ์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด TreeSet ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์์๊ฐ ์ฝ์
๋ ๋๋ง๋ค ์๋์ผ๋ก ์ ๋ ฌ ๋๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ ๋ ฌ ์์
์์ด๋ ์์ ์ฐ์ ์ด ๊ฐ๋ฅํ์ผ๋ฉฐ, ๋ญํน ๊ณ์ฐ ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์์ต๋๋ค. โถkafka Interceptor & Auditing - Kafka ํต์ ์ ๋ณ๋์ ProducerInterceptor๋ฅผ ๋ง๋ค์ด ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋ , ํค๋์ ์ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ด ๋ณด๋์ต๋๋ค. - Kafka๋ Http๊ธฐ๋ฐ์ด ์๋๋ฏ๋ก ๊ธฐ์กด์ AuditorAware ๊ธฐ๋ฐ์ ์๋ Auditing์ด ์ ์ฉ๋์ง์์์ผ๋ฉฐ, Kafka Consumer ์ธก์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ณ๋์ AOP(AuditorKafkaAspect) ๋ฅผ ๊ตฌํํ์ต๋๋ค. โ ํด๋น ์ด๋
ธํ
์ด์
์ด ์ ์ฉ๋ ๋ฉ์๋์์ userId๋ฅผ ์ถ์ถํ์ฌ AuditorAwareImpl ์ ์ง์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ํ์์ต๋๋ค.
๊น์ง์
ํ์
โถ ๋ํ - ์งง์ย ์๋ตย ์๊ฐ,ย ย ์์๊ฐย ๊ผฌ์ด์งย ์๋ย ๋ค๋จ๊ณย ํธ๋์ญ์
,ย ์ฅ์ ย ๋ฐ์ย ์ย ๋ฐ์ดํฐย ์ ์คย ์์ดย ์ ํํย ๋ณต๊ตฌ๋๋ย ์ ๋ขฐ์ฑ์ ์ํดย Kafkaย +ย Sagaย ํจํดย +ย Redisย ๋ก ๋ถ์ฐ ํธ๋์ญ์
๊ตฌํํ์์ต๋๋ค. - ๋ํ ์ ์ฒญ ์์ฒญ ์ ์ฌ์ฉ์ยท๋ํ(paticipant_id - competition_id)ย ์กฐํฉ์ย ๋ํย SagaState๋ฅผย Redis์์ย ์ฐพ๊ณ (์์ผ๋ฉดย ์ย IDย ์์ฑ)ย ํ์ฌย ์งํย ๋จ๊ณ๋ฅผย ํ์ธํฉ๋๋ค. - CompetitionSagaOrchestrator๊ฐย ํด๋นย ๋จ๊ณ์ย ๋๋ฉ์ธย ๋ฐ์ดํฐ๋ฅผย ์ ์ฅํ๊ณ ย ๋์ผํย sagaId๋ฅผย ํค๋กย ํ๋ย Kafkaย ์ด๋ฒคํธ๋ฅผย competition_sagaย ํ ํฝ์ย ๋ฐํํฉ๋๋ค. - SagaEventConsumer๊ฐย @KafkaListener๋กย ํด๋นย ํํฐ์
์ย ๋จ์ผย ์ค๋ ๋๋กย ์๋นํฉ๋๋ค. - Consumer๋ย Redis์ย SagaState๋ฅผย ๊ฐฑ์ ํ๋ฉด์ย ์ฝ๊ดย โย ๊ธฐ๋
ํย โย ๋ฐฐ์ก์งย โย ๊ฒฐ์ ย ์์ย โย ๊ฒฐ์ ย ์๋ฃย โย ์๊ฒฉย ๊ฒ์ฌย โย ์ฐธ๊ฐย ํ์ ย โย ์๋ฆผย ๋ฐ์กย ์์ผ๋กย ๋๋ฉ์ธย ์๋น์ค๋ฅผย ํธ์ถํฉ๋๋ค. (๋จ์ผ ์๋ ํฌ์ธํธ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด์ ์งํํฉ๋๋ค.) - ๊ฒฐ์ ย ๋จ๊ณ๊ฐย ์ฑ๊ณตํ๋ฉดย Consumer๋ย DB์ย ์ฐธ๊ฐย ํ์ ์ย ์ ์ฌํฉ๋๋ค. - Kafkaย ํ ํฝ(competition_notification)์ย ์๋ฆผย ์ด๋ฒคํธ๋ฅผย ๋ฐํํฉ๋๋ค. - ์ค๋ณตย ์ ์ฒญย ๋๋ย ์ ์ย ์ด๊ณผ์ฒ๋ผย ๊ฒ์ฆ์ดย ์คํจํ๋ฉดย Consumer๊ฐย ๋ณด์ย ์ด๋ฒคํธ๋ฅผย ๋ง๋ค์ดย ์ญ์์ผ๋กย ์ทจ์๋ฉ๋๋ค. โถ ๋ชจ๋ํฐ๋ง - ๋ํ ์ ์ฒญ ํ๋ก์ธ์ค์ ๋จ๊ณ๋ณ ์๋ฃ์จ๊ณผ ์ ์ฒด ํ๋ก์ธ์ค ์ฑ๊ณต๋ฅ ์ ์ธก์ ํ๊ธฐ ์ํด ๋ค์ค ๊ณ์ธต์ ๋ชจ๋ํฐ๋ง ์์คํ
์ ๊ตฌ์ถํ์์ต๋๋ค. - Micrometer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉ,๊ฐ ๋จ๊ณ๋ณ ์นด์ดํฐ๋ฅผ ์ ์ํ์์ต๋๋ค. - Spring Boot Actuator์ Prometheus ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ ๋
ธ์ถ, ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ์์ต๋๋ค. - ๋จ๊ณ๋ณ ์๋ฃ์จ๊ณผ ์ ์ฒด ํ๋ก์ธ์ค ์ฑ๊ณต๋ฅ ์ ๊ณ์ฐํ๊ธฐ ์ํดPrometheus์ PromQL ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. (์ฝ๊ด ๋์ ๋จ๊ณ์ ์๋ฃ์จ = ์ฝ๊ด ๋์ ์๋ฃ ํ์ / ์ ์ฒญ ์์ ํ์, ์ ์ฒด ํ๋ก์ธ์ค ์ฑ๊ณต๋ฅ = ์ต์ข
์๋ฃ ํ์ / ์ ์ฒญ ์์ ํ์) - Grafana ๋์๋ณด๋์์ ์๊ฐํ. ๊ฒ์ด์ง ์ฐจํธ๋ก ํ์ฌ ์ฑ๊ณต๋ฅ , ์๊ณ์ด ๊ทธ๋ํ๋ฅผ ํตํด ์๊ฐ์ ๋ฐ๋ฅธ ๋ณํ ์ถ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก JSON ํ์์ผ๋ก ์์ฑํ์์ต๋๋ค.
์ตํด์ธ
ํ
ํฌ๋ฆฌ๋
โถ ์ด์ฉ์ ๋ณด๊ณ ์ - ์ด ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ๋ฌ๋ ํ๋์ ๊ธฐ๋กํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ ์ด์ฉ์ ๋ณด๊ณ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ์์ ๋ฌ๋ ๊ธฐ๋ก์์ ์๋ฏธ ์๋ ์์น๋ฅผ ๊ฐ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ์ฐธ๊ณ ํ ์ ์๋ ํต๊ณ ์์น๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค - ํน์ ๊ธฐ๊ฐ ๋์ ์ฌ์ฉ์์ ๋ฌ๋ ๊ธฐ๋ก์ ์ด์ฉํด ์ฃผ๊ธฐ์ ์ผ๋ก ์ด์ฉ์ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ฉฐ ํน์ ๊ธฐ๊ฐ (์๋ฅผ ๋ค์ด, ํ ์ฃผ, ํ ๋ฌ ๋์)์ ์ถ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ณผ์ ์ ์ต์ ํํ๊ธฐ ์ํด Spring Scheduler ๊ณผ Spring Batch ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. - Spring Batch ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ณผ์ ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋ํ์ต๋๋ค. - Spring Batch ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ItemReader ์ธํฐํ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ItemProcessor ์ธํฐํ์ด์ค ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ItemWriter ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ ์ด๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉ์ ๋ณด๊ณ ์ ๋ฐฐ์น ์์
(Job)์ ๊ตฌ์ฑํ์์ต๋๋ค. - ์ฌ์ฉ์ ๋ณด๊ณ ์ ๋ฐฐ์น ์์
์ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ฌ๋ ๊ธฐ๋ก ์๋น์ค(runningRecord-service) ๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ApiCallStep ๊ณผ ํต๊ณ ์์น๋ฅผ ์์ฑํ๋ reCapStep ๋๊ฐ๋ก ๋ถ๋ฆฌํ์ฌ ํ๋์ ์์
์ด ์คํ๋ฉ๋๋ค. - recapStep ์ ์ฌ์ฉ์ ๊ธฐ๋ก์์ ๊ฐ๊ณตํ๊ณ ์ถ์ ํญ๋ชฉ๋ง๋ค ๋
๋ฆฝ์ ์ธ Step ์ ์์ฑํ์ฌ ๋ณ๊ฐ ์ค๋ ๋์ ํ ๋นํ๊ณ ๊ฐ ํญ๋ชฉ๋ง๋ค ๋ชฉํ ํต๊ณ ์์น๋ฅผ ๊ณ์ฐํฉ๋๋ค. (์: ๋ฌ๋ ๊ธฐ๋ก์ ๊ฑฐ๋ฆฌ ํญ๋ชฉ์ผ๋ก๋ถํฐ ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.) - ์๋น์ค ๋ฐ์ ์ ๋ฐ๋ผ ๋ชฉํ ํต๊ณ ์์น๊ฐ ๋ง์์ ธ๋ Batch ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ๋๋๋ก ์ ๋ต ํจํด์ ์ด์ฉํด Step์ ์์ฑํฉ๋๋ค. โถ ๋ฐฐํฌ โข AWS ํ๊ฒฝ์์ ๋ฐฐํฌํ์์ต๋๋ค. โข ๋ณ๋์ ํ๋ก ํธ์๋๋ ์์ง๋ง ํ์ฅ์ฑ๊ณผ ์๋น์ค ๊ฐ๋ฐ์ ๋
๋ฆฝ์ฑ์ ํ๋ณดํ๊ธฐ ์ํ์ฌ ALB, ์ ํ๋ฆฌ์ผ์ด์
, ์ธํ๋ผ๋ฅผ AWS Private Subnet ์ ์ด์ฉํด ๋ณ๋์ ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ ์ ํ์ ์ธ 3ํฐ์ด ๊ณ์ธต ์ํคํ
์ณ๋ก ์ค๊ณํ์์ต๋๋ค. โข ์ฌ์ฉ์๊ฐ ๋๋ฉ์ธ์ ํตํด API ๋ฅผ ํธ์ถํ๋ฉด ์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ํธ๋ํฝ์ด ์ ๊ทผํ๊ณ Route53 ๊ณผ ์ฐ๊ฒฐ๋ ALB๊ฐ ์ด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ Private Subnet์ผ๋ก ๋ณด๋
๋๋ค ALB์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์๋น์ค๋ Spring Cloud Gateway ๊ฐ ์๋ Gateway ์๋น์ค์
๋๋ค. โข ์ ํ๋ฆฌ์ผ์ด์
์ ECR์ ์ ์ฅํ ๊ฐ MSA ์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ECS์ ๋
๋ฆฝ์ ์ธ ํ
์คํฌ๋ก ์์ฑํ๊ณ ์ด๋ฅผ ์๋น์ค๋ก ์คํ์ํค๋ ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ์์ต๋๋ค. โข ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ Github ์ Push ํ๋ฉด Github actions ๋ฅผ ์ด์ฉํด ์ด๋ ์๋น์ค๊ฐ ๋ณ๊ฒฝ๋์๋ ์ง ๊ฐ์งํ๊ณ ํด๋น ์๋น์ค์ ํด๋นํ๋ ์ด๋ฏธ์ง๋ฅผ ECR ์ ๋ค์ Push ํ๋ ๋ฐฉ์์ผ๋ก ECS ์๋น์ค๋ฅผ ์ฌ๋ฐฐํฌํฉ๋๋ค. โข ๋กค๋ง ๋ฐฐํฌ ๋ฐฉ์์ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ์๊ฐ๊ณผ ์์ฐ์ ํ๊ณ๋ก ํ ์๋น์ค์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์คํํ์ง ๋ชปํด ์ค์ง์ ์ธ ๊ฒฝํ์ ๋ชป ํด๋ดค๊ณ ์ถํ ๊ณ ๋ํ๊ฐ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. โข ์ธํ๋ผ ๊ณ์ธต์ AWS RDS, AWS ElasticCache๋ฅผ ์ฌ์ฉํด ๋ก์ปฌ์์ ์ฌ์ฉํ๋ docker-compose ์ postgresql, ๊ณผ redis ์ปจํ
์ด๋๋ฅผ ๋์ฒดํ์์ต๋๋ค. โขkafka ๋EC2์ ๋ณ๋๋ก ์ค์นํ์ฌ ์๋ฒ๋ฅผ ์ด์ํ์์ต๋๋ค. โข ๋ชจ๋ํฐ๋ง ์๋ฒ๋ฅผ ๋์ด prometus ๋ฅผ ์ด์ฉํด ์๋น์ค๋ค์ ๋งคํธ๋ฆญ์ ์์งํฉ๋๋ค.