관리 메뉴

너와 나의 스토리

Dapr란? 마이크로서비스 운영 최적화하기 - 개념, 기능, 사용 방법 본문

개발/Spring Boot

Dapr란? 마이크로서비스 운영 최적화하기 - 개념, 기능, 사용 방법

노는게제일좋아! 2025. 3. 10. 17:37
반응형

Dapr: 분산 애플리케이션을 위한 강력한 런타임

1. Dapr란 무엇인가?

Dapr(Distributed Application Runtime)은 클라우드 및 온프레미스 환경에서 분산 애플리케이션을 쉽게 개발할 수 있도록 지원하는 오픈소스 런타임입니다. 다양한 프로그래밍 언어와 프레임워크에서 사용할 수 있으며, 애플리케이션이 인프라에 의존하지 않고 상태 관리, 서비스 간 통신, 이벤트 처리 등을 수행할 수 있도록 도와줍니다.

Dapr은 기본적으로 Kubernetes 환경에서 실행되지만, 로컬 개발 환경에서도 쉽게 실행할 수 있도록 설계되었습니다. 이를 통해 컨테이너 기반 애플리케이션뿐만 아니라 기존의 전통적인 애플리케이션에도 적용할 수 있습니다.

주요 기능

  • 서비스 간 통신 (Service Invocation): HTTP 및 gRPC를 사용한 마이크로서비스 간 호출을 쉽게 구현할 수 있습니다.
  • 상태 관리 (State Management): Redis, PostgreSQL, Cosmos DB 등 다양한 스토리지 백엔드를 지원하는 상태 저장 기능을 제공합니다.
  • Pub/Sub 메시징 (Publish & Subscribe): Kafka, RabbitMQ, AWS SNS/SQS 등 다양한 메시지 브로커를 활용한 이벤트 기반 통신을 지원합니다.
  • 비밀 관리 (Secrets Management): Azure Key Vault, HashiCorp Vault 등과 통합하여 애플리케이션에서 안전하게 비밀을 관리할 수 있습니다.
  • 입출력 바인딩 (Bindings): 클라우드 서비스(S3, Azure Blob Storage 등) 및 외부 API와 쉽게 통합할 수 있습니다.
  • 분산 트레이싱 및 모니터링: OpenTelemetry 및 Prometheus와 통합하여 애플리케이션의 상태를 추적하고 모니터링할 수 있습니다.
  • 액터 모델 (Actor Model): 액터 기반 애플리케이션을 쉽게 구현할 수 있도록 지원합니다.

 

2. Dapr을 활용하면 어떤 이점이 있는가?

1) 플랫폼 및 언어 독립적인 개발 가능

  • Dapr은 다양한 프로그래밍 언어(Python, Java, Node.js, .NET 등)에서 사용할 수 있으며, 특정 클라우드나 인프라에 종속되지 않습니다.
  • 동일한 애플리케이션 코드를 로컬 개발 환경, Kubernetes, VM 환경 등 어디에서든 실행할 수 있습니다.

2) 인프라 종속성을 줄이고 유지보수를 단순화

  • 일반적으로 애플리케이션은 Redis, RabbitMQ, PostgreSQL 등 여러 가지 기술 스택을 직접 사용해야 합니다.
    • RabbitMQ: 메시지 큐(Message Queue) 시스템으로, 여러 시스템 또는 서비스가 비동기적으로 서로 메시지를 주고받을 수 있도록 돕는 소프트웨어입니다.
  • 하지만 Dapr을 사용하면 애플리케이션 코드에서 특정 데이터 저장소나 메시지 브로커에 대한 직접적인 의존성을 없앨 수 있습니다.
  • 클라우드 환경이 변경되더라도 Dapr 설정만 수정하면 되므로 유지보수가 훨씬 간편합니다.
  • Dapr는 각 애플리케이션 인스턴스 옆에 배치되는 sidecar process로 실행되며, 애플리케이션이 다양한 기능을 필요로 할 때 Dapr 사이트카가 그 기능을 제공합니다.
    • kubernetes에서 pod마다 하나의 Dapr 사이드카 컨테이너를 추가하여 배포됩니다.
    • Sidecar Pattern 설명은 하단 참조.

