10장: 타입스크립트로 오류 처리와 코드 안전성 높이기
타입스크립트로 지키는 오류 처리와 코드 안전성
현대 웹 개발에서 신뢰할 수 있는 코드는 곧 유지보수성과 안정성, 그리고 사용자 경험의 향상으로 이어집니다. 타입스크립트는 단순한 타입 선언을 넘어, 코드가 예상치 못한 상황에서 무너지지 않도록 다양한 안전장치를 제공합니다. 이 장에서는 타입스크립트가 제공하는 오류 처리 전략과 코드의 견고함을 높이는 방법에 집중합니다.
명확하고 체계적인 오류 처리의 중요성
소프트웨어는 언제든 오류를 만날 수 있습니다. 중요한 것은 오류가 발생하지 않는 상황을 만드는 것만이 아니라, 발생했을 때 이를 예견 가능한 방식으로 다루는 것입니다. 타입스크립트는 자바스크립트의 try-catch
문법을 그대로 지원하면서도, 타입 시스템의 힘으로 더 명확한 오류 구조를 설계할 수 있습니다.
예를 들어, 특정 함수가 실패할 수도 있음을 타입에 드러낼 수 있습니다.
function fetchUser(id: string): User | undefined {
// ...
}
이렇게 반환 타입에 undefined
를 포함해 실수로 오류를 무시하거나 잘못된 데이터가 전달되는 위험을 줄입니다. 또한, 고유의 에러 클래스를 만들어 오류의 성격을 명확히 할 수도 있습니다.
class DataNotFoundError extends Error {
constructor(message: string) {
super(message);
this.name = "DataNotFoundError";
}
}
오류 처리의 모범 사례
타입스크립트로 조건문이나 예외 처리를 담당할 때, 다음과 같은 몇 가지 원칙을 지키면 코드 품질이 크게 높아집니다.
첫째, 예상 가능한 모든 오류 상황에 대해 명시적으로 타입을 부여하세요. 예를 들어, 요청 결과가 성공 또는 실패 구조로 나뉘는 경우 유니언 타입을 활용해주세요.
type Result<T> = { type: 'success'; data: T } | { type: 'error'; message: string };
둘째, 모든 함수의 반환 값을 항상 점검하는 습관을 들이세요. optional chaining(?.
)과 null 병합 연산자(??
)를 적극 활용하면 예외 상황을 안전하게 피할 수 있습니다.
셋째, 전역 에러 핸들러를 도입해 예기치 못한 오류를 한 곳에서 통제하세요. 프론트엔드에서는 window.onerror
, 백엔드에서는 미들웨어나 상위 핸들러에서 모든 예외를 통합해 관리할 수 있습니다.
코드의 안전성을 위한 타입스크립트 활용법
코드가 단단해지려면, 변수와 객체의 타입을 구체적으로 정의하는 데서 출발해야 합니다. 인터페이스와 타입 별칭을 적극적으로 이용해 데이터 구조의 신뢰도를 쌓으세요. 읽기 전용 속성(readonly
), 부분 타입(Partial<T>
), 필수 속성(Required<T>
) 등 타입스크립트가 제공하는 고급 기능으로 불변성, 옵션 처리, 계약 위반 등을 미리 방지할 수 있습니다.
반드시 필요한 경우에만 any
, unknown
키워드를 사용하고, 상황에 맞춰 타입 좁히기(type narrowing), 사용자 정의 타입 가드 등을 활용해 재난을 미연에 막으세요.
타입스크립트와 함께하는 방어적 프로그래밍
입력값 검증과 방어적 복사(defensive copying)는 단단한 시스템의 핵심입니다. 함수 시작 부분에서 전달받는 모든 인자에 대해 예상하는 타입과 값을 체크하면, 의도하지 않은 상태 변이와 치명적 버그를 막을 수 있습니다. 제네릭과 조건부 타입 등을 조합하면 더욱 유연하고 견고한 API를 설계할 수 있습니다.
결론
오류는 피할 수 없지만, 타입스크립트와 함께라면 피해는 최소화할 수 있습니다. 에러를 온전히 통제하는 코딩 습관, 타입 중심의 명확한 데이터 구조, 그리고 방어적 프로그래밍은 미래의 복잡한 프로젝트에서 든든한 안전망이 되어줄 것입니다. 자신의 코드를 한 번 더 점검하고, 타입스크립트의 기능들을 적극적으로 활용해보세요. 안전한 코드가 실력의 첫걸음입니다.