2025. 3. 2. 13:41ㆍSpring 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가 마이크로서비스와 어떻게 연결되는지 보여줍니다.
✅ 로컬 데이터베이스(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 |