Ch 03. 마무리
이 교재의 마지막 페이지에 왔습니다.
처음 시작을 떠올려봅니다. JavaScript로 코드를 쓰다가 undefined is not a function 에러를 마주하고, 혹은 팀 동료가 만든 함수에 무엇을 전달해야 하는지 몰라서 코드를 뒤졌던 경험. TypeScript를 배우겠다고 마음먹게 한 그 불편함이 있었을 겁니다.
지금은 어떤가요.
우리가 걸어온 길
PART 01에서 개발 환경을 만들고 첫 TypeScript 코드를 실행했습니다. 타입 에러가 빌드 전에 잡히는 경험, 에디터가 자동완성과 함께 타입을 알려주는 경험. 그것이 시작이었습니다.
PART 02에서 타입 시스템의 핵심을 배웠습니다. 원시 타입, 유니온, 인터섹션, 리터럴 타입. TypeScript가 값을 집합으로 생각한다는 관점이 모든 것을 이해하는 열쇠였습니다.
PART 03에서 타입 좁히기를 배웠습니다. typeof, instanceof, in 연산자, 그리고 직접 만드는 타입 가드. 조건문이 타입 정보를 바꾼다는 것이 TypeScript의 가장 강력한 기능 중 하나입니다.
PART 04에서 제네릭을 만났습니다. "타입을 변수처럼 쓴다"는 아이디어. 처음에는 어색했지만, 익숙해지면 재사용 가능한 함수와 클래스를 만드는 도구로 자연스럽게 손이 갑니다.
PART 05에서 모듈과 선언 파일을 배웠습니다. 외부 라이브러리의 타입이 어디서 오는지, 없을 때 어떻게 만드는지. @types 생태계가 TypeScript를 JavaScript 세계와 연결하는 다리입니다.
PART 06에서 실전 타입 설계 패턴을 익혔습니다. 판별 유니온, readonly, 유틸리티 타입들. 타입을 단순한 주석이 아니라 설계 도구로 쓰는 방법입니다.
PART 07에서 React와 TypeScript를 함께 썼습니다. Props, state, 이벤트 타이핑. 컴포넌트 경계에서 타입이 계약처럼 작동하는 것을 경험했습니다.
PART 08에서 Express API 서버를 만들었습니다. 서버에서 TypeScript는 더 중요합니다. 오류가 나면 서비스 장애이기 때문입니다. 타입 안전성이 안정성의 문제가 된다는 것을 확인했습니다.
PART 09에서 마이그레이션을 다뤘습니다. allowJs, 점진적 전환, strict 옵션 하나씩 켜기. 새 프로젝트만이 아니라 기존 코드도 TypeScript로 바꿀 수 있다는 것을 알았습니다.
TypeScript가 가르쳐준 것
TypeScript를 배우는 것은 단순히 문법 하나를 더 익히는 것이 아닙니다.
타입을 쓰는 것은 생각을 명확하게 하는 훈련입니다. "이 함수는 뭘 받아서 뭘 돌려주는가", "이 객체에는 어떤 값이 있어야 하는가". 타입을 선언하려면 먼저 그 답을 알아야 합니다. 타입이 명확해질수록 설계도 명확해집니다.
에러 메시지가 가이드입니다. TypeScript의 에러는 무엇이 잘못되었는지 정확히 알려줍니다. 처음에는 영어 에러가 낯설어서 막막하지만, 읽는 연습을 하면 에러 자체가 해결책을 담고 있는 경우가 많습니다.
협업이 편해집니다. 타입은 코드를 읽는 모든 사람에게 설명입니다. 함수 시그니처만 봐도 무엇을 어떻게 쓰는지 알 수 있습니다. 팀이 커질수록, 시간이 지날수록 타입의 가치는 올라갑니다.
TypeScript 역량 로드맵
지금 어디 서 있는지, 어디로 가야 하는지 지도입니다.
초급 (이 교재 수준) 기본 타입, 인터페이스, 함수 타이핑, 제네릭 기초, 타입 좁히기를 이해하고 사용할 수 있습니다. React나 Express 같은 프레임워크에서 TypeScript를 설정하고 쓸 수 있습니다.
중급 유틸리티 타입을 자유롭게 조합합니다. 판별 유니온으로 상태 기계를 설계합니다. 제네릭 제약으로 재사용 가능한 유틸리티를 만듭니다. 선언 파일을 직접 작성할 수 있습니다.
고급
Mapped Types, Conditional Types, Template Literal Types로 타입 레벨에서 프로그래밍합니다. infer 키워드로 타입에서 타입을 추출합니다. 복잡한 라이브러리의 타입 정의를 읽고 이해합니다.
전문가 오픈소스 라이브러리의 타입 정의를 작성하고 기여합니다. 타입 시스템의 한계와 trade-off를 이해하고 팀에 설명할 수 있습니다. TypeScript 릴리즈 노트를 읽고 새 기능의 활용 방법을 팀에 공유합니다.
지금 초급이라면 중급을 목표로 삼으면 됩니다. 중급이 되면 고급의 문이 보입니다. 한 번에 다 되지 않아도 됩니다.
마지막으로
TypeScript는 도구입니다. 좋은 코드를 보장하지 않습니다. 타입을 모두 any로 선언해도 TypeScript는 통과합니다. 타입이 있어도 설계가 나쁘면 버그가 납니다.
하지만 TypeScript는 좋은 코드를 쓸 기회를 만들어줍니다. 타입을 제대로 선언하려면 설계를 생각해야 합니다. 에러를 처리하려면 예외 상황을 생각해야 합니다. null을 처리하려면 데이터의 생애주기를 생각해야 합니다.
TypeScript는 이 생각들을 코드로 고정시킵니다. 생각이 사라지지 않도록. 다음에 이 코드를 열었을 때도, 팀 동료가 처음 이 코드를 봤을 때도, 설계 의도가 타입으로 남아 있도록.
여기까지 함께해주셔서 감사합니다. TypeScript로 더 좋은 코드를 만드는 여정에서 이 교재가 든든한 출발점이 되었으면 합니다.