[๋ด์ผ๋ฐฐ์์บ ํ TIL, Day 68] ์ต์ข ๋ฐํ - ์์ Q&A ์ ๋ฆฌ
์ต์ข ๋ฐํํ๋ฅผ ์ค๋นํ๋ฉฐ ์ ๋ฆฌํด๋ณธ ์์ ์ง๋ฌธ๋ชฉ๋ก
์ต์ข ๋ฐํํ๋ฅผ ์ค๋นํ๋ฉฐ ์ ๋ฆฌํด๋ณธ ์์ ์ง๋ฌธ๋ชฉ๋ก
์ค๊ณ ๋จ๊ณ์์ ์์ธกํ ๋ณ๋ชฉ์ ์ง์ ์์น๋ก ์ฌํ์ธํ๊ณ , ๋ญํน ์๋ต ์บ์ฑ์ผ๋ก ๊ฐ์ ํ๋ค. ZSet ์ ์ค ์ค์๊ฐ ๋ค์ ์์ ์ผ๋ก ์ด์ด์ง ๊ณผ์ ๊น์ง
Actuator๋ก ๋ฉํธ๋ฆญ์ ๋ ธ์ถํ๊ณ Prometheus๊ฐ ์์ง, Grafana๋ก ์๊ฐํํ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํด K6 ๋ถํ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ด์ธกํ ๊ณผ์
๋งค์ฅ ๋ฑ๋ก ์ด๋ฒคํธ๋ฅผ Outbox ํจํด์ผ๋ก ๋น๋๊ธฐ ๋ฐํํ๊ณ , Redisson ๋ถ์ฐ ๋ฝ์ผ๋ก ๋ค์ค ์ธ์คํด์ค ํ๊ฒฝ์ ์ค๋ณต ๋ฐํ์ ๋ง์ ๊ณผ์
Cache-Aside ํจํด์ผ๋ก ๋งค์ฅ ๋ชฉ๋ก ์บ์ฑ, Redis Sorted Set์ผ๋ก ์ธ๊ธฐ ๋งค์ฅ ๋ญํน ๊ตฌํ, ๊ทธ๋ฆฌ๊ณ ํฌ์คํธ๋งจ ํ ์คํธ ์ค ๋ฐ๊ฒฌํ ๋ฒ๊ทธ ์์
Saga ์ฝ๋ ์ค๊ทธ๋ํผ ์ ๋ต๊ณผ Kafka Outbox ํจํด ๊ฐ๋ ์ ๋ฆฌ, review.events.v1 Consumer ๊ตฌํ, ํ๋ฒ์ฌ์ธ ๊ณต์ ๊ธฐ๋ฐ ๊ฑฐ๋ฆฌ ๊ฒ์ ์ถ๊ฐ
Spring Batch ํต์ฌ ๊ฐ๋ ๊ณผ Redis Sorted Set ๋ญํน ์ ์ฉ ํฌ์ธํธ ์ ๋ฆฌ
๊ธฐ๋ฅ๋ช ์ธ์ ๊ธฐ๋ฐ์ผ๋ก API๋ช ์ธ ์์ฑํ๊ธฐ, ERD ์ค๊ณ
์ฐ๋ฆฌ ์๋น์ค์์ ํฐ์ผํ ์ด๋ ๋ฌด์์ธ๊ฐ, ๊ฒฐ์ ๋ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌํด์ผ ํ๋๊ฐ
Spring AI๋ฅผ ๋ฐฑ์๋ ์๋น์ค์ ๋ถ์ด๋ ๋ฐฉ๋ฒ, Naive RAG ๋ ์ํ์ค ์ดํด
์ฌํํ์ต ์ฃผ์ฐจ, ๊ฐ๋ ์ ๋ฆฌ ๊ณผ์ : ์ํคํ ์ฒ & ์๋น์ค ๊ฐ ํต์ ๊ฐ๋ ์ ๋ฆฌ
MSA ๊ธฐ๋ฐ ๋ฌผ๋ฅ ํ๋ซํผ ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ - ํ๋ฆฌ๋๋ก์ ๊ธฐ์ ๊ตฌํ๊ณผ ๋ฐํ ์กฐ์จ๊น์ง
ApplicationEventPublisher๋ก ์ฃผ๋ฌธ-๊ฒฐ์ ์์กด ์ ๊ฑฐ, Port & Adapter ํจํด์ผ๋ก ํฌ๋ก์ค ๋๋ฉ์ธ ์ฐธ์กฐ ์ ๋ฆฌ, ArchUnit DIP ๊ท์น ์์
4๊ณ์ธต DDD Architecture ๊ฐ์ด๋ ์ ์ฉ๊ธฐ + ArchUnit .or() ๋ฒ๊ทธ
ArchUnit ๊ท์น ์ ๋น, ์ํฐํฐ ERD ๊ฒํ , record DTO, AuditorAware, Config Server ์๋ฌ ์์ธ ๋ถ์
๋ ์ด์ด๋ ์ํคํ ์ฒ ํจํค์ง ์ค๊ณ, ๋ฉํฐ๋ชจ๋ ๊ตฌ์กฐ์์ ๊ณตํต ๋ชจ๋ ์์กด์ฑ ํด๊ฒฐ
B2B ๋ฌผ๋ฅ ์์คํ ์ ํต์ฌ ๋๋ฉ์ธ ์ค๊ณ, Seller Order ๊ณ์ธต ๋์ ์ ํตํ ์ ์ฐ ๊ตฌ์กฐ ๊ฐ์ , ๊ทธ๋ฆฌ๊ณ SKU ๋จ์์ ์ ๊ตํ ์ฌ๊ณ ๊ด๋ฆฌ ์ ๋ต ์๋ฆฝ
Kafka๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ๋ฉ์์ง ์ธํ๋ผ ๊ตฌ์ถ๊ณผ Redis์ ๋ค์ํ ํ์ฉ ์ ๋ต(์บ์ฑ, ์ธ์ , ๋ฆฌ๋๋ณด๋), ๊ทธ๋ฆฌ๊ณ MSA์ ํต์ฌ์ธ Saga ํจํด ๋ณต์ต
Redis๋ฅผ ํ์ฉํ ์ธ์ ํด๋ฌ์คํฐ๋ง, Sorted Set ๋ฆฌ๋๋ณด๋ ๋ฐ ์บ์ฑ ์ ๋ต ์ ๋ฆฌ
Redis์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ฃผ์ ์๋ฃ๊ตฌ์กฐ, Spring Data Redis์ RedisTemplate์ ํ์ฉํ ์บ์ฑ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ค์ต
MSA ๊ธฐ๋ณธ ์ํคํ ์ฒ(aka ๊ป๋ฐ๊ธฐ) ์ค๊ณ
ํ๋ก์ ํธ ๋ฐํ๋ฅผ ๋ง์น๋ฉฐ ๋๋ ์ํ์ ํํ์ ์ฌ๋ก๋ฅผ ํตํ ๋ฐ์ฑ
JPA ๋ํฐ ์ฒดํน์ ํ์ฉํ ์บ์ฑ ์ปฌ๋ผ ์ ๋ฐ์ดํธ ๊ณผ์ ์ ๋ฆฌ ๋ฐ ๋์ปค ๊ธฐ๋ฐ CI/CD ํ์ดํ๋ผ์ธ์ ์๋ฆฌ ์ดํด
์ํ์ฐธ์กฐ์ ์์ธ ๋ถ์๊ณผ ํด๊ฒฐ ๋ฐฉ์ ํ๊ตฌ, ๊ทธ๋ฆฌ๊ณ ํ ํ๋ก์ ํธ์์์ ์ ์ ๊ธฐ์ ์ ํ
๊ฐ์์ฑ ํ๋ณด๋ฅผ ์ํ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ์ ์์ฑํด๋ณด๊ณ ์๋น์ค ์ฑ ์ ์บก์ํ์ ๋ํด ๊ณ ๋ฏผํด๋ณด๋ ์๊ฐ
์์ /์ญ์ ๋ก์ง์์ Auditing ํ๋๊ฐ DTO์ ์ฆ์ ๋ฐ์๋์ง ์๋ ์์ธ ๋ถ์๊ณผ JPA Flush ํ์ด๋ฐ ์ ๋ฆฌ
๋ฐฐ๋ฌ ์ฃผ๋ฌธ ํ๋ซํผ ๋ฐฑ์๋ ์์คํ ๊ตฌ์ถ ์์ : Store, Category, Area
HTTP ๋ฉ์๋ ํ์ฉ, ์ํํธ ๋๋ฆฌํธ ์ ๋ต ๋ ผ์, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋๋ฆฌ์ ํจํค์ง ๊ตฌ์กฐ ์ค๊ณ
Spring MVC์ ๋์ ์๋ฆฌ๋ถํฐ MSA ํต์ฌ ์ปดํฌ๋ํธ ์ดํด
Spring Cloud Gateway์ ํํฐ ์ฒด์ธ ๊ฒ์ฆ, JWT ์ธ์ฆ ๋ก์ง ๋ถ๋ฆฌ, ์ํฐํฐ ์ค๊ณ, QueryDSL ์ค์ , ๊ทธ๋ฆฌ๊ณ ์ฟ ๋ฒ๋คํฐ์ค(K8s)์ Spring Cloud ๋น๊ต
์ค์ ์ง์ค์ ์ค์ ๊ด๋ฆฌ(Config Server), ๋ถ์ฐ ์ถ์ (Zipkin), ์ด๋ฒคํธ ๋๋ฆฌ๋ธ ์ํคํ ์ฒ ํต์ฌ ์ ๋ฆฌ
Controller ํ ์คํธ, AOP ๋ชจ๋ํ, ์ ์ญ ์์ธ ์ฒ๋ฆฌ ๋ฐ MSA ํต์ฌ ์ปดํฌ๋ํธ(Eureka, Gateway) ์ ๋ฆฌ
RestTemplate์ ์ด์ฉํ ์๋ฒ ๊ฐ ํต์ , JPA ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ ๋ฐ ์์์ฑ ์ ์ด, JUnit5/Mockito ๊ธฐ๋ฐ ํ ์คํธ ์ ๋ต ์ ๋ฆฌ
์คํ๋ง ์ํคํ ์ฒ, JPA ์์์ฑ ๋ฉ์ปค๋์ฆ, JWT ์ธ์ฆ ์ ๋ต ๋ฐ N+1 ๋ฑ ์ฃผ์ ๋ฐฑ์๋ ๊ธฐ์ ํค์๋ ์ด์ ๋ฆฌ
Gradle๊ณผ HTTP ํต์ ๊ท์ฝ, Spring MVC์ ํต์ฌ์ธ DispatcherServlet์ ๋์ ํ๋ฆ์ ์ฌ์ ๋ฆฝํด๋ณด์
์๋์ฌ๋ ์ฌ๋ฏธ๋ก ๋ง๋ ๋ธ๋ก๊ทธ์ธ๋ฐ ์ ์ปค๋ฐ์ด ๋ณด์ด์ง ์์๊น
์ฐ๋นํํ~์๋ง์ง์ฐฝ ๊ทธ ์ด๋๊ฐ์ ์๋ ์ฝ๋ฉํ ์คํธ ํ๊ธฐ
๋ด๊ฐ ๋ณด๋ ค๊ณ ์ ๋ฆฌํ ๋งํฌ๋ค์ด ๋ฌธ๋ฒ. 240822 ๋ธ๋ก๊ทธ ์ฎ๊น