์๊ฐ์ ์ฝ๋๋ก ์ ๋ฆฌํ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋๋ค.
"์ ์ด๋ ๊ฒ ๋์ํ๋๊ฐ"๋ฅผ ์ง์ ๊ตฌํํด๋ณด๋ฉฐ ์ดํดํ๊ณ ,
๋ถ๋ถ์ด ์๋ ์ ์ฒด ์์คํ
์ ์ํธ์์ฉ ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ผ๋ด
๋๋ค.
ํ ์คํธ์ ์ฝ๋ ํ์ง
- ์ปค๋ฒ๋ฆฌ์ง ์ซ์๋ณด๋ค "์ด ํ ์คํธ๊ฐ ์ค์ ๋ก ํ๊ท๋ฅผ ์ก์๋ด๋๊ฐ"๋ฅผ ๋จผ์ ๋ฌป์ต๋๋ค. ํต๊ณผํ๋ ํ ์คํธ์ ์ ๋ขฐํ ์ ์๋ ํ ์คํธ๋ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ์ข์ ์ฝ๋๋ ๊ฒฐ๊ตญ ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ผ๊ณ ๋ด ๋๋ค. ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ฉด ์ค๊ณ์ ์์ธ์ด ์๋ ๊ฑด ์๋์ง ๋จผ์ ์์ฌํฉ๋๋ค.
- ๋ชจ๋ ์ํฉ์ ํต์ฉ๋๋ ์ ๋ต์ ์๋ค๊ณ ์๊ฐํด์, ํธ๋ ์ด๋์คํ๋ฅผ ๋ช ์์ ์ผ๋ก ๋น๊ตํ๊ณ "์ ์ด ๋ฐฉ์์ ์ ํํ๋๊ฐ"๋ฅผ ๋จ๊ธฐ๋ ์ต๊ด์ ๋ค์ด๊ณ ์์ต๋๋ค.
- ์ง๊ธ ๋น์ฅ ํ์ํ์ง ์์ ์ ์ฐ์ฑ์ ๋ฏธ๋ฆฌ ์ค๊ณํ๊ธฐ๋ณด๋ค, ์ค์ ๋ก ๋ฐ๋ ๋ ๋ฐ๊ฟ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ์ชฝ์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ธฐ์ ๋ณด๋ค ๋ณธ์ง
- ์๋ก์ด ๊ธฐ์ ์์ฒด๋ณด๋ค, ๊ทธ ๊ธฐ์ ์ด ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ๋ณธ์ง์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค.
- ๋๊ตฌ๋ ๊ณ์ ๋ฐ๋์ง๋ง ๋ฌธ์ ์ ๋ณธ์ง์ ์ ๋ฐ๋์ง ์๋๋ค๊ณ ์๊ฐํด์, ํน์ ์คํ์ด๋ ํธ๋ ๋๋ณด๋ค ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๋ฐ ๋ ์๊ฐ์ ์๋๋ค.
๊ธฐํ์ ์ค๊ณ๋ก ์ฎ๊ธฐ๋ ๊ณผ์
- ์ฃผ์ด์ง ๊ธฐํ์ ๊ทธ๋๋ก ๊ตฌํํ๊ธฐ๋ณด๋ค, ๊ธฐํ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํ๋ ค๋ ๊ฑด์ง๋ถํฐ ๋์ง์ด๋ณด๊ณ ๊ทธ ์๋๊ฐ ์ค๊ณ์ ์ ๋ฐ์๋๋์ง ํ์ธํฉ๋๋ค.
- ์๊ตฌ์ฌํญ ํ๋๊ฐ ์ฝ๋ ์ด๋๊น์ง ์ํฅ์ ๋ฏธ์น๋์ง, ๋์ค์ ์๊ตฌ์ฌํญ์ด ๋ฐ๋๋ฉด ์ด๋๊ฐ ํ๋ค๋ฆด์ง๋ฅผ ๋จผ์ ๊ทธ๋ ค๋ณด๋ ํธ์ ๋๋ค.
- ๊ธฐํ๊ณผ ๊ตฌํ ์ฌ์ด์ ๊ฐ๊ทน์ ๊ฒฐ๊ตญ ์ปค๋ฎค๋์ผ์ด์ ์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํด์, ์ ๋งคํ ์ง์ ์ ๋์ด๊ฐ์ง ์๊ณ ๋จผ์ ํ์ธํ๋ ค๊ณ ํฉ๋๋ค.
์คํจ๋ฅผ ๊ฐ์ ํ ์ค๊ณ
- ์ ์ ๋์๋ณด๋ค ์คํจํ์ ๋ ๋ฌด์์ด ๊นจ์ง๋์ง๋ฅผ ๋จผ์ ๊ทธ๋ ค๋ด ๋๋ค. ์ฅ์ ๊ฐ ์ด๋์ ๋๋์ง๋ณด๋ค, ๊ทธ ์ฅ์ ๊ฐ ์ด๋๊น์ง ์ ํ๋๋์ง๊ฐ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ์ ํฉ์ฑ์ ์ผ๋ง๋ ๊ฐํ๊ฒ ๋ณด์ฅํ ์ง๋ ํญ์ ํธ๋ ์ด๋์คํ๋ผ, "์๋ฒฝํ ์ผ๊ด์ฑ"์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ธฐ๋ณด๋ค ๋๋ฉ์ธ์ด ์ค์ ๋ก ์๊ตฌํ๋ ์์ค์ด ์ด๋์ธ์ง๋ถํฐ ํ์ธํฉ๋๋ค.
- ์ฌ์๋, ํด๋ฐฑ, ๊ฒฉ๋ฆฌ ๊ฐ์ ๋์์ ๊ฒฐ๊ตญ ์คํจ๋ฅผ ์์ ๋ ๊ฒ ์๋๋ผ ์คํจ์ ๋ฐ๊ฒฝ์ ์ค์ด๋ ์ผ์ด๋ผ๊ณ ์๊ฐํด์, ๋ฌด์์ ํฌ์ํ๊ณ ๋ฌด์์ ์งํฌ์ง ๋จผ์ ์ ํ๊ณ ์ค๊ณํฉ๋๋ค.
order-system โ RabbitMQ ๋น๋๊ธฐ ์ฃผ๋ฌธ ์์คํ
์ฃผ๋ฌธ API๊ฐ ๋ฉ์์ง ๋ฐํ ์ฆ์ ์๋ตํ๊ณ , ์ปจ์๋จธ๊ฐ ์ฌ๊ณ ์ฐจ๊ฐยท์ฃผ๋ฌธ ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์ ๋๋ค.
- MySQL Named Lock(์ฃผ๋ฌธ ๋จ์) + JPA ๋น๊ด์ ๋ฝ(์ฌ๊ณ ๋จ์) ์ด์ค ๋ฝ์ผ๋ก ๋์์ฑ ์ ์ด
- k6 ๋ถํ ํ ์คํธ: 4,000 VUs์์ TPS 2.23k, ์คํจ 0๊ฑด, ์ฌ๊ณ ์ ํฉ์ฑ ์ค์ฐจ 0 ์ค์ธก ๊ธฐ๋ก
- Dead Letter Queue + ์ฌ๋ฐํ์ผ๋ก ์คํจ ๋ฉ์์ง ์ ์ค ๋ฐฉ์ง, prefetchยท์ปจ์๋จธ ์ ํ๋ ๊ณผ์ ๋ฌธ์ํ
query-performance โ ๋์ฉ๋ ์กฐํ ์ฑ๋ฅ ๊ฐ์ (SQL ํ๋ โ Redis ์บ์ฑ)
30๋ง ๊ฑด ๋ฐ์ดํฐ์์ ํ ํ ์ด๋ธ ์ค์บ์ผ๋ก ์ต๋ 14์ด ๊ฑธ๋ฆฌ๋ ํํฐ๋ง ์กฐํ๋ฅผ ๋จ๊ณ์ ์ผ๋ก ๊ฐ์ ํ์ต๋๋ค.
- EXPLAIN์ผ๋ก ํ ํ ์ด๋ธ ์ค์บ(type: ALL) ํ์ธ โ ๊ฐ๊ฒฉ ์ธ๋ฑ์ค ์ ์ฉ์ผ๋ก ์กฐํ ์๊ฐ 70.5% ๋จ์ถ (1s โ 0.295s)
- ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋๋ฐ๋ ๋์ํ์ง ์๋ ์์ธ ๋ถ์ โ ๋ฎ์ ์นด๋๋๋ฆฌํฐ(LocalDate ์ผ ๋จ์ ์ ์ฅ + ์ค๋ณต๋ ๋์ ๋๋ฏธ ๋ฐ์ดํฐ)๋ก ์ตํฐ๋ง์ด์ ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ฒ๋ฆฌ๋ ์ํฉ์ ๊ท๋ช ํ๊ณ , ํ์ ยท๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๋ฐ๋ก์ก์ 82.25% ๋จ์ถ (2s โ 0.355s)
- ์์คํ ๋ณ๊ฒฝ ์๋ SQL ํ๋์ ๋จผ์ , ๊ทธ ์์ Redis Cache-Aside๋ฅผ ์น์ด ์ถ๊ฐ 45.7% ๊ฐ์ (1.01s โ 0.548s) โ ์บ์-DB ์ ํฉ์ฑ ํ๊ณ๊น์ง ๋ฌธ์ํ
| ๋ถ๋ฅ | ์ ์ฅ์ | ํ ์ค ์์ฝ | BACKLOG & FIX |
|---|---|---|---|
| Software Design | law-of-demeter | Tell-Don't-Ask๋ก getter๋ฅผ ์ ๊ฑฐํ ์บก์ํ ๋๋ฉ์ธ ์ค๊ณ โ ํ๋ ฅ์ ๋ฉ์์ง๋ก ๊ฐ์ ํ๊ณ ํ ์คํธ 31๊ฐ๋ก ํ๊ท ๋ฐฉ์ง | |
| Software Design | monolithic-architecture | ํฅ์ฌ๊ณ ๋ ยทDDD๋ก ๋๋ฉ์ธ ๊ฒฝ๊ณ๋ฅผ ๋ถ๋ฆฌํ ์ค๊ณ โ ํฌํธ&์ด๋ํฐยท๊ฐ ๊ฐ์ฒดยท์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ก ๊ท์น์ ์์น๋ฅผ ๋ช ํํ | |
| Software Architecture | distributed-transactions | ๋ถ์ฐ ํธ๋์ญ์ ์ ํฉ์ฑ ํจํด์ ๋จ๊ณ์ ์ผ๋ก ๊ตฌํ โ ๋จ์ผ ACID โ TCC โ Saga(Choreography, Kafka) โ Saga(Orchestration)๋ก ์งํ์ํค๋ฉฐ, requestId ๋ฉฑ๋ฑ์ฑ ์ฒดํฌยทRedis ๋ถ์ฐ๋ฝยท์ฃผ๋ฌธ ์ํ๋จธ์ ์ผ๋ก "์ ํํ 1ํ ์คํ" ๋ณด์ฅ, @Version ๋๊ด์ ์ ๊ธ + @Retryable ์ฌ์๋, Kafka afterCommit()์ผ๋ก ์ ๋ น ์ด๋ฒคํธ ์ฐจ๋จ, Testcontainers E2E ๊ฒ์ฆ | FIX(monolithic) |
| Software Architecture | realtime-chat-platform | KotlinยทSTOMP WebSocket ์ค์๊ฐ ์ฑํ โ ๋ค์ค ์ธ์คํด์ค ํ๊ฒฝ์์ SimpleBroker ํ๊ณ๋ฅผ Redis Pub/Sub ์ฑ๋ ๋ฆด๋ ์ด๋ก ํด์ํด ์ํ ํ์ฅ, JWT๋ฅผ STOMP ์ฑ๋ ์ธํฐ์ ํฐ์์ ์ธ์ฆ, ๋ฉ์์ง ์ฝ์ ์ํ ์ ์ฅยท์ค์๊ฐ ์ ํ | |
| Software Architecture | service-communication-patterns-with-rest-api | ์ํท ๋ธ๋ ์ด์ปคยทํด๋ฐฑ degrade๋ก ์ฅ์ ์ ํ๋ฅผ ๊ฒฉ๋ฆฌํ MSA ํต์ ์ค๊ณ โ ๋ค์ด์คํธ๋ฆผ ์ฅ์ ๊ฐ ์์ ๊ฐ์ฉ์ฑ์ ์นจ๋ฒํ์ง ์๋๋ก ๋ฐฉ์ด | |
| Software Architecture | service-communication-patterns-with-graphql | client-facing REST + ์๋น์ค ๊ฐ GraphQL๋ก ์ ์ก ๊ณ์ธต์ ๋ถ๋ฆฌ โ ํต์ ๋ฐฉ์ ๊ต์ฒด์๋ ์ํท ๋ธ๋ ์ด์ปค๋ก ์คํจ ํ์ ๊ธฐ์ค์ ์ผ๊ด ์ ์ง | |
| Software Architecture | service-communication-patterns-with-grpc | gRPC blocking stub ์ ํ๊ณผ status ๊ธฐ๋ฐ ์ํท ๋ธ๋ ์ดํน โ ์ฌ์๋ ์์ง ์ ๋ถ๊ฐ ์กฐํ 200 degradeยทํ์ ์กฐํ 503+Retry-After๋ก ์ข ์ฐฉ ๋ถ๊ธฐ ์ค๊ณ | |
| Data Engineering | spring-batch-settlement | ์ฒญํฌ ๊ธฐ๋ฐ ๋ฐฐ์น๋ก ๋๋ ๊ฑฐ๋๋ฅผ ์ฌ์ฒ๋ฆฌยท์ฌํ ๊ฐ๋ฅํ๊ฒ ์ ์ฐ โ Clock ์ฃผ์ ์ผ๋ก ์๊ฐ ์์กด์ฑ์ ์ ๊ฑฐํด ๊ฒฐ๊ณผ๋ฅผ ํ ์คํธ๋ก ๊ณ ์ (Jenkins+Docker) | |
| Machine Learning | spring-ai-chat-bot | RAG ํ์ดํ๋ผ์ธ์ผ๋ก ์ฌ๋ด ๋ฌธ์ ๊ธฐ๋ฐ ์๋ต ๊ตฌํ โ Tikaโ์ฒญํนโBGE-M3โElasticsearch์ ๋ค์ค ์ฟผ๋ฆฌ ํ์ฅ์ผ๋ก recall ๋ณด๊ฐ, ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๋งฅ๋ฝ ์ ์ง (๋ก์ปฌ Ollama) | |
| Software Testing | test-driven-development | outside-in TDD๋ก E-์ปค๋จธ์ค API ๊ณ์ฝ์ ๋ช ์ธํ โ 35๊ฐ ํตํฉ ํ ์คํธ๋ก ํ์๊ฐ์ ยทํ ํฐยท๊ฑฐ๋ ์ ์ถ๋ ฅ(์ํ์ฝ๋ยท์๋ตยทJWT)์ @TddApiTest๋ก ๊ณ ์ | |
| Release Engineering | deploy-to-s3-with-jenkins | Jenkins ์ ์ธํ ํ์ดํ๋ผ์ธ์ผ๋ก ์ ์ ์ฌ์ดํธ ๋ฐฐํฌ ์๋ํ โ Docker agent ๊ฒฉ๋ฆฌยทcredential ์ฃผ์ ยทIAM ์ต์๊ถํ์ผ๋ก s3 sync --delete ๋ฌด์ค๋จ ๋ฐฐํฌ | |
| Release Engineering | deploy-to-ecs-with-jenkins | Jenkins ์ ์ธํ ํ์ดํ๋ผ์ธ์ผ๋ก Spring Boot ์ปจํ
์ด๋ ECS(Fargate) ๋ฐฐํฌ ์๋ํ โ ๋ฉํฐ์คํ
์ด์ง Docker ๋น๋ยทECR pushยทjq๋ก task-def ์ด๋ฏธ์ง ์ฃผ์
ํ ๋ฆฌ๋น์ ๊ณ ์ (๋น๋๋ฒํธ ํ๊ทธ)ยทservices-stable ๋๊ธฐ๋ก ๋ฌด์ค๋จ ๋กค๋ง ๋ฐฐํฌ |
BACKLOG(Application Load Balancer) |
| Observability | elk-prometheus-grafana-monitoring | ELK๋ก ๋ก๊ทธ ์์ง, PrometheusยทGrafana๋ก ๋ฉํธ๋ฆญ ๊ด์ธก โ ํน์ ์์ธ์ ๋ํด Discord ์๋ฆผ์ pending periodยทincrease ์๊ฐ์ฐฝ๊น์ง ๋ง์ถฐ ์คํ ์์ด ๋ฐํ |