docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
---
|
||||
id: wiki-2026-0508-code-formatting
|
||||
title: Code Formatting
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-E4F919]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - Code Formatting"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[Code Formatting]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> 코드 포맷팅(Code Formatting)은 들여쓰기, 공백, 줄 바꿈, 따옴표 등 소스 코드의 시각적 스타일과 레이아웃을 일관된 규칙에 맞게 정리하는 과정입니다. 이는 코드의 런타임 논리나 실행 의미를 변경하지 않고 코드의 구조적 형태만 변환하며, 일반적으로 Prettier나 Black과 같은 자동화 도구(Formatter)를 통해 수행됩니다. 일관된 코드 포맷팅은 가독성을 향상시키고 협업 시 개발자 간의 미적 선호도 차이로 인한 마찰과 인지적 부하를 줄여주는 핵심적인 역할을 합니다.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **코드 포맷팅의 목적 및 이점:**
|
||||
일관되고 명확한 포맷팅 규칙은 코드를 명확하게 이해하고 논리적 흐름을 빠르게 파악할 수 있도록 도와 인지적 오버헤드(cognitive overhead)를 줄여줍니다 [1]. 개발자들은 코드 작성 시 스타일에 대한 고민을 덜고 핵심 비즈니스 로직과 아키텍처에 집중할 수 있으며, 일관된 코드는 동료들의 코드 리뷰 과정을 더욱 원활하게 만들어 생산성을 극대화합니다 [2-4].
|
||||
|
||||
* **자동화 도구 (Formatter)의 활용:**
|
||||
개발 생태계에서는 Prettier(JavaScript/TypeScript 등)와 Black(Python) 같은 독단적(opinionated)인 코드 포맷터가 널리 쓰입니다. 이 도구들은 작성자가 코드를 어떻게 입력했는지와 무관하게 코드를 파싱한 후, 줄 길이(line width), 들여쓰기(indentation) 등 자체적인 규칙에 따라 코드를 완전히 새로 작성(reprint)하여 시각적 통일성을 강제합니다 [5-8].
|
||||
|
||||
* **Linter와의 차이점 및 연동 시 주의사항:**
|
||||
Linter(예: ESLint)는 코드의 문법적 오류나 잠재적 버그를 식별하는 '정적 분석 및 품질 관리' 도구인 반면, Formatter(예: Prettier)는 '스타일 교정'에 특화되어 있습니다 [2, 7, 9]. Linter 자체에도 일부 코드 포맷팅 기능이 포함되어 있기 때문에 이 둘을 함께 사용할 경우 규칙이 충돌하여 무한 경고 루프를 유발할 수 있습니다. 따라서 `eslint-config-prettier` 등을 통해 Linter의 포맷팅 규칙을 비활성화하고, 포맷팅 역할은 전적으로 Formatter에 위임하는 방식이 표준으로 자리 잡고 있습니다 [10-12].
|
||||
|
||||
* **코드 스타일로메트리(Code Stylometry)에 미치는 영향:**
|
||||
코드 포맷팅은 컴파일러가 코드를 이해하는 추상 구문 트리(AST)를 변경하지 않지만, 소스 코드의 표면적 특성을 담는 구체 구문 트리(CST)를 크게 변경합니다 [13]. 이 과정에서 코드 작성자 고유의 띄어쓰기나 들여쓰기 등 스타일적 지문(stylistic fingerprints)이 지워지게 됩니다. 그 결과, 소스 코드를 통해 작성자를 추적하는 코드 스타일로메트리 분석의 정확도가 눈에 띄게 하락(약 68%에서 53%로 감소)하며, 이는 억압적인 환경에 있는 오픈소스 기여자들에게 일종의 프라이버시 보호막(Privacy Shield) 역할을 제공할 수 있습니다 [14-17].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[Linter]], [[Prettier]], [[Code Stylometry]]
|
||||
- **Projects/Contexts:** , [[CI_CD_Pipeline|CI/CD Pipeline]]
|
||||
- **Contradictions/Notes:** ESLint와 같은 Linter 도구 내에도 자체적인 포맷팅 규칙이 존재하여 Prettier와 동시 사용 시 규칙 충돌(Infinite feedback loop)이 일어날 수 있습니다. 따라서 Linter의 포맷팅 기능을 끄고 이를 Prettier에 전담시키는 구성 최적화가 필수적입니다 [12, 18].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-19*
|
||||
- Raw Source: [[00_Raw/2026-04-20/Code Formatting.md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,93 @@
|
||||
---
|
||||
id: wiki-2026-0508-typescript-라이브러리-타입-확장
|
||||
title: TypeScript 라이브러리 타입 확장
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-BF50D4]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - TypeScript 라이브러리 타입 확장"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[TypeScript 라이브러리 타입 확장]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> 지식 요약 정보 추출 중...
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **선언 병합(Declaration Merging)을 통한 확장**: TypeScript에서 동일한 이름의 인터페이스를 여러 번 선언하면, 컴파일러가 이를 자동으로 하나의 인터페이스로 합칩니다 [1, 2]. 이 기능은 라이브러리 코드를 작성할 때 사용자가 필요에 따라 선언부를 유연하게 확장(extend)할 수 있도록 허용하는 핵심 메커니즘입니다 [2, 3]. 반면, 타입 별칭(Type Alias)은 동일한 이름으로 재선언할 수 없으므로 이러한 방식의 확장이 불가능합니다 [2, 4].
|
||||
- **성능을 고려한 인터페이스 확장(extends) 전략**: 타입을 확장할 때 교집합(Intersection, `&`)을 사용하는 것보다 `interface extends`를 사용하는 것이 권장됩니다 [5, 6]. TypeScript 컴파일러는 인터페이스를 처리할 때 이름 기준으로 타입 관계를 캐싱하여 활용하지만, 교집합 연산은 사용될 때마다 속성을 재귀적으로 병합하고 계산해야 하므로 대규모 프로젝트나 라이브러리 사용 시 컴파일 성능을 저하시킬 수 있습니다 [5, 7, 8].
|
||||
- **외부 라이브러리 타입 선언 파일(.d.ts)**: 기존 JavaScript 라이브러리를 TypeScript에서 사용할 때는 구현부 없이 타입 정보만을 제공하는 선언 파일(`.d.ts`)이 필요합니다 [9]. 많은 인기 라이브러리들이 자체 타입을 제공하지만, 타입이 존재하지 않는 경우 사용자가 직접 모듈을 선언하여 타입 확장을 하거나 에러를 억제할 수 있습니다 [9].
|
||||
- **내부 코드와 외부 라이브러리 코드 간의 이원화 설계**: 개발 커뮤니티에서는 "내부는 Types, 외부는 Interfaces를 사용하라"는 전략이 제안되기도 합니다 [6]. 애플리케이션 내부 핵심 도메인 로직에서는 의도치 않은 선언 병합으로 인한 버그나 충돌을 막기 위해 타입 별칭(Type)을 사용하여 엄격하게 관리하는 것이 좋습니다 [2, 10]. 반대로 외부 라이브러리로 제공되거나 외부와의 소통이 잦은 계약 지점의 코드에서는 소비자의 유연한 확장을 위해 인터페이스(Interface)를 사용하는 것이 바람직합니다 [2, 3].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[선언 병합(Declaration Merging)]], [[Type_Alias|Type Alias]], [[교집합 타입(Intersection Type)]]
|
||||
- **Projects/Contexts:** [[외부 라이브러리 API 설계]], [[TypeScript 컴파일러 캐싱 최적화]], [[선언 파일(dts)]]
|
||||
- **Contradictions/Notes:** 애플리케이션 내부 코드의 경우, 인터페이스의 확장성을 '의도치 않은 속성 병합(Bad Thing)'으로 간주하여 타입 별칭(Type Alias)의 사용을 선호하는 실무적 의견이 다수 존재합니다 [4, 10-12]. 하지만 외부 패키지나 라이브러리 생태계에서는 여전히 사용자에게 타입 확장을 허용하기 위해 인터페이스를 채택하는 것이 정석으로 평가받고 있습니다 [2, 3]. 또한, 객체를 확장할 때 교집합(`&`) 방식은 유연해 보이지만, 성능 이슈와 충돌 검사 한계로 인해 `interface extends` 방식에 비해 상대적으로 지양됩니다 [5, 7, 13].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/TypeScript 라이브러리 타입 확장.md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,100 @@
|
||||
---
|
||||
id: wiki-2026-0508-typescript-인터페이스-및-시스템-보호-아키텍처-설
|
||||
title: TypeScript 인터페이스 및 시스템 보호 아키텍처 설계
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-6ECC4D]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - TypeScript 인터페이스 및 시스템 보호 아키텍처 설계"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[TypeScript 인터페이스 및 시스템 보호 아키텍처 설계]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> TypeScript의 타입 시스템은 구조적 타이핑을 기반으로 하여 복잡한 비즈니스 로직을 보호하고 개발자의 의도를 명확히 규정하는 아키텍처적 도구이다 [1]. 인터페이스(Interface)와 타입 별칭(Type Alias)을 전략적으로 선택하여 컴파일 성능과 확장성을 최적화하며, `readonly` 수식어와 `satisfies` 연산자 등을 통해 예기치 않은 데이터 오염과 상태 변경을 원천적으로 차단한다 [2-4]. 이러한 견고한 인터페이스 설계는 시스템의 결합도를 낮추고 예측 가능성을 극대화하여 대규모 애플리케이션에서 철벽과 같은 수비 체계를 구축한다 [5, 6].
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **인터페이스(Interface)와 타입 별칭(Type Alias)의 전략적 분리**
|
||||
TypeScript 컴파일러는 인터페이스를 처리할 때 이름을 기준으로 타입 관계를 캐싱하여 대규모 프로젝트에서 컴파일 성능을 최적화한다 [2]. 반면, 타입 별칭을 이용한 교집합 타입(`&`)은 매번 구조를 평탄화하고 충돌을 확인해야 하므로 성능 저하를 유발할 수 있다 [2]. 따라서 외부와의 소통이 잦은 계약 지점이나 확장 지점 제공에는 선언 병합(Declaration Merging)이 가능한 인터페이스를, 핵심 비즈니스 로직의 엄격한 관리에는 예기치 않은 병합을 막는 타입 별칭을 사용하는 이원화 전략이 필요하다 [7].
|
||||
|
||||
- **불변성(Immutability) 확립과 데이터 오염 방지**
|
||||
`readonly` 수식어는 객체와 배열의 수정을 컴파일 수준에서 금지하여 데이터 무결성을 보장하며, 런타임 성능 오버헤드가 발생하는 `Object.freeze()`보다 효율적이다 [3]. 깊은 수준의 중첩된 객체까지 예기치 않은 변경으로부터 방어하려면, 매핑 타입과 조건부 타입을 결합한 재귀적 불변성(`DeepReadonly<T>`)을 구축하는 것이 복잡한 상태 관리 아키텍처에서 필수적이다 [8].
|
||||
|
||||
- **과잉 속성 체크(EPC)의 한계와 `satisfies` 연산자를 통한 경계면 수비**
|
||||
객체 리터럴을 직접 할당할 때 발생하는 과잉 속성 체크(Excess Property Checking)는 선언되지 않은 속성의 유입을 차단하는 첫 번째 방어선이다 [9, 10]. 하지만 간접 할당(변수 선언 후 할당) 과정을 거치면 이 기제가 우회되는 취약점이 있다 [10]. 이를 극복하기 위해 `satisfies` 연산자를 활용하면, 대상 인터페이스의 요구사항을 충족하는지 검사하면서도 리터럴 타입 등 속성의 구체적인 값을 잃지 않아 더욱 정밀한 수비가 가능해진다 [4].
|
||||
|
||||
- **아키텍처적 관점에서의 인터페이스 설계 (SOLID 원칙)**
|
||||
하나의 인터페이스가 너무 많은 책임을 지는 것을 피하고 최소 단위로 쪼개어 결합도를 낮추는 인터페이스 분리 원칙(ISP)을 지향해야 한다 [5]. 복잡한 내부 시스템을 단순한 인터페이스로 감싸는 퍼사드(Facade) 패턴을 활용하면 개발자의 인지 부하를 줄일 수 있다 [5]. 더 나아가, 단순히 데이터의 유효성을 체크하는 것을 넘어 더 구체적이고 신뢰할 수 있는 타입의 객체로 변환하는 "검증하지 말고 파싱하라"는 수비적 프로그래밍 철학을 실천해야 한다 [5].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[구조적 타이핑(Structural Typing)]], [[과잉 속성 체크 (Excess Property Checking)]], [[재귀적 불변성 (DeepReadonly)]], [[브랜디드 타입 (Branded Types)]], [[SOLID 원칙]]
|
||||
- **Projects/Contexts:** [[Toss Front SDK의 Facade 패턴 적용 사례]]
|
||||
- **Contradictions/Notes:** TypeScript의 구조적 타이핑은 최소 요건만 충족하면 호환성을 허용하므로 매우 유연하지만, 이메일 주소와 이름이 같은 `string`으로 취급되는 등 "기본 타입에의 집착(Primitive Obsession)" 문제를 야기한다 [11]. 이를 방어하기 위해 컴파일 시점에만 존재하는 고유 속성을 부여하는 브랜디드 타입(Branded Types)을 사용하여 데이터의 무분별한 혼용을 차단해야 한다 [10, 11].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/TypeScript 인터페이스 및 시스템 보호 아키텍처 설계.md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,90 @@
|
||||
---
|
||||
id: wiki-2026-0508-typescript-컴파일러-캐싱-최적화
|
||||
title: TypeScript 컴파일러 캐싱 최적화
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-3D0990]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - TypeScript 컴파일러 캐싱 최적화"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[TypeScript 컴파일러 캐싱 최적화]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> TypeScript 컴파일러는 타입 검사 속도와 IDE 응답성을 향상시키기 위해 타입 관계를 캐싱하는 최적화 메커니즘을 사용합니다. 이 캐싱 메커니즘은 객체를 확장할 때 주로 `interface extends`를 사용할 경우 해당 이름을 기준으로 효과적으로 작동하며, 타입 검사 성능을 향상시키는 핵심적인 역할을 합니다 [1-3].
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **인터페이스 확장(Interface Extends)의 캐싱 이점**: TypeScript 컴파일러는 `interface extends`를 통해 객체를 확장할 때 해당 인터페이스의 이름을 기준으로 타입 관계를 캐싱합니다 [1-3]. 한 번 캐시가 만들어지면 해당 이름이 사용되는 모든 곳에서 캐시를 참조하게 되므로 타입 검사가 효율적으로 이루어집니다 [1, 2].
|
||||
- **교집합(Intersection Types)의 연산 오버헤드**: `type` 선언 시 앰퍼샌드(`&`) 기호를 사용하는 교집합은 인터페이스와 달리 전체 교집합 타입 자체가 캐싱되지 않습니다 [3]. 교집합은 속성을 재귀적으로 병합해야 하고 처리가 복잡하여, 코드가 사용될 때마다 거의 매번 구조를 새롭게 계산해야 합니다 [1-3]. 특히 검사 대상이 되는 교집합 타입에 대해 "유효하거나 평탄화된(flattened)" 타입을 확인하기 전에 모든 구성 요소를 일일이 확인해야 하는 오버헤드가 발생합니다 [3].
|
||||
- **성능 가이드라인의 권장 사항**: TypeScript 성능 가이드(Performance Guide)에서는 위와 같은 컴파일러의 캐싱 동작 방식 때문에, 가능하면 교집합보다는 `interface extends`를 사용할 것을 권장합니다 [1-3]. 이를 통해 TypeScript 컴파일러가 캐싱을 보다 잘 활용할 수 있으며, 결과적으로 타입 검사(Type Checking) 및 IDE의 코드 기반 업데이트 성능이 약간 더 빨라집니다 [4, 5].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Contradictions/Notes:** 인터페이스 간의 타입 관계는 이름 기반으로 캐싱되어 성능상 이점을 제공하지만, 교집합 타입은 전체가 캐싱되지 않고 사용할 때마다 평탄화 및 재계산을 거쳐야 한다는 구조적 차이가 존재합니다 [3].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/TypeScript 컴파일러 캐싱 최적화.md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
id: wiki-20260508-typescript-compiler-api-redir
|
||||
title: TypeScript Compiler API
|
||||
category: Design & Experience
|
||||
status: merged
|
||||
redirect_to: TypeScript Compiler API
|
||||
canonical_id: TypeScript Compiler API
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [redirect]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-merge 2026-05-08)
|
||||
---
|
||||
|
||||
# TypeScript Compiler API
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 이 문서는 P-Reinforce Phase 2 자동 MERGE에 의해 **[[TypeScript Compiler API]]**로 통합되었습니다.
|
||||
|
||||
---
|
||||
*Redirected to: [[TypeScript Compiler API]]*
|
||||
@@ -0,0 +1,100 @@
|
||||
---
|
||||
id: wiki-2026-0508-계층형-아키텍처-layered-architecture
|
||||
title: 계층형 아키텍처 (Layered Architecture)
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-28439B]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - 계층형 아키텍처 (Layered Architecture)"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[계층형 아키텍처 (Layered Architecture)]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> 계층형 아키텍처(Layered Architecture), 또는 n-tier 아키텍처는 시스템을 수평적인 계층(Layer)들로 나누어 구성하는 전통적이고 영향력 있는 소프트웨어 설계 패턴입니다 [1, 2]. 각 계층은 특정한 책임을 가지며, 인접한 하위 계층하고만 소통하도록 통신을 제한하여 엄격한 관심사의 분리(Separation of Concerns)를 강제합니다 [2, 3]. 이 아키텍처의 주된 목표는 시스템을 명확히 구조화하여 개발, 테스트, 유지보수성을 단순화하고 모듈성을 향상시키는 것입니다 [2, 4].
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **3계층 구조의 역할 분리:** 가장 보편적인 애플리케이션의 계층 구조는 3가지 영역으로 나뉘어 구현됩니다 [3, 5, 6].
|
||||
- **프레젠테이션 계층 (Presentation Layer):** 사용자 인터페이스(UI)와 사용자 경험(UX) 로직을 전담하며, 데이터를 표시하고 사용자의 입력을 캡처합니다 (예: HTML, CSS, JavaScript 등) [3, 5, 7].
|
||||
- **비즈니스 로직 계층 (Business Logic/Domain Layer):** 애플리케이션의 핵심 비즈니스 규칙과 워크플로우를 처리합니다 [5, 7]. 프레젠테이션 계층의 명령을 처리하고, 데이터 액세스 계층과 상호작용을 조정합니다 [3, 5].
|
||||
- **데이터 액세스 계층 (Data Access/Persistence Layer):** 데이터베이스와 같은 외부 데이터 소스와의 통신(CRUD 작업 등)을 전담하여, 핵심 비즈니스 로직을 데이터 저장의 구체적 구현 방식으로부터 격리시킵니다 [3, 5, 7].
|
||||
|
||||
- **구현 원칙 및 모범 사례:**
|
||||
- **엄격한 계층 통신 강제:** 한 계층은 바로 아래에 위치한 인접 계층하고만 통신해야 합니다 [3, 8]. 예를 들어 프레젠테이션 계층이 데이터 액세스 계층을 직접 호출하지 못하게 차단하여 강한 결합(Tight coupling)을 예방합니다 [8].
|
||||
- **의존성 주입(DI) 활용:** 계층 간의 의존성을 직접 생성하지 않고 외부에서 주입받도록 하여 느슨한 결합(Loose coupling)과 향상된 테스트 용이성을 촉진합니다 [8, 9].
|
||||
- **명확한 인터페이스 정의:** 각 계층 사이에 잘 정의된 인터페이스를 생성하여, 상위 계층에 영향을 주지 않고 하위 계층의 구현(예: 데이터베이스 종류 변경 등)을 유연하게 교체할 수 있도록 해야 합니다 [8].
|
||||
|
||||
- **장점 및 적용 사례:**
|
||||
이 패턴은 구조가 잘 알려져 있어 구현 복잡도가 비교적 낮으며, 전통적인 엔터프라이즈 애플리케이션이나 3-Tier 시스템 구축에 이상적입니다 [9]. 각 책임을 독립적인 계층으로 격리시키기 때문에 모듈성과 재사용성이 높아지며, 특정 계층의 변화가 다른 계층에 미치는 파급 효과를 차단하여 결과적으로 각 계층별 독립적인 테스트와 유지보수가 매우 쉬워집니다 [2, 9, 10].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[관심사의 분리 (Separation of Concerns)]], [[의존성 주입 (Dependency Injection)]], [[단일 책임 원칙 (SRP)]]
|
||||
- **Contradictions/Notes:** 소스에 따르면, 계층형 아키텍처는 명확한 분리를 제공해 주지만 레이어를 무겁게 만들면 오히려 시스템 관리가 비효율적일 수 있으므로, 계층을 얇게 유지(Keep layers thin)하고 인터페이스와 의존성 주입을 적극 활용하여 경계를 명확히 보호할 것을 권장하고 있습니다 [8, 9].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/계층형 아키텍처 (Layered Architecture).md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,91 @@
|
||||
---
|
||||
id: wiki-2026-0508-비동기-데이터-패칭-async-operations-patt
|
||||
title: 비동기 데이터 패칭 (Async Operations Pattern)
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-C7F096]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - 비동기 데이터 패칭 (Async Operations Pattern)"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[비동기 데이터 패칭 (Async Operations Pattern)]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> 비동기 데이터 패칭(Async Operations Pattern)은 API 요청과 같은 비동기 작업 및 UI 상태를 안전하게 관리하기 위한 재사용 가능한 아키텍처 패턴입니다. 주로 식별 가능한 유니온(Discriminated Unions)을 활용하여 로딩, 성공, 실패와 같은 다양한 상태를 모델링하며, 런타임 및 컴파일 단계에서 유효하지 않은 상태가 발생하는 것을 원천적으로 차단합니다. 이를 통해 애플리케이션의 상태 전환을 예측 가능하고 타입 안전(Type-safe)하게 만듭니다 [1-3].
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **식별 가능한 유니온을 통한 상태 모델링:** 비동기 작업 패턴은 '식별 가능한 유니온(Discriminated Unions)'을 핵심으로 사용합니다. 비동기 작업 처리 시 API 응답을 모델링하는 데 탁월하며, 상태를 나타내는 판별자(Discriminator)를 통해 유효하지 않은 조합의 상태가 나타나는 것을 방지합니다 [1, 2, 4].
|
||||
* **상태 머신 패턴(State Machine Pattern)과의 결합:** 비동기 데이터 패칭은 일종의 상태 머신처럼 동작합니다. `FETCH_START`, `FETCH_SUCCESS`, `FETCH_FAILURE` 혹은 `Idle`, `Fetching`, `Success`, `Failure`, `RETRY`, `REFRESH`와 같은 명확한 상태(State)들을 정의하고 전환합니다 [5]. 타입스크립트의 철저한 검사(Exhaustive Checking)를 통해 개발자가 특정 비동기 상태의 처리를 누락하는 것을 컴파일 타임에 방지할 수 있습니다 [2, 4].
|
||||
* **비동기 UI 상태를 위한 런타임 유효성 검사 (Runtime Validation):** 타입스크립트의 타입 검사는 런타임 오버헤드가 없는 컴파일 타임 기능이지만, 외부 API 등에서 유입되는 데이터는 타입스크립트만으로 제어할 수 없습니다. 따라서 비동기 데이터 패칭 패턴은 Zod와 같은 유효성 검사 라이브러리를 결합하여 태그된 UI 상태(Tagged UI State)를 런타임에 검증하는 재사용 가능한 스키마 팩토리(schema factory) 형태로 사용될 수 있습니다 [6, 7].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** , [[런타임 유효성 검사 (Runtime Validation)]]
|
||||
- **Contradictions/Notes:** 소스 내에서 비동기 데이터 패칭 패턴 자체에 대한 상충되는 의견은 없으나, 타입스크립트의 구조적 타이핑 특성상 컴파일 타임의 에러 방지만으로는 외부 비동기 데이터의 무결성을 완벽히 보장할 수 없다는 한계가 존재합니다. 따라서 외부 API나 설정 파일에서 전달받는 비동기 상태 데이터는 반드시 런타임 유효성 검사를 병행해야 한다고 강조하고 있습니다 [6, 7]. (소스에 비동기 데이터 패칭의 구체적인 코드 구현 예시 정보는 일부 누락되어 있어 관련 정보가 부족합니다.)
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/비동기 데이터 패칭 (Async Operations Pattern).md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
---
|
||||
id: wiki-2026-0508-철벽-수비대-typescript-타입-시스템-인터페이스-설
|
||||
title: 철벽 수비대 TypeScript 타입 시스템 (인터페이스 설계)
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-A8177A]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - 철벽 수비대_ - TypeScript 타입 시스템 (인터페이스 설계)"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[철벽 수비대_ - TypeScript 타입 시스템 (인터페이스 설계)]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> TypeScript의 타입 시스템은 구조적 타이핑(Structural Typing)을 기반으로 유연성을 제공하면서도, 런타임 에러와 예기치 않은 상태 변경으로부터 애플리케이션을 보호하는 아키텍처적 도구입니다. 견고한 수비 체계를 구축하기 위해서는 성능과 확장성을 고려하여 인터페이스(Interface)와 타입 별칭(Type Alias)을 전략적으로 선택해야 합니다. 또한, 불변성 보장, 식별 가능한 유니온, 브랜디드 타입 등 고급 설계 기법을 활용하여 외부의 불안정한 데이터와 내부의 예기치 않은 상태 변경으로부터 시스템을 안전하게 지켜낼 수 있습니다.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **구조적 타이핑과 과잉 속성 체크(Excess Property Checking)**
|
||||
TypeScript는 객체의 구조가 일치하면 동일한 타입으로 간주하는 덕 타이핑(Duck Typing)을 따릅니다 [1]. 이로 인한 보안 허점을 막기 위해 과잉 속성 체크를 도입하여, 객체 리터럴이 직접 할당될 때 인터페이스에 정의되지 않은 속성이 포함되는 것을 컴파일 시점에 차단합니다 [2].
|
||||
|
||||
* **인터페이스(Interface)와 타입 별칭(Type Alias)의 전략적 선택**
|
||||
컴파일 성능 측면에서 인터페이스는 타입 관계를 캐싱하여 효율적인 반면, 타입 별칭의 교집합(&)은 매번 구조를 재계산하므로 핵심 도메인 모델에는 인터페이스가 유리합니다 [3]. 확장성 측면에서 인터페이스는 '선언 병합(Declaration Merging)'이 가능하여 라이브러리 확장에 유용하며, 타입 별칭은 동일한 이름 재선언이 불가해 더 엄격한 관리에 적합합니다 [3, 4]. 또한, 깊은 상속보다는 작은 단위의 인터페이스를 조합하는 '합성(Composition)' 방식이 시스템 결합도를 낮추어 변화에 강한 수비력을 제공합니다 [4].
|
||||
|
||||
* **불변성(Immutability)의 확립**
|
||||
`readonly` 수식어를 통해 컴파일 수준에서 객체와 배열의 수정을 금지하여 데이터의 무결성을 보장할 수 있습니다 [5]. 얕은 수준의 보호 한계를 극복하기 위해 매핑 타입(Mapped Types)과 조건부 타입(Conditional Types)을 결합한 재귀적 `DeepReadonly`를 구축하면, 트리 구조나 복잡한 중첩 데이터의 수정까지 완벽히 차단할 수 있습니다 [5, 6].
|
||||
|
||||
* **식별 가능한 유니온(Discriminated Unions)과 완전성 검사**
|
||||
공통된 리터럴 속성을 태그로 사용하여 타입을 좁히는(Narrowing) 기법으로 자동 완성과 타입 안전성을 극대화합니다 [7]. `never` 타입을 활용한 완전성 검사(Exhaustiveness Checking)는 새로운 상태가 유니온에 추가되었을 때 처리되지 않은 분기를 컴파일 에러로 찾아내어 시스템의 빈틈을 방어합니다 [7].
|
||||
|
||||
* **명목적 타이핑의 수복과 경계면 수비**
|
||||
의미적으로 다른 데이터(예: 이메일과 이름)가 혼용되는 것을 막기 위해, 컴파일 시점에만 존재하는 고유 속성을 부여하는 브랜디드 타입(Branded Types)을 사용하여 엄격한 격리를 보장할 수 있습니다 [8, 9]. 나아가 할당 과정에서 우회될 수 있는 과잉 속성 체크의 한계를 보완하기 위해 `satisfies` 연산자를 활용하면, 객체가 특정 타입을 만족하는지 검사하면서도 리터럴 타입의 구체성을 잃지 않고 예기치 않은 데이터 침투를 막아냅니다 [9, 10].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[구조적 타이핑(Structural Typing)]], [[선언 병합(Declaration Merging)]], [[브랜디드 타입 (Branded Types)]], [[satisfies 연산자]]
|
||||
- **Contradictions/Notes:** 과잉 속성 체크(EPC)는 객체 리터럴을 직접 다룰 때만 활성화되어 간접 할당 시 우회될 수 있다는 취약점이 있으나, TypeScript 4.9부터 도입된 satisfies 연산자를 통해 이 문제를 해결하고 엄격한 속성 검사를 수행할 수 있습니다 [9, 10].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/철벽 수비대_ - TypeScript 타입 시스템 (인터페이스 설계).md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
@@ -0,0 +1,107 @@
|
||||
---
|
||||
id: wiki-2026-0508-클린-아키텍처-clean-architecture
|
||||
title: 클린 아키텍처(Clean Architecture)
|
||||
category: 10_Wiki/Topics_Art
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
aliases: [P-REINFORCE-AUTO-2298F3]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - 클린 아키텍처(Clean Architecture)"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
---
|
||||
|
||||
# [[클린 아키텍처(Clean Architecture)]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> **클린 아키텍처(Clean Architecture)**는 로버트 C. 마틴(Robert C. Martin, "Uncle Bob")이 대중화한 소프트웨어 설계 철학으로, 비즈니스 로직과 애플리케이션 규칙을 시스템의 중심에 두어 코드의 품질을 높이는 것을 목표로 합니다 [1], [2]. 이 접근 방식은 시스템을 각기 다른 책임을 지는 여러 동심원 계층으로 분리하여 **관심사의 분리(Separation of Concerns)**를 촉진합니다 [1], [3]. 핵심 원칙인 **'의존성 규칙(Dependency Rule)'**을 강제하여 소스 코드 의존성이 오직 내부로만 향하게 함으로써 프레임워크, UI, 데이터베이스 등의 외부 요소로부터 독립적이고, 유지보수성, 확장성 및 테스트 용이성이 뛰어난 시스템을 구축할 수 있습니다 [1], [4], [5], [6].
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **주요 설계 원칙**
|
||||
* **의존성 규칙 (Dependency Rule):** 소스 코드 의존성은 반드시 외부 계층에서 내부 계층(고수준 정책 방향)으로만 향해야 합니다 [1], [7], [6]. 내부 원에 속한 코드는 외부에 선언된 어떤 것(함수, 클래스, 변수 등)에 대해서도 알아서는 안 됩니다 [6].
|
||||
* **독립성:** 시스템은 특정 프레임워크나 데이터베이스, UI, 그리고 기타 외부 에이전시에 종속되지 않고 독립적으로 동작해야 합니다 [1], [4], [5], [6].
|
||||
* **테스트 용이성 (Testability):** 아키텍처의 중심에 있는 핵심 비즈니스 규칙은 UI, 데이터베이스, 웹 서버 등의 외부 환경 없이도 격리된 상태에서 독립적으로 테스트할 수 있어야 합니다 [8], [4], [7], [6].
|
||||
|
||||
* **클린 아키텍처의 4가지 주요 계층**
|
||||
* **엔티티 (Entities):** 가장 안쪽 계층으로 전사적인 핵심 업무 규칙이나 데이터 구조를 캡슐화합니다 [9], [10], [11]. 프레임워크나 데이터베이스에 의존하지 않는 순수한 객체로, 외부의 변경(UI, 보안 등)에 의해 영향을 받지 않습니다 [12], [11].
|
||||
* **유스케이스 (Use Cases):** 애플리케이션에 특화된 비즈니스 규칙을 구현하며, 엔티티로 들어오고 나가는 데이터 흐름을 조정합니다 [9], [10], [13]. 데이터베이스나 UI 등 외부 요소의 변경으로부터 격리되어 있습니다 [13].
|
||||
* **인터페이스 어댑터 (Interface Adapters):** 유스케이스나 엔티티에서 사용하기 편리한 데이터 형식을 웹, UI, 또는 데이터베이스 같은 외부 에이전시에게 편리한 형식으로 변환하는 역할을 합니다 [9], [10], [13]. GUI의 MVC 구조에서 프레젠터(Presenter), 뷰(View), 컨트롤러(Controller)와 데이터베이스 게이트웨이가 이 계층에 속합니다 [9], [13], [14].
|
||||
* **프레임워크와 드라이버 (Frameworks & Drivers):** 가장 바깥쪽 계층으로 데이터베이스, 웹 프레임워크, UI 시스템 등 변동성이 크고 시스템의 구체적인 세부 사항들이 위치하는 곳입니다 [9], [10], [15].
|
||||
|
||||
* **경계 횡단 (Crossing Boundaries) 및 데이터 전달**
|
||||
* 제어 흐름과 의존성의 방향이 반대가 되는 상황에서는 **의존성 역전 원칙(DIP)**과 동적 다형성을 사용하여 소스 코드 의존성이 내부를 향하도록 만들어야 합니다 [16], [8], [17]. (예를 들어, 유스케이스가 직접 프레젠터를 호출하지 않고, 내부의 인터페이스를 호출하면 외부의 프레젠터가 이를 구현하도록 함) [17].
|
||||
* 계층 경계를 가로지르는 데이터는 DTO(Data Transfer Object)와 같이 캡슐화 및 격리된 매우 단순한 데이터 구조를 가져야만 의존성 규칙을 위배하지 않습니다 [18].
|
||||
|
||||
* **도입 시 도전 과제 및 해결책**
|
||||
* **과엔지니어링(Over-Engineering) 및 초기 비용:** 클린 아키텍처의 여러 계층과 추상화를 도입하면 시스템이 장황해지고 초기 개발 시간이 길어질 수 있습니다 [19].
|
||||
* **해결책:** 소프트웨어 개발에 실질적인 이점이 있을 때만 레이어와 추상화를 추가하는 실용적인 접근(Pragmatism)이 필요하며, 점진적인 도입을 통해 레거시 코드를 개선하는 것이 좋습니다 [19], [20].
|
||||
* **테스트의 복잡성:** 여러 계층을 테스트하는 것은 까다로울 수 있으므로 목(Mock) 객체를 생성하여 독립적인 컴포넌트의 동작에 초점을 맞추는 것이 권장됩니다 [19].
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Design & Experience 분야의 자동 자산화 수행.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[관심사의 분리(Separation of Concerns)]], [[의존성 역전 원칙 (Dependency Inversion Principle)]]
|
||||
- **Contradictions/Notes:** 소스 출처 "Complete Guide to Clean Architecture - GeeksforGeeks"는 클린 아키텍처가 시스템의 장기적인 유지보수성, 테스트 가능성, 유연성을 제공한다고 강조하지만, 동시에 도입 초기에는 여러 추상화 계층을 구축해야 하므로 초기 개발 시간이 증가하고 오버엔지니어링(Over-Engineering)에 빠질 위험이 있다고 지적합니다. 따라서 실용적인 관점과의 균형 유지가 필수적입니다 [21], [19].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-18*
|
||||
- Raw Source: [[00_Raw/2026-04-20/클린 아키텍처(Clean Architecture).md]]
|
||||
---
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
Reference in New Issue
Block a user