๐ ๋ฌธ์
- MSA์์๋ ๊ฐ ์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก DB๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์, ํ ์๋น์ค์์ ๋ค๋ฅธ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ผ๋ก ์กฐํํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, ์ฃผ๋ฌธ ๋ชฉ๋ก์ ์กฐํํ ๋, ์ฃผ๋ฌธ ์์ดํ ์ ๋ณด ์ ๊ณต์ ์ํด ์ํ ์ ๋ณด๋ฅผ JOIN์ผ๋ก ๊ฐ์ ธ์ค์ง ๋ชป ํ๊ณ ์ฃผ๋ฌธ ์์ดํ ๋ง๋ค ์ํ ์๋น์ค์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ค.
- ์ด ๊ณผ์ ์์ ์ฌ๋ฌ ๋ฒ์ API ํธ์ถ์ด ๋ฐ์ํ๊ธฐ์ ์ฑ๋ฅ ์ ํ ์ฐ๋ ค๊ฐ ์์๋ค.
๐ ๋ฐฉ๋ฒ ๋น๊ต
โ 1. ์ฃผ๋ฌธ ์์ดํ ๋ง๋ค ์ํ API ํธ์ถ
์ฃผ๋ฌธ 1๊ฐ → ์ฃผ๋ฌธ ์์ดํ 1๊ฐ ๋ง๋ค ์ํ ์๋น์ค API๋ฅผ ํธ์ถํ์ฌ ์ํ ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ณ ์ด๋ฅผ ํฉ์น๋ค.
โ ์ฅ์
- ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์
โ ๋จ์
- ์ฃผ๋ฌธ๋ง๋ค ์ํ ์ ๋ณด๋ฅผ ๋ณ๋๋ก API ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ์์ฒญ์ด ๋ง์์ ธ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์.
โ 2. ์บ์(redis)๋ฅผ ์ด์ฉํด ์ฃผ๋ฌธ ์ ๋ณด ์ ์ฅ
์ฃผ๋ฌธ + ์ํ ์ ๋ณด๋ฅผ ๊ฒฐํฉํ์ฌ ์บ์์ ์ ์ฅํ๊ณ , ์กฐํ ์์๋ ์บ์์์ ๋ฐ๋ก ์กฐํํ๋ค.
์ฃผ๋ฌธ ์์ฑ ์ ์บ์ ์์ฑํ์ฌ ๊ฐ ์๋น์ค(์ฃผ๋ฌธ, ์ํ, ๋ฐฐ์ก, ๊ฒฐ์ ๋ฑ)์์ ์ ๋ฐ์ดํธ.
โ ์ฅ์
- ์กฐํ ์ ๋ฐ์ดํฐ ํฉํ๋ ๋ก์ง(for๋ฌธ ์ฌ์ฉ)์ด ํ์ ์๊ณ ๋น ๋ฅธ ์๋๋ก ์๋ต ๊ฐ๋ฅ.
โ ๋จ์
- ์ฃผ๋ฌธ ๋ชฉ๋ก์ ๋์ ์ผ๋ก ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์ฃผ๋ฌธ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์บ์ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๋ค.
- ์ฃผ๋ฌธ ๋ชฉ๋ก์ ์ฌ์ฉ์๋ณ๋ก ์ ์ฅํด์ผ ํ๋ฏ๋ก, ์ฌ์ฉ์์ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ์บ์์ ๋ณ๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค. โก๏ธ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๊ฐ ์ปค์ง๊ณ , ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๊ด๋ฆฌ ์ํ์ด ์๋ค.
โ 3. ์บ์(redis)์ ์ํ ์ ๋ณด๋ง ์ ์ฅ, ์ฃผ๋ฌธ ์กฐํ ์ ์บ์ ์กฐํ
์ํ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์บ์ฑ(์ํ ์์ฑ/์์ ์)ํ๊ณ , ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ ์ ๋จผ์ ์บ์๋ฅผ ์กฐํํ ํ, ์บ์์ ์์ผ๋ฉด ์ํ API๋ฅผ ํธ์ถ(์ด๋, ์ํ์๋น์ค๋ ์ํ ์ ๋ณด๋ฅผ ๋ฆฌํด & ์ํ ์ ๋ณด ์บ์ฑ)
โ ์ฅ์
- ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ ์ ์ํ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ค๋ฉฐ, ์บ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ธ๋ถ API ํธ์ถ์ ํ๋ฏ๋ก ๋ถํ์ํ API ํธ์ถ์ ์ค์ผ ์ ์์.
- ์ฌ์ ํ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉํ์ฌ ํฉ์ฑํ๋ ๊ณผ์ ์ด ํ์ํ์ง๋ง ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์๋ ์กฐํ ์๋ ์์ฒด๊ฐ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ๋ถ๋ด์ด ๋ํจ.
โ ๋จ์
- ์ํ ์ ๋ณด๊ฐ ์บ์์ ์์ผ๋ฉด API ํธ์ถ์ด ๋ฐ์ํ ์ ์์ง๋ง, ์บ์ ๊ฐฑ์ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ์ฌ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์.
๐ ์ฑํํ ๋ฐฉ๋ฒ
์ธ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฑํํ์ฌ, ์ํ ์ ๋ณด๋ฅผ ์บ์(Redis)๋ก ๊ด๋ฆฌํ๊ณ , ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ ์ ๋จผ์ ์บ์๋ฅผ ์กฐํํ ํ, ์บ์์ ์์ผ๋ฉด ์ํ API๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ๋๋ค.
// ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ (์ฃผ๋ฌธ + ์ํ ์ ๋ณด)
public List<OrderSummary> getCustomerOrders(OrderListRequest request) {
List<OrderSummary> orderSummaries = new ArrayList<>(); // ์๋ต DTO
// 1. ์ฃผ๋ฌธ DB์์ ์ ์ ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ
List<Orders> orders = orderRepository.findOrdersByRequest(request);
for (Orders order : orders) {
OrderSummary orderSummary = new OrderSummary();
orderSummary = objectMapper.convertValue(order, OrderSummary.class);
// 2. ์ฃผ๋ฌธ ์ํ๋ณ ์ํ ์ ๋ณด ์ธํ
List<OrderItemDetail> orderItemDetails = new ArrayList<>();
for (OrderItems orderItem : order.getOrderItems()) {
OrderItemDetail orderItemDetail = objectMapper.convertValue(orderItem, OrderItemDetail.class);
// ์ํ ์บ์ ์กฐํ
CachedProduct cachedProduct = getCachedProduct(orderItem.getProductId());
// ์บ์์์ ์กฐํ๋ ์ํ ์ ๋ณด๋ฅผ ์ฃผ๋ฌธ ์์ดํ
์ ๋งคํ
OrderItemDetail.OrderedProductInfo orderedProductInfo = mapToOrderedProductInfo(cachedProduct, orderItem.getColorId(), orderItem.getSizeId());
orderedProductInfo.setPrice(orderItem.getPrice()); // ๊ฒฐ์ ๋น์ ๊ฐ๊ฒฉ!!
orderItemDetail.setOrderedProductInfo(orderedProductInfo);
orderItemDetails.add(orderItemDetail);
}
orderSummary.setOrderItemDetails(orderItemDetails);
orderSummaries.add(orderSummary);
}
return orderSummaries;
}
// ์ํ ์๋น์ค API ํธ์ถ (FeignClient ์ฌ์ฉ)
private CachedProduct getCachedProduct(int productId) {
CachedProduct cachedProduct = new CachedProduct();
// 1. ์บ์์์ ์ํ ์ ๋ณด ์กฐํ
cachedProduct = cacheService.getOrderedProductInfo(productId);
// 2. ์บ์์์ ์ํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ํ ์๋น์ค API์ ์์ฒญ
// ์ํ ์๋น์ค์์ ์บ์์ ์ ์ฅํ๊ณ CachedProduct ํํ๋ก ๋ฆฌํดํ๋ค.
if (cachedProduct == null) {
cachedProduct = productClient.getProductForCache(productId);
}
return cachedProduct;
}
'Backend > spring cloud (MSA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MSA ํ๊ฒฝ์์ ์ธ์ฆ/ํ ํฐ ์ฌ์์ฒญ (0) | 2025.04.06 |
---|---|
์ค์๊ฐ ๋ฐ์ดํฐ ์ ์ก (0) | 2025.02.23 |
[Kafka] ๊ณ ๊ธ ์ค์ (0) | 2025.02.23 |
Kafka๋? (0) | 2025.02.23 |
Eureka๋? (0) | 2025.02.16 |