출처: https://dzone.com/articles/open-source-dapr-for-spring-boot-developers

  • 오른쪽 다이어그램을 보면, 스프링 부트 애플리케이션이 대퍼 API에만 의존합니다. 
  • 이러면 애플리케이션은 Radis나 RabbitMQ 클라이언트를 포함할 필요가 없으므로 의존성이 줄어들게 됩니다.
  • Dapr에서 사용할 메시지 브로커(RabbitMQ, Kafka) 또는 데이터베이스(MySQL, PostgreSQL) 등을 설정 및 변경 가능합니다.
    • 변경 시 애플리케이션을 수정할 필요 없이 Dapr 설정만 변경하면 됩니다.

3) 로컬 개발 환경에서 마이크로서비스 개발 가능

  • Kubernetes 없이도 로컬에서 Dapr을 실행할 수 있어 개발 및 테스트가 훨씬 쉬워집니다.
  • Testcontainers와의 통합을 통해 다양한 환경에서 테스트를 수행할 수 있습니다.

4) 서비스 간 보안 강화

  • Dapr은 서비스 간 호출 시 mTLS(mutual TLS) 인증을 기본 지원하며, 보안이 강화된 상태에서 애플리케이션을 운영할 수 있습니다.

 

3. Dapr 사용 방법

1) Dapr 설치하기

로컬 개발 환경에서 Dapr을 실행하려면 먼저 Dapr CLI를 설치해야 합니다.

# Dapr CLI 설치 (MacOS/Linux)
curl -fsSL https://raw.githubusercontent.com/dapr/cli/master/install/install.sh | /bin/bash

# Windows (PowerShell)
iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex

Dapr을 설치한 후 아래 명령어로 실행할 수 있습니다.

# 로컬에서 Dapr 실행
dapr init

2) Spring Boot에서 Dapr 사용하기

Spring Boot에서 Dapr을 사용하려면, Dapr Java SDK를 추가해야 합니다.

Maven 의존성 추가

<dependency>
    <groupId>io.dapr</groupId>
    <artifactId>dapr-sdk-springboot</artifactId>
    <version>1.9.0</version>
</dependency>

서비스 간 호출 예제 (Service Invocation)

@RestController
@RequestMapping("/orders")
public class OrderController {
    
    @PostMapping("/create")
    public ResponseEntity<String> createOrder(@RequestBody Order order) {
        return ResponseEntity.ok("Order created: " + order.getId());
    }
}
# Dapr을 사용하여 Spring Boot 애플리케이션 실행
dapr run --app-id order-service --app-port 8080 -- java -jar order-service.jar

3) Dapr Pub/Sub 활용하기

아래 코드는 Dapr의 Pub/Sub 메시징을 활용하는 예제입니다.

메시지 발행 (Publish)

@Autowired
private DaprClient daprClient;

public void publishEvent() {
    daprClient.publishEvent("pubsub", "orders", new Order(123));
}

메시지 구독 (Subscribe)

@RestController
public class OrderSubscriber {

    @Topic(name = "orders", pubsubName = "pubsub")
    @PostMapping("/orders")
    public void handleOrder(@RequestBody Order order) {
        System.out.println("Received order: " + order.getId());
    }
}

 


 

+추가) Sidecar 패턴

  • 마이크로서비스 아키텍처에서 주로 사용되는 디자인 패턴입니다.
  • 이름(sidecar: 오토바이 옆 카트)처럼 애플리케이션과 별도로 동작하는컨테이너를 붙여서 보조하는 역할을 하게 만드는 방식입니다.
  • 사이드카는 주 애플리케이션과 동일한 인프라에서 실행되지만, 기능적으로는 주 애플리케이션의 일부가 아니라 독립적인 서비스입니다.
  • 사이드카는 부모 애플리케이션에 연결되고 애플리케이션에 대한 지원 기능을 제공합니다. 
    • 사이드카는 기보 애플리케이션과 동일한 리소스에 액세스할 수 있어서, 서비스 간 통신, 로깅, 모니터링, 보안, 트래픽 관리 등의 부가적인 기능을 처리하는 데 유용합니다.
  • 사이드카는 일반적으로 특정 기능을 제공하는 독립적인 컴포넌트로 설계되어, 여러 애플리케이션에서 재사용이 가능하고, 주 애플리케이션의 코드 변경 없이 기능을 업데이트하거나 확장할 수 있습니다. 

 

 

 

출처 및 참고 자료:

반응형
Comments