Files
2nd/01_Archive/2026-04-20/Readonly 유틸리티 타입.md

4.6 KiB

id, category, confidence_score, tags, last_reinforced, github_commit
id category confidence_score tags last_reinforced github_commit
P-REINFORCE-AUTO-33C0BF 10_Wiki/💡 Topics/Programming & Language 0.90
auto-reinforced
2026-04-20 [P-Reinforce] Continuous Worker - Readonly 유틸리티 타입

Readonly 유틸리티 타입

📌 한 줄 통찰 (The Karpathy Summary)

Readonly 유틸리티 타입(Readonly<T>)은 TypeScript에서 특정 객체 타입의 모든 속성에 readonly 수식어를 추가하여 초기화 이후 값을 재할당할 수 없도록 변환하는 기능입니다[1, 2]. 이는 런타임 성능 저하 없이 컴파일 타임에만 엄격하게 불변성을 강제하여, 의도치 않은 데이터 변형으로 인한 버그를 사전에 차단합니다[3, 4]. 단, 최상위 속성에만 적용되는 얕은(shallow) 불변성만을 제공하므로, 중첩된 객체를 완전히 동결하려면 재귀적인 형태의 딥 리드온리(Deep Readonly) 패턴이 별도로 필요합니다[5, 6].

📖 구조화된 지식 (Synthesized Content)

  • 기본 작동 원리와 문법: Readonly<T>는 주어진 타입 T의 모든 프로퍼티를 읽기 전용으로 매핑합니다[1, 2]. 설정이나 API 응답, 상태 관리 리듀서 등 앱 내내 값이 유지되어야 하는 객체를 보호할 때 주로 사용됩니다[7, 8]. TypeScript 코드가 컴파일된 후에는 관련 어노테이션이 모두 사라지므로 실행 시점(Runtime)에는 어떠한 오버헤드도 발생시키지 않습니다[3, 9].

  • 유사 개념과의 차이점:

    • const와의 차이: const는 변수 자체의 재할당을 막지만 참조된 객체의 내부 속성 변경은 막지 못합니다. 반면 readonly는 변수 바인딩이 아닌 객체 속성이나 배열 요소 자체의 변경을 제한합니다[10, 11].
    • Object.freeze()와의 차이: Object.freeze()는 런타임에 객체를 동결하며 실행 성능에 비용을 청구하지만, readonly는 컴파일 타임에 타입 시스템을 통해서만 수정을 금지합니다[4, 12].
  • 배열에서의 활용: 객체뿐만 아니라 배열에도 ReadonlyArray<T> 또는 readonly T[] 형태로 사용할 수 있습니다[13, 14]. 이렇게 선언된 배열은 요소의 재할당이 불가능할 뿐만 아니라, push(), pop() 등 원본을 수정하는 메서드가 타입 정의에서 완전히 제거됩니다[15, 16].

  • 한계점 및 우회 취약점 (Gotcha):

    • 얕은 불변성(Shallow Immutability): Readonly<T>는 1단계 깊이의 속성에만 작용합니다. 객체 내부의 중첩된 객체 속성은 여전히 수정이 가능하며, 이를 해결하기 위해서는 매핑된 타입과 조건부 타입을 결합한 커스텀 DeepReadonly<T> 유틸리티를 구현해야 합니다[5, 6, 17].
    • 에일리어싱(Aliasing) 문제: readonly 타입의 데이터를, 수정 가능한 타입(mutable)을 매개변수로 받는 함수에 전달할 경우 타입 호환성 규칙에 의해 통과될 수 있습니다. 이로 인해 함수 내부에서 원본 데이터가 변경되는 우회 돌연변이가 발생할 수 있습니다[18, 19].

⚠️ 모순 및 업데이트 (Contradictions & RL Update)

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

🔗 지식 연결 (Graph)

  • Related Topics: 불변성(Immutability), 매핑된 타입(Mapped Types), DeepReadonly
  • Projects/Contexts: 변경 불가한 외부 API 응답 데이터 모델링, 상태 관리 시스템(Redux 리듀서 등)의 데이터 무결성 보장, 그리고 애플리케이션의 전역 환경 설정(Configuration) 객체 보호 맥락에서 광범위하게 쓰입니다[8, 17].
  • Contradictions/Notes: TypeScript의 에일리어싱 한계로 인해 readonly 데이터가 mutable 타입을 요구하는 함수로 전달되어 내부에서 값이 변경될 위험이 존재하므로, 완전한 불변성을 지키려면 함수 시그니처 전반에 걸쳐 읽기 전용 파라미터를 강제하거나 데이터의 복사본을 넘기는 설계가 필요합니다[18, 19]. 또한, 모든 readonly 속성을 다시 수정 가능하게 되돌려야 할 때는 Mutable이라는 커스텀 헬퍼 타입을 만들어 매핑 수식어를 제거(-readonly)하는 방식으로 해결할 수 있습니다[6].

Last updated: 2026-04-18

  • Raw Source: 00_Raw/2026-04-20/Readonly 유틸리티 타입.md