4.5 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 |
|
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].
- 얕은 불변성(Shallow Immutability):
⚠️ 모순 및 업데이트 (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