?
사용자
TypeScript Strict 모드, 왜 켜야 할까? 개념부터 활용까지 가이드
TypeScript 프로젝트에서 strict 모드 활성화의 필요성과 장점을 설명합니다. 코드 품질 향상을 위한 필수 가이드입니다.
#typescript#strict#type safety#programming#best practices
recipe.sh
## TypeScript Strict 모드란?
TypeScript의 `strict` 모드는 컴파일러 옵션으로, 타입 검사를 더욱 엄격하게 수행하도록 설정합니다. 이 모드를 활성화하면 TypeScript는 더 많은 잠재적인 오류를 컴파일 시점에 발견하여 개발자가 코드를 작성하는 동안 버그를 줄이고 코드의 안정성을 높이는 데 도움을 줍니다.
`strict` 모드는 여러 개의 개별적인 엄격한 컴파일러 옵션을 묶어놓은 메타 옵션과 같습니다. `strict: true`로 설정하면 다음과 같은 옵션들이 모두 `true`로 설정됩니다.
* `alwaysStrict`: ECMAScript의 strict mode 지시자를 자동으로 추가합니다.
* `noImplicitAny`: `any` 타입으로 암시적으로 변환될 수 있는 표현을 오류로 간주합니다.
* `strictNullChecks`: `null` 또는 `undefined`가 아닌 타입에 `null` 또는 `undefined`를 할당하는 것을 금지합니다.
* `strictFunctionTypes`: 함수 파라미터 타입 검사를 더 엄격하게 합니다.
* `strictBindCallApply`: `bind`, `call`, `apply` 메소드의 파라미터 타입 검사를 더 엄격하게 합니다.
* `strictPropertyInitialization`: 클래스 프로퍼티가 생성자에서 초기화되었는지 확인합니다.
* `useUnknownInCatchVariables`: `catch` 블록의 에러 변수 타입을 `unknown`으로 강제합니다.
## Strict 모드를 켜야 하는 이유
1. **잠재적 버그 사전 방지**: `null` 또는 `undefined` 관련 오류, 암시적 `any` 타입 사용 등은 런타임에 심각한 문제를 일으킬 수 있습니다. `strict` 모드는 이러한 오류를 컴파일 시점에 잡아냅니다.
2. **코드의 안정성 및 예측 가능성 향상**: 모든 변수와 함수의 타입이 명확하게 정의되고 검증되므로, 코드의 동작을 예측하기 쉬워지고 유지보수성이 높아집니다.
3. **타입 시스템의 이점 극대화**: TypeScript의 타입 검사기능을 최대한 활용하여 개발 생산성을 높이고, 리팩토링 시 오류 발생 가능성을 줄입니다.
4. **더 나은 코드 품질**: 엄격한 규칙은 개발자가 더 신중하고 명확하게 코드를 작성하도록 유도합니다. 이는 전반적인 코드 품질 향상으로 이어집니다.
5. **미래 지향적인 개발**: 최신 TypeScript 기능을 활용하고, 커뮤니티의 권장 사항을 따르는 개발 관행을 정립하는 데 도움이 됩니다.
## Strict 모드 활성화 및 사용법
`tsconfig.json` 파일에서 `compilerOptions` 섹션에 `strict: true`를 추가합니다.
```json
{
"compilerOptions": {
"target": "ES2016",
"module": "CommonJS",
"strict": true, // 이 부분을 추가합니다.
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
```
`strict: true`로 설정하면 위에 나열된 모든 개별 `strict` 관련 옵션이 활성화됩니다. 만약 특정 `strict` 옵션만 비활성화하고 싶다면, 해당 옵션을 `false`로 명시적으로 설정하면 됩니다. 예를 들어, `strictPropertyInitialization`만 비활성화하고 싶다면 다음과 같이 설정할 수 있습니다.
```json
{
"compilerOptions": {
"strict": true,
"strictPropertyInitialization": false // 이 옵션만 비활성화
}
}
```
### 활성화 후 발생할 수 있는 문제점 및 해결 방안
`strict` 모드를 켜면 기존 프로젝트의 경우 수많은 컴파일 오류가 발생할 수 있습니다. 당황하지 않고 다음과 같은 단계로 해결해 나가는 것이 좋습니다.
1. **점진적 적용**: 대규모 프로젝트의 경우, 전체 코드베이스에 한 번에 `strict: true`를 적용하기보다, 모듈별 또는 디렉토리별로 점진적으로 적용하는 것을 고려합니다. `tsconfig.json`을 여러 개 사용하거나, `files` 또는 `include`/`exclude` 옵션을 활용하여 적용 범위를 조절할 수 있습니다.
2. **오류 메시지 이해**: 각 오류 메시지를 주의 깊게 읽고, 어떤 타입 검사가 실패했는지 이해하는 것이 중요합니다. TypeScript 컴파일러는 매우 유용한 오류 메시지를 제공합니다.
3. **타입 명시 및 수정**: 오류가 발생하는 부분에서 타입을 명시적으로 지정하거나, 기존 타입을 수정하여 문제를 해결합니다.
* `noImplicitAny`: `any` 대신 명시적인 타입을 지정하거나, `unknown` 타입을 사용합니다.
* `strictNullChecks`: `undefined` 또는 `null`이 될 수 있는 값에는 유니온 타입(`string | null`)을 사용하고, 값 사용 전에 null/undefined 체크를 추가합니다.
* `strictPropertyInitialization`: 클래스 프로퍼티를 생성자에서 초기화하거나, `!` (non-null assertion operator) 또는 `undefined` 초기값을 사용합니다.
4. **`unknown` 타입 활용**: `any` 대신 `unknown` 타입을 사용하여 타입 안전성을 높입니다. `unknown` 타입은 `any`와 달리 사용하기 전에 반드시 타입 검증이 필요합니다.
## 짧은 예시
`strictNullChecks`가 비활성화된 경우:
```typescript
let name: string = undefined; // 오류 없음
console.log(name.toUpperCase()); // 런타임 오류 발생 가능
```
`strictNullChecks`가 활성화된 경우 (`strict: true` 설정):
```typescript
let name: string = undefined; // 오류: Type 'undefined' is not assignable to type 'string'.
```
이를 해결하려면:
```typescript
let name: string | undefined;
name = "Alice";
if (name !== undefined) {
console.log(name.toUpperCase()); // "ALICE"
}
```
## 주의사항
* `strict: true`는 강력하지만, 기존의 많은 코드를 수정해야 할 수도 있습니다. 프로젝트의 상황에 맞게 적용 계획을 세우는 것이 중요합니다.
* `strict: true`를 사용하더라도, JavaScript의 모든 잠재적 문제를 막아주는 것은 아닙니다. 논리적 오류 등은 여전히 발생할 수 있으므로, 테스트 코드 작성은 필수입니다.
* `strict` 모드의 개별 옵션들을 이해하고, 필요한 경우 `strict: true` 대신 개별 옵션들을 조합하여 사용하는 것도 좋은 방법입니다.
`strict` 모드를 활성화하는 것은 TypeScript 프로젝트의 장기적인 건강과 개발 효율성을 크게 향상시키는 현명한 선택입니다.1
스크랩
19
좋아요
0
댓글