C#

C# 기초부터 고급까지 Chapter 2.6. Configuration 관리 – appsettings.json 구조와 환경별 분리 (feat. POCO 완전 이해 포함)

Juan_ 2025. 5. 1. 09:51
728x90

📘 Chapter 2.6: Configuration 관리 – appsettings.json 구조와 환경별 분리 (feat. POCO 완전 이해 포함)


✅ 이번에 진짜 확실히 정리할 내용

  • appsettings.json은 왜 필요한가?
  • 설정을 꺼내 쓰는 3가지 방법
  • POCO 클래스란?
  • 환경별 설정 분리 정확한 구조
  • user-secrets 비밀 정보 안전하게 숨기기
  • 실무 구성 Best Practice

1️⃣ appsettings.json은 왜 필요하노?


✅ 설정을 코드에 직접 때려박으면 어떻게 되노?

var apiKey = "my-super-secret-api-key";

👎 이거 배포하면 끝났다.

  • 운영용 키 노출
  • 수정할 때마다 재컴파일
  • 코드가 더러워짐
  • 환경에 따라 분기 처리 지옥

✅ 그래서 나온 게 appsettings.json

{
  "MySetting": {
    "ApiKey": "12345",
    "Timeout": 10
  }
}

✔️ 이러면:

  • 설정만 따로 분리 가능
  • 환경별로 값 바꾸기 편함
  • 보안, 유지보수 최고

2️⃣ 설정 값을 읽는 방법 (3가지)


✅ ① 문자열로 바로 읽기

var apiKey = config["MySetting:ApiKey"];
  • 빠르고 간단
  • "MySetting:ApiKey" 이렇게 콜론으로 경로 접근

✅ ② GetSection()으로 읽기

var section = config.GetSection("MySetting");
var timeout = section["Timeout"];
  • 하위 노드에 접근할 때 유용

✅ ③ POCO 클래스에 바인딩 ← 실무 핵심


✋ 그런데! POCO 클래스란 뭐냐?


✅ POCO = "Plain Old CLR Object"

말 그대로 아무것도 안 붙은 순수한 C# 클래스

  • 상속 X
  • 어트리뷰트 X
  • 인터페이스 X

👀 그냥 데이터 담는 깡통 같은 객체

🔧 예: POCO 클래스 예시

public class MySettingOptions
{
    public string ApiKey { get; set; }
    public int Timeout { get; set; }
}
  • 이게 바로 POCO 클래스다!
  • 설정 파일 구조랑 이름을 맞추면 자동으로 매핑된다!

3️⃣ POCO 바인딩 실전 흐름


✅ 1. appsettings.json

{
  "MySetting": {
    "ApiKey": "abc123",
    "Timeout": 15
  }
}

✅ 2. C# 클래스

public class MySettingOptions
{
    public string ApiKey { get; set; }
    public int Timeout { get; set; }
}

✅ 3. Program.cs에서 등록

builder.Services.Configure<MySettingOptions>(
    builder.Configuration.GetSection("MySetting"));

✅ 4. DI로 받아서 사용

public class MyService
{
    private readonly MySettingOptions _options;

    public MyService(IOptions<MySettingOptions> options)
    {
        _options = options.Value;
    }

    public void Run()
    {
        Console.WriteLine($"API Key: {_options.ApiKey}");
        Console.WriteLine($"Timeout: {_options.Timeout}");
    }
}

📌 이렇게 하면 실무에서 설정 쓰는 게 너무 쉬워진다!!


4️⃣ 환경별 설정 분리 구조


📁 기본 구조:

appsettings.json
appsettings.Development.json
appsettings.Production.json

.NET은 실행할 때 환경에 맞는 설정 파일을 자동으로 병합해준다.

💡 병합 순서 (우선순위)

1. appsettings.json
2. appsettings.{ENVIRONMENT}.json
3. 환경 변수 (Environment Variable)
4. Secret Manager

📌 예시:

// appsettings.json
"MySetting": {
  "ApiKey": "기본키",
  "Timeout": 30
}

// appsettings.Development.json
"MySetting": {
  "ApiKey": "개발자용-키"
}

✅ 실행환경이 Development면?

"ApiKey"는 "개발자용-키"가 우선 적용된다!


5️⃣ 실행 환경 바꾸는 방법


✅ 로컬 실행용 (launchSettings.json)

"environmentVariables": {
  "ASPNETCORE_ENVIRONMENT": "Development"
}

✅ 운영 서버에선?

ASPNETCORE_ENVIRONMENT=Production

6️⃣ 민감 정보는 어디 숨기는데?


절대 appsettings.json에 민감값 넣지 마라!

(소스코드에 커밋되면 진짜 끝장난다)

✅ 개발 환경은 dotnet user-secrets 쓰자!

dotnet user-secrets init
dotnet user-secrets set "MySetting:ApiKey" "비밀키"

✅ 코드는 그대로 config["MySetting:ApiKey"] 로 읽으면 된다.

✅ 소스에 안 들어간다. 깃허브 올려도 안전!


✅ 최종 실무 Best Practice


항목 실전 팁
설정 읽기 POCO + IOptions<T> 방식이 가장 깔끔
환경 분리 .Development.json, .Production.json 나눠라
보안 user-secrets (개발), 환경변수 or KeyVault (운영)
구성파일 정리 설정이 많아지면 섹션별로 분리 ("JwtSetting", "Database" 등)

🎯 결론 요약 문장

"appsettings.json은 환경별로 설정 나눠서, POCO 클래스에 바인딩해서 쓰면 실무가 깔끔하게 정리된다!"


📢 다음 챕터 예고 🎓

다음 챕터 주제
Chapter 2.7 예외처리 전략 – Retry, Fallback, Polly 패턴
728x90