─━ IT ━─

MSA 설계원칙에 따른 데이터베이스 분리 및 Feign Client를 이용한 데이터 통합의 한계와 예시

DKel 2024. 11. 27. 13:31
반응형
: MSA(Microservices Architecture)는 각 서비스가 독립적으로 배포되고 스케일링될 수 있도록 설계됩니다. 따라서 데이터베이스도 각 서비스가 독립적으로 사용할 수 있도록 분리하는 것이 일반적입니다. 데이터베이스를 주제 영역에 따라 분리하면 확장성이 높아지고, 서비스 간 결합도가 낮아집니다. 그러나 이로 인해 이전에 데이터베이스 레벨에서 처리하던 Join 연산을 서비스 레벨에서 처리해야 하는 문제가 발생합니다. Feign Client와 같은 HTTP Client를 사용하여 다른 마이크로서비스에서 데이터를 가져와 해결할 수 있지만 몇 가지 한계점이 존재합니다.

 
1. **성능 저하**
   - 기존의 Join 쿼리는 데이터베이스 내부에서 수행되며, 이는 일반적으로 최적화되어 매우 빠르게 결과를 반환합니다. 반면, Feign Client를 사용하면 네트워크 레이턴시가 추가되고, 여러 서비스 호출이 필요한 경우 전체 응답 시간이 크게 증가합니다.
 
   ```java
   // Feign Client 인터페이스
   @FeignClient(name = "user-service")
   public interface UserClient {
       @GetMapping("/users/{id}")
       User getUserById(@PathVariable Long id);
   }
 
   // 다른 서비스에서 Feign Client 사용
   @Service
   public class OrderService {
       @Autowired
       private UserClient userClient;
 
       public OrderDTO getOrder(Long orderId) {
           Order order = orderRepository.findById(orderId).orElseThrow();
           User user = userClient.getUserById(order.getUserId());
           return new OrderDTO(order, user);
       }
   }
   ```
 
2. **복잡한 데이터 통합**
   - 여러 데이터 소스를 통합할 때 클라이언트 코드가 복잡해질 수 있습니다. 예전에는 SQL 쿼리 한 줄로 처리하던 로직을 다양한 서비스 호출과 데이터를 직접 조합하는 코드로 대체해야 합니다.
 
   ```java
   public OrderDetailDTO getOrderDetail(Long orderId) {
       Order order = orderRepository.findById(orderId).orElseThrow();
       User user = userClient.getUserById(order.getUserId());
       List<Product> products = productClient.getProductsByOrderId(orderId);
       return new OrderDetailDTO(order, user, products);
   }
   ```
 
3. **일관성 문제**
   - 분산 시스템에서 데이터 일관성을 유지하기 어려운 경우가 많습니다. 데이터베이스에서 Join을 사용할 경우 일관된 데이터를 조회할 수 있지만, 서비스 간 통신에서는 데이터 동기화 문제가 발생할 수 있습니다.
 
   ```java
   @Service
   public class InventoryService {
 
       public void updateInventory(Long productId, int quantity) {
           // Update inventory in database
           inventoryRepository.update(productId, quantity);
 
           // Notify other service (e.g., Order Service)
           orderClient.notifyInventoryChange(productId, quantity);
       }
   }
   ```
 
이러한 한계를 인식하고, Feign Client를 통한 데이터 통합을 적절히 사용해야 합니다. 경우에 따라서는 데이터 중복을 허용하고 각 서비스가 자신의 데이터를 갖고 있도록 설계하는 방법도 고려할 수 있습니다. CQRS(Command Query Responsibility Segregation) 패턴이나 Event Sourcing을 적용해서 데이터 일관성과 성능 문제를 보완할 수도 있습니다.

반응형