설정 계층화와 기본값
기본값, 파일, 환경 재정의를 병합합니다.
설정 계층화와 기본값은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
계층으로 구성하기
실제 앱은 기본 제공 defaults, config 파일, 환경 재정의와 같은 여러 원본에서 구성을 조합합니다. 나중 계층이 정해진 우선순위에 따라 이전 계층을 재정의합니다.
우선순위 순서
일반적인 순서는 우선순위가 낮은 것부터 높은 것까지 다음과 같습니다. defaults < 파일 config < 환경 변수입니다. 환경 재정의가 배포별 조정에 적합하므로 가장 높은 우선순위를 가집니다.
계층 정의하기
각 계층은 부분적인 config입니다. 기본 defaults만 완전하면 되고, 나머지 계층은 일부 필드를 채우거나 재정의합니다.
interface Config { port: number; host: string; logLevel: string; }
const defaults: Config = { port: 3000, host: "localhost", logLevel: "info" };부분 재정의
파일 계층과 env 계층은 Partial<Config> 타입입니다. 일부 키만 지정할 수 있기 때문입니다. 이를 부분 타입으로 지정하면 어떤 필드든 없을 수 있다는 사실이 반영됩니다.
const fileConfig: Partial<Config> = { port: 8080 };
const envConfig: Partial<Config> = { logLevel: "debug" };얕은 병합
평면적인 config에서는 전개 병합으로 우선순위를 깔끔하게 적용할 수 있습니다. 나중 객체가 이전 키를 재정의하여 최종 config를 만듭니다.
const config: Config = { ...defaults, ...fileConfig, ...envConfig };
// { port: 8080, host: "localhost", logLevel: "debug" }순서가 중요한 이유
전개 병합은 나중에 나온 값이 우선하므로 마지막에 나열된 원본의 우선순위가 가장 높습니다. 전개의 순서를 바꾸면 어느 계층이 어느 계층을 재정의하는지도 바뀝니다.
중첩된 Config에는 깊은 병합이 필요합니다
얕은 전개는 중첩된 객체 전체를 교체합니다. config에 중첩된 구역이 있다면 덮어쓰는 대신 재귀적으로 결합하는 깊은 병합이 필요합니다.
interface Config { db: { host: string; port: number }; }
// { ...a, ...b } would replace the entire db object, losing keys.타입이 지정된 깊은 병합
재귀적 병합은 두 객체를 순회하면서 중첩된 레코드 안으로 들어가 최하위 값을 재정의합니다. 결과에 타입을 지정하려면 재귀적인 타입 도우미가 필요합니다.
type DeepPartial<T> = { [K in keyof T]?: DeepPartial<T[K]> };
function deepMerge<T>(base: T, over: DeepPartial<T>): T {
const out: any = { ...base };
for (const k in over) {
const v = (over as any)[k];
out[k] = v && typeof v === "object" ? deepMerge((base as any)[k], v) : v;
}
return out;
}재정의 계층을 위한 DeepPartial
재정의 계층은 DeepPartial<Config> 타입으로 지정합니다. 이렇게 하면 전체 구조에 대한 타입 검사를 유지하면서 중첩된 키의 일부 또는 전체를 지정할 수 있습니다.
const override: DeepPartial<Config> = { db: { port: 5433 } };
// merges into db without dropping db.host검증과 함께 사용하기
먼저 병합한 다음 스키마로 결과를 검증합니다. 이렇게 하면 최종적으로 완전히 해석된 config 자체의 올바른 형식이 검사됩니다.
// const merged = deepMerge(defaults, override);
// const config = ConfigSchema.parse(merged);계층화 모범 사례
defaults는 완전하고 안전하게 유지하고, 파일에서는 환경별 설정을 표현하며, 우선순위 체인의 가장 높은 위치에서는 비밀 정보와 배포별 재정의를 위해 환경 변수를 사용합니다.
빠른 확인
이 레슨을 간단히 확인해 봅니다.
복습
계층화된 config는 defaults, 파일 config, env 재정의를 우선순위 순서(defaults < file < env)로 병합합니다. 평면적인 config에는 전개를 사용하고, 중첩된 config에는 DeepPartial<Config>로 타입을 지정한 깊은 병합이 필요합니다. 병합된 결과를 검증합니다.
자주 묻는 질문
“설정 계층화와 기본값” 강의는 무료인가요?
네 — “설정 계층화와 기본값” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“설정 계층화와 기본값”에서 뭘 배우나요?
기본값, 파일, 환경 재정의를 병합합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“설정 계층화와 기본값” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 환경 변수에 타입 지정하기
- 스키마로 검증하는 설정
- 설정 계층화와 기본값
- 비밀 정보와 타입 안전성