--- id: P-REINFORCE-AUTO-2609F8 category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - TypeScript νƒ€μž… μ‹œμŠ€ν…œμ„ ν™œμš©ν•œ λ‚΄λΆ€ 둜직 보호 및 데이터 검증" --- # [[TypeScript νƒ€μž… μ‹œμŠ€ν…œμ„ ν™œμš©ν•œ λ‚΄λΆ€ 둜직 보호 및 데이터 검증]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > TypeScript의 νƒ€μž… μ‹œμŠ€ν…œμ€ 컴파일 μ‹œμ μ— λ‚΄λΆ€ λ‘œμ§μ„ λ³΄ν˜Έν•˜κ³  데이터 무결성을 κ²€μ¦ν•˜λŠ” κ°•λ ₯ν•œ μˆ˜λΉ„ 기제λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. ꡬ쑰적 νƒ€μ΄ν•‘μ˜ μœ μ—°μ„±μ—μ„œ μ˜€λŠ” ν•œκ³„μ μ„ κ³Όμž‰ 속성 체크(Excess Property Checking)와 `satisfies` μ—°μ‚°μžλ‘œ λ³΄μ™„ν•˜λ©°, λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types)κ³Ό 식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨(Discriminated Unions)을 ν™œμš©ν•˜μ—¬ 잘λͺ»λœ μƒνƒœμ™€ 데이터 μ˜€μ—Όμ„ μ›μ²œ μ°¨λ‹¨ν•©λ‹ˆλ‹€. λ˜ν•œ, μ‹œμŠ€ν…œ κ²½κ³„μ—μ„œ "κ²€μ¦ν•˜μ§€ 말고 νŒŒμ‹±ν•˜λΌ(Parse, don't validate)" 원칙을 μ μš©ν•¨μœΌλ‘œμ¨ λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œλ„ 예츑 κ°€λŠ₯ν•˜κ³  κ²¬κ³ ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ쑰λ₯Ό 확립할 수 μžˆμŠ΅λ‹ˆλ‹€. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **ꡬ쑰적 타이핑과 `satisfies` μ—°μ‚°μžλ₯Ό ν™œμš©ν•œ 경계 λ°©μ–΄** TypeScriptλŠ” 객체의 ꡬ쑰가 μΌμΉ˜ν•˜λ©΄ λ™μΌν•œ νƒ€μž…μœΌλ‘œ μ·¨κΈ‰ν•˜λŠ” ꡬ쑰적 타이핑(Structural Typing)을 μ‚¬μš©ν•©λ‹ˆλ‹€ [1, 2]. 이 νŠΉμ„±μ€ μœ μ—°ν•˜μ§€λ§Œ μ˜λ„μΉ˜ μ•Šμ€ μž‰μ—¬ 속성이 포함될 수 μžˆλŠ” 약점이 μžˆμŠ΅λ‹ˆλ‹€ [3-5]. 객체 λ¦¬ν„°λŸ΄ 직접 ν• λ‹Ή μ‹œμ—λŠ” κ³Όμž‰ 속성 체크(EPC)κ°€ μž‘λ™ν•˜μ§€λ§Œ λ³€μˆ˜λ₯Ό κ±°μΉ  경우 이λ₯Ό μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5-7]. 이λ₯Ό 막기 μœ„ν•΄ `satisfies` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄, 객체의 λ¦¬ν„°λŸ΄ ν˜•νƒœλ‚˜ 좔가적인 메타데이터 ꡬ쑰λ₯Ό μžƒμ§€ μ•ŠμœΌλ©΄μ„œλ„ νƒ€μž… μš”κ΅¬μ‚¬ν•­μ„ μ—„κ²©νžˆ κ²€μ¦ν•˜μ—¬ μ•ˆμ „μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€ [5, 8-10]. * **식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨(Discriminated Unions)κ³Ό λΆˆκ°€λŠ₯ν•œ μƒνƒœμ˜ 차단** 식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨μ€ κ³΅ν†΅λœ λ¦¬ν„°λŸ΄ 속성(예: `kind`, `type`)을 νƒœκ·Έλ‘œ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 객체 νƒ€μž…μ„ κ΅¬λ³„ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€ [11-13]. 이 기법은 TypeScriptκ°€ νƒ€μž…μ„ μ•ˆμ „ν•˜κ²Œ μ’νžˆλ„λ‘(Narrowing) μœ λ„ν•˜μ—¬ μœ νš¨ν•˜μ§€ μ•Šμ€ μƒνƒœμ˜ ν‘œν˜„μ„ μ½”λ“œλ‘œ λΆˆκ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€ [13-15]. λ˜ν•œ, `never` νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μ™„μ „μ„± 검사(Exhaustiveness Checking) ν•¨μˆ˜λ₯Ό μŠ€μœ„μΉ˜(switch) λ¬Έ 등에 κ²°ν•©ν•˜λ©΄, μΆ”ν›„ μƒˆλ‘œμš΄ μƒνƒœκ°€ μΆ”κ°€λ˜μ—ˆμ„ λ•Œ λˆ„λ½λœ λΆ„κΈ° 처리λ₯Ό 컴파일 μ—λŸ¬λ‘œ 포착해 둜직의 λΉˆν‹ˆμ„ λ§‰μ•„μ€λ‹ˆλ‹€ [13, 15-17]. * **λΈŒλžœλ””λ“œ νƒ€μž…(Branded Types)을 ν†΅ν•œ λͺ…λͺ©μ  타이핑 κ΅¬ν˜„ 및 데이터 μ˜€μ—Ό λ°©μ§€** μ‚¬μš©μžμ˜ μ‹λ³„μž(ID)와 일반 λ¬Έμžμ—΄μ€ λͺ¨λ‘ `string` νƒ€μž…μ΄μ§€λ§Œ 도메인 μ˜λ―ΈλŠ” λ‹€λ¦…λ‹ˆλ‹€. 이듀을 ν˜Όμš©ν•˜λŠ” μ‹€μˆ˜(μ›μ‹œ νƒ€μž… μ§‘μ°©)λ₯Ό 막기 μœ„ν•΄, 컴파일 νƒ€μž„μ—λ§Œ μ‘΄μž¬ν•˜λŠ” κ³ μœ ν•œ κ°€μƒμ˜ 속성(λΈŒλžœλ“œ)을 ꡐ집합(`&`)으둜 κ²°ν•©ν•˜λŠ” λΈŒλžœλ””λ“œ νƒ€μž…μ΄ μ‚¬μš©λ©λ‹ˆλ‹€ [18-21]. μ΄λŠ” κ³ μœ ν•œ 신뢄증을 λΆ€μ—¬ν•˜λŠ” 것과 κ°™μ•„μ„œ, `UserId`κ°€ ν•„μš”ν•œ 곳에 `OrderId`λ‚˜ 일반 λ¬Έμžμ—΄μ΄ μœ μž…λ˜λŠ” 것을 컴파일러 μˆ˜μ€€μ—μ„œ μ² μ €νžˆ μ°¨λ‹¨ν•©λ‹ˆλ‹€ [5, 22, 23]. * **"κ²€μ¦ν•˜μ§€ 말고 νŒŒμ‹±ν•˜λΌ (Parse, Don't Validate)" μ „λž΅** λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ „λ°˜μ— 흩어진 데이터 μœ νš¨μ„± 검사 μ½”λ“œλŠ” 관리λ₯Ό μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€. λŒ€μ‹  μ‹œμŠ€ν…œμ˜ 경계(API 톡신 λ“±)μ—μ„œ μ•Œ 수 μ—†λŠ”(`unknown`) 데이터λ₯Ό μ•ˆμ „ν•œ νƒ€μž…μ˜ ꡬ쑰둜 ν•œ λ²ˆμ— "νŒŒμ‹±"ν•΄μ•Ό ν•©λ‹ˆλ‹€ [24-26]. Zod와 같은 검증 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ λΈŒλžœλ””λ“œ νƒ€μž…μ„ ν•¨κ»˜ κ²°ν•©ν•˜λ©΄, 경계λ₯Ό ν†΅κ³Όν•œ λ°μ΄ν„°λŠ” μ‹œμŠ€ν…œ λ‚΄λΆ€μ—μ„œ 항상 μœ νš¨ν•˜κ³  μ•ˆμ „ν•œ 데이터(`SanitizedString` λ“±)둜 취급받을 수 μžˆμŠ΅λ‹ˆλ‹€ [26-28]. * **`readonly`λ₯Ό ν†΅ν•œ λΆˆλ³€μ„±(Immutability) 확립** 데이터 무결성을 λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ `readonly` μˆ˜μ‹μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 컴파일 νƒ€μž„μ— μ†μ„±κ°’μ˜ 변경을 μ›μ²œμ μœΌλ‘œ 막을 수 μžˆμŠ΅λ‹ˆλ‹€ [29-31]. 얕은 μˆ˜μ€€(Shallow)의 보호λ₯Ό λ„˜μ–΄μ„œκΈ° μœ„ν•΄ μž¬κ·€μ  μœ ν‹Έλ¦¬ν‹° νƒ€μž…μΈ `DeepReadonly`λ₯Ό μ μš©ν•˜λ©΄, λ³΅μž‘ν•˜κ²Œ μ€‘μ²©λœ 객체 트리 ꡬ쑰 λ‚΄λΆ€μ˜ λͺ¨λ“  μƒνƒœκ°€ 예기치 μ•Šκ²Œ μ˜€μ—Όλ˜λŠ” 것을 μ™„λ²½νžˆ 차단할 수 μžˆμŠ΅λ‹ˆλ‹€ [31-33]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[ꡬ쑰적 타이핑 (Structural Typing)]], [[식별 κ°€λŠ₯ν•œ μœ λ‹ˆμ˜¨ (Discriminated Unions)]], [[λΈŒλžœλ””λ“œ νƒ€μž… (Branded Types)]], [[satisfies μ—°μ‚°μž]], [[Parse, Don't Validate]] - **Projects/Contexts:** [[Zodλ₯Ό ν™œμš©ν•œ λŸ°νƒ€μž„ 데이터 νŒŒμ‹± 및 검증]], [[Toss Front SDK의 Facade νŒ¨ν„΄ 섀계 및 μ•ˆμ „μ„± 확보]] - **Contradictions/Notes:** TypeScript의 ꡬ쑰적 타이핑은 맀우 μœ μ—°ν•˜μ—¬ 덕 νƒ€μ΄ν•‘μ˜ 이점을 μ œκ³΅ν•˜μ§€λ§Œ, "μ˜λ„ν•˜μ§€ μ•Šμ€ 초과 λ°μ΄ν„°μ˜ μœ μž…"μ΄λΌλŠ” 치λͺ…적인 λ³΄μ•ˆμ  ν—ˆμ μ„ λ§Œλ“­λ‹ˆλ‹€ [4, 21]. 이λ₯Ό λ°©μ–΄ν•˜κΈ° μœ„ν•΄ κ°œλ°œμžλ“€μ€ 였히렀 ꡬ쑰적 νƒ€μ΄ν•‘μ˜ λ°˜λŒ€ κ°œλ…μΈ λͺ…λͺ©μ  타이핑(Nominal Typing) νŠΉμ„±μ„ κ°•μ œλ‘œ λͺ¨λ°©ν•œ λΈŒλžœλ””λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 격리해야 ν•˜λŠ” μ—­μ„€μ μ΄μ§€λ§Œ ν•„μˆ˜μ μΈ 섀계 νŒ¨ν„΄μ„ λ”°λ₯΄κ²Œ λ©λ‹ˆλ‹€ [21, 34, 35]. λ˜ν•œ, `any` νƒ€μž…μ˜ μ‚¬μš©μ€ μ΄λŸ¬ν•œ λͺ¨λ“  νƒ€μž… μ‹œμŠ€ν…œμ˜ λ³΄ν˜Έλ§‰μ„ 무λ ₯ν™”μ‹œν‚€λ―€λ‘œ μ§€μ–‘ν•΄μ•Ό ν•˜λ©°, 좜처λ₯Ό μ•Œ 수 μ—†λŠ” μ™ΈλΆ€ λ°μ΄ν„°λŠ” λ°˜λ“œμ‹œ `unknown` νƒ€μž…μœΌλ‘œ μ„ μ–Έ ν›„ νƒ€μž… κ°€λ“œλ₯Ό κ±°μΉ˜λ„λ‘ κ°•μ œν•΄μ•Ό ν•©λ‹ˆλ‹€ [36-38]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/TypeScript νƒ€μž… μ‹œμŠ€ν…œμ„ ν™œμš©ν•œ λ‚΄λΆ€ 둜직 보호 및 데이터 검증.md]] ---