본문 바로가기
프로그래밍/C#

C# 환경변수로 appsettings.json 값 덮어쓰기

by bantomak 2025. 4. 12.
반응형

중첩된 키(nested keys)란?

중첩된 키란 appsettings.json 같은 설정 파일에서 하위 계층 구조를 갖는 설정 값들을 의미한다. 즉, JSON의 객체 안에 또 다른 객체가 있는 경우를 말한다. 예시를 살펴보자. 다음과 같은 appsettings.json이 있다고 해보자.

{
  "AppSettings": {
    "Api": {
      "BaseUrl": "https://api.example.com",
      "ApiKey": "secret-key"
    }
  }
}
  • 이 구조는 계층적으로 중첩(nested) 되어 있음
  • AppSettings  최상위 키
  • AppSettings:Api 중첩된 객체
  • AppSettings:Api:BaseUrl 최종 키

실제 사용 예제

using Microsoft.Extensions.Configuration;
using System;
using System.IO;

public partial class Program
{
    static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .Build();

        var siteUrl = config["AppSettings:Api:BaseUrl"];
        Console.WriteLine(siteUrl);
    }
}

비주얼 스튜디오에서 환경변수 입력하기

프로젝트 클릭 후 마우스 오른쪽 버튼 클릭 > 속성 > 디버그 메뉴 > 디버그 시작 프로필 UI 열기 > 환경 변수로 접근

해당 UI에서 입력하면 된다.

.NET은 구분자 :__(밑줄 2개)로 치환하는 규칙을 제공한다.

AppSettings:Api:BaseUrl  <=> AppSettings__Api__BaseUrl

Logging:LogLevel:Default  <=> Logging__LogLevel__Default

환경변수 값 가져오기

해당 값은 IConfiguration 인터페이스 객체를 주입받은 configuration 객체를 통해서 접근이 가능하다.

해당 방식은 configuration 객체를 인덱서 방식으로 접근해서 설정값을 가져오는 예제이다.

string url = configuration["AppSettings:Api:BaseUrl"]; // 덮어쓰기 된 값 https://env-api.example.com
string key = configuration["AppSettings:Api:ApiKey"];  // 원래 값

추가적으로 해당 설정값을 애플리케이션 시작 시에 환경 변수를 설정해서 덮어쓰기 하는 게 가능하다.

이때 중첩된 키를 환경 변수로 덮어쓰기 하는 방법에 대해서 알아보자.

  • appsettings.json
  • appsettings.{Environment}.json
  • UserSecrets
  • 환경 변수
  • 커맨드라인 인자
new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{Environment}.json", optional: true)
    .AddUserSecrets()       // 개발 환경일 경우
    .AddEnvironmentVariables()
    .AddCommandLine(args);

해당 순서대로 값이 설정되기 때문에 설정값 추가 및 사용 시 주의를 기울여야 한다.

최종 예제 코드

using Microsoft.Extensions.Configuration;
using System;
using System.IO;

public partial class Program
{
    static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables() // 환경변수 주입
            .Build();

        var siteUrl = config["AppSettings:Api:BaseUrl"];
        Console.WriteLine(siteUrl);
    }
}

기존 appsettings.json으로 설정된 값이 아닌 환경변수로 세팅된 값으로 출력되는 것을 확인할 수 있다.

.NET Core WebAPI 환경에서는 다르다!

콘솔에서는 AddJsonFile로 appsettings.json을 설정해서 해당 객체로 설정에 접근해야 했지만, .NET Core환경에서는 이를 편리하게 자동으로 지원해 준다.

var builder = WebApplication.CreateBuilder(args);
  • 환경변수
  • appsettings.json
  • appsettings.{환경}.json
  • 명령줄 인자(args) 등을 읽어서 IConfiguration 객체를 자동으로 생성
[ApiController]
[Route("[controller]")]
public class ConfigTestController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public ConfigTestController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet]
    public string Get()
    {
        return _configuration["MyAppSettings:WelcomeMessage"];
    }
}

컨트롤러에서는 DI로 주입받아서 사용하기만 하면 된다.

댓글