Project/E-commerce(MSA)

Spring Cloud Config 환경변수

hu6r1s 2025. 5. 6. 18:28

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에서 작성된 환경변수라고 하더라도 그 환경 설정을 사용하는 애플리케이션 서비스에서 환경변수를 설정하는 것이 맞다.