MSA에 대해 학습하고자 공부하던 중 Spring Cloud Config Server를 사용하면 서 발생했던 문제에 대해 기록하고자 한다.
먼저 Spring Cloud Config에 대해서 알아보자.
Spring Cloud Config
MSA는 각각의 마이크로 서비스로 애플리케이션을 만들어야 한다.
그리고 각 애플리케이션을 개발하면서 사용하는 `application.properties`, `application.yml`설정 파일이 있을 것이다.
각 서비스에 설정 파일을 각각 만들다 보면 추후에 수정사항이 생기거나 했을 때, 일일이 각 서비스로 찾아가 수정해야 하는 번거로움이 발생한다.
그래서 결론은 이 MSA에서 편리하게 설정을 중앙 관리할 수 있는 것이 Spring Cloud Config이다.
Spring Cloud Config에는 ` Spring Cloud Config Server`와 ` Spring Cloud Config Client`가 있다.
둘에 대한 개념은 아래와 같다.
Spring Cloud Config Server : 설정 파일 외부 저장소로부터 설정 값을 읽어오는 설정 서버
Spring Cloud Config Client : 설정 서버에서 설정 값을 사용하는 분산 시스템의 각 어플리케이션
즉, Server는 설정 파일을 만들어주고, Client에서는 서버에 설정 값을 가져와 사용하는 것이다.
Spring Cloud Config 동작 방식
Spring Cloud Config Server에서 외부(Git, Database, File System)나 내부에서 설정을 하면 그 설정을 REST API 방식(`http://localhost:8888/customer-service/default`)으로 Client에 보내준다.
Client는 Server에서 보내준 설정 정보 JSON을 받아서 사용한다.
문제 발생
설정 파일을 config-server 모듈에서 customer-service.yml 파일을 만들어 아래와 같이 작성하였다.
spring:
data:
mongodb:
username: ${MONGO_INITDB_ROOT_USERNAME}
password: ${MONGO_INITDB_ROOT_PASSWORD}
host: localhost
port: 27017
database: customer
authentication-database: admin
server:
port: 8090
Customer Serivce에서 MongoDB를 사용하기 위해서 설정 정보를 입력해줘야 하는데 username이나 password는 민감한 정보이기 때문에 환경변수를 설정했다.
[Request processing failed: org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='${MONGO_INITDB_ROOT_USERNAME}', source='admin', password=<hidden>, mechanismProperties=<hidden>}] with root cause
customer-service를 실행했는데 위와 같은 에러가 발생했다.
username이 환경변수 플레이스홀더 그대로 나오는 것을 확인했다.
그래서 방법을 찾던 중에 위의 동작 방식을 알게 되었고 문자열로 보내주는 것을 확인했다.
{
"name": "customer-service",
"profiles": [
"default"
],
"label": null,
"version": null,
"state": null,
"propertySources": [
{
"name": "classpath:/configurations/customer-service.yml",
"source": {
"spring.data.mongodb.username": "${MONGO_INITDB_ROOT_USERNAME}",
"spring.data.mongodb.password": "${MONGO_INITDB_ROOT_PASSWORD}",
"spring.data.mongodb.host": "localhost",
"spring.data.mongodb.port": 27017,
"spring.data.mongodb.database": "customer",
"spring.data.mongodb.authentication-database": "admin",
"server.port": 8090
}
}
]
}
그래서 이 설정 정보는 customer-service에서 사용하는 것이기 때문에 환경변수 설정을 customer-service에서 했다.
그러니 정상 작동하는 것을 볼 수 있었다.
즉, config-server에서 작성된 환경변수라고 하더라도 그 환경 설정을 사용하는 애플리케이션 서비스에서 환경변수를 설정하는 것이 맞다.
'Project > E-commerce(MSA)' 카테고리의 다른 글
| 서비스 디스커버리 Spring Cloud Netflix Eureka (0) | 2025.06.01 |
|---|---|
| 도커 컴포즈를 통해 Infra 설정하기 (feat. mongo express 환경변수 에러) (0) | 2025.05.31 |
| 유용한 DB 마이그레이션 도구, Flyway (0) | 2025.05.25 |