Backing Services

2025. 3. 2. 13:41Spring Microservice

📌 Backing Services (외부 서비스 연동)

(Twelve-Factor App 원칙: Backing Services 활용)

마이크로서비스는 데이터베이스, API, 메시징 시스템 등과 네트워크를 통해 통신합니다.
이때, 코드 수정 없이 로컬 및 클라우드 서비스를 유연하게 변경할 수 있도록 설계하는 것이 중요합니다.
이 섹션에서는 Backing Services(외부 서비스)를 활용하여 유연한 마이크로서비스를 구축하는 방법을 설명합니다.

🔹 1. Backing Services(외부 서비스)란?

Backing Services란 애플리케이션과 독립적으로 동작하는 외부 서비스를 의미합니다.
이는 데이터베이스, SMTP 이메일 서버, 파일 저장소(AWS S3), 메시지 큐(Kafka, RabbitMQ) 등이 포함됩니다.

📌 Backing Services의 예시

  • 데이터 저장소: MySQL, PostgreSQL, AWS RDS, MongoDB, Redis
  • 파일 저장소: AWS S3, Google Cloud Storage, Azure Blob Storage
  • 이메일 서비스: SMTP, AWS SES, Twilio SendGrid
  • 메시지 브로커: Apache Kafka, RabbitMQ, Amazon SQS
  • API 서비스: Stripe(결제 API), Auth0(인증 API), Twilio(문자 메시지 API)

🔹 2. Backing Services와 마이크로서비스의 관계

마이크로서비스는 Backing Services를 네트워크를 통해 호출하며,
이들은 애플리케이션 코드에서 독립적이어야 합니다.

📌 아래 다이어그램은 Backing Services가 마이크로서비스와 어떻게 연결되는지 보여줍니다.

출처 : Spring Microservices in Action 2nd Edition

 

로컬 데이터베이스(Local DB) → AWS RDS로 변경 가능 (코드 수정 없이)
SMTP 이메일 서비스 연결
AWS S3를 활용한 파일 저장소 연동

📌 핵심 원칙

  • 애플리케이션은 하드코딩된 데이터베이스 연결을 가지면 안 됨.
  • 서비스 간 연결은 환경 변수 또는 구성 서버(Spring Cloud Config 등)를 활용해야 함.
  • 클라우드 기반 서비스(AWS RDS, S3)로 쉽게 전환할 수 있어야 함.

🔹 3. Backing Services를 활용한 환경 설정 예제

✅ (1) 환경 변수로 데이터베이스 연결 관리

코드에서 특정 데이터베이스를 하드코딩하지 않고, 환경 변수를 통해 관리해야 합니다.

# 개발 환경 (로컬 MySQL 사용)
export DATABASE_URL="jdbc:mysql://localhost:3306/dev-db"
export DATABASE_USER="dev_user"
export DATABASE_PASSWORD="dev_pass"

# 운영 환경 (AWS RDS 사용)
export DATABASE_URL="jdbc:mysql://aws-rds-instance:3306/prod-db"
export DATABASE_USER="prod_user"
export DATABASE_PASSWORD="prod_pass"

📌 이렇게 하면 개발 환경에서는 로컬 DB를 사용하고, 운영 환경에서는 AWS RDS를 사용하도록 설정할 수 있습니다.
애플리케이션 코드 수정 없이 환경만 변경하면 적용 가능!

✅ (2) Spring Boot에서 환경별 데이터베이스 설정

Spring Boot에서는 application.yml 파일을 활용하여 환경별 데이터베이스를 설정할 수 있습니다.

# 공통 설정
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver

---
# 개발 환경 (application-dev.yml)
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/dev-db
    username: dev_user
    password: dev_pass

---
# 운영 환경 (application-prod.yml)
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://aws-rds-instance:3306/prod-db
    username: prod_user
    password: prod_pass

📌 Spring Profile을 사용하여 개발/운영 환경을 쉽게 전환 가능!

# 개발 환경 실행
SPRING_PROFILES_ACTIVE=dev java -jar myservice.jar

# 운영 환경 실행
SPRING_PROFILES_ACTIVE=prod java -jar myservice.jar

✅ (3) AWS S3 연동 예제 (Spring Boot)

파일 업로드를 로컬이 아닌 AWS S3에 저장하도록 구성할 수도 있습니다.

1️⃣ AWS S3 설정 (환경 변수로 관리)

export AWS_ACCESS_KEY="your-access-key"
export AWS_SECRET_KEY="your-secret-key"
export AWS_BUCKET_NAME="your-bucket-name"

2️⃣ Spring Boot에서 AWS S3 사용

@Configuration
public class S3Config {
    @Value("${AWS_ACCESS_KEY}")
    private String accessKey;

    @Value("${AWS_SECRET_KEY}")
    private String secretKey;

    @Value("${AWS_BUCKET_NAME}")
    private String bucketName;

    @Bean
    public AmazonS3 s3Client() {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonS3ClientBuilder.standard()
                .withRegion(Regions.US_EAST_1)
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .build();
    }
}

📌 이제 파일을 업로드할 때 로컬이 아니라 AWS S3에 저장됩니다!

🔹 4. Backing Services 활용 시의 장점

서비스 독립성 유지 → 데이터베이스, API, 메시지 큐 등을 코드와 분리
운영 환경 전환이 용이 → AWS RDS, S3 등의 클라우드 서비스로 쉽게 이동 가능
보안 강화 → 설정 정보를 코드에서 제거하고 환경 변수 또는 설정 서버(Spring Cloud Config)에서 관리
확장성 확보 → 로컬 서비스에서 클라우드 서비스로 쉽게 전환하여 확장 가능

📌 결론: Backing Services 활용 원칙

1️⃣ 애플리케이션은 특정 데이터베이스, 파일 저장소, API 등에 하드코딩되지 않아야 함
2️⃣ 환경 변수 또는 설정 서버(Spring Cloud Config)를 활용하여 서비스 간 연결 관리
3️⃣ 운영 환경(AWS RDS, AWS S3)으로 쉽게 전환할 수 있도록 설계
4️⃣ 마이크로서비스 간 결합도를 낮춰 독립적으로 확장 가능하도록 설계

 

🔹 이를 통해 확장 가능하고 유지보수성이 뛰어난 클라우드 네이티브 마이크로서비스를 구축할 수 있습니다! 🚀

'Spring Microservice' 카테고리의 다른 글

Port binding  (0) 2025.03.02
Processes  (0) 2025.03.02
Dependencies  (0) 2025.03.02
Codebase  (0) 2025.03.02
Config  (0) 2025.03.02