타입 안전한 서비스 토큰
타입이 지정된 토큰으로 런타임 해결 오류를 방지합니다.
타입 안전한 서비스 토큰은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
문자열 토큰의 문제
"Logger"와 같은 문자열 토큰은 오타를 내기 쉽고 타입 정보도 담고 있지 않습니다. 컨테이너는 get("Loggr")가 잘못되었다는 것을 알려 줄 수 없으며, 해석된 타입도 대개 any입니다.
토큰으로 사용하는 심벌
문자열 대신 심벌을 사용하면 각 토큰에 고유한 식별성이 부여되어 다른 토큰과 실수로 충돌할 수 없습니다. 중앙 레지스트리에서 토큰을 체계적으로 관리할 수 있습니다.
const TYPES = {
Logger: Symbol.for("Logger"),
Mailer: Symbol.for("Mailer"),
} as const;토큰과 타입 연결하기
더 근본적인 목표는 각 토큰을 토큰이 해석하는 타입과 연결하는 것입니다. 그러면 컨테이너가 any 대신 올바른 타입을 반환합니다. 이를 위해 타입이 지정된 토큰 래퍼를 만듭니다.
interface Token<T> {
readonly id: symbol;
readonly _type?: T; // phantom type marker
}타입이 지정된 토큰 만들기
도우미 함수가 팬텀 필드에 자신의 타입을 기억하는 토큰을 만듭니다. 이 필드에는 실제 값이 들어가지 않으며, 컴파일러에 타입 정보만 전달합니다.
function token<T>(name: string): Token<T> {
return { id: Symbol.for(name) };
}
const LoggerToken = token<Logger>("Logger");타입이 지정된 컨테이너 인터페이스
get이 토큰에서 해석된 타입을 추론하도록 컨테이너에 타입을 지정합니다. 캐스팅도 없고 any도 없습니다.
interface TypedContainer {
get<T>(t: Token<T>): T;
bind<T>(t: Token<T>, impl: () => T): void;
}추론된 타입으로 바인딩하기
바인딩할 때 팩토리의 반환 타입은 토큰의 타입과 일치해야 합니다. 불일치는 컴파일 시점에 발견됩니다.
declare const c: TypedContainer;
c.bind(LoggerToken, () => new ConsoleLogger());
// ConsoleLogger must satisfy Logger or this errors.완전한 타입으로 해석하기
이제 get이 토큰의 타입을 정확히 반환합니다. 수동으로 주석을 추가하지 않아도 결과에 자동 완성과 타입 검사를 적용할 수 있습니다.
const logger = c.get(LoggerToken); // type: Logger
logger.log("typed resolution");조회 실수 방지하기
토큰이 타입이 지정된 값이므로 오타가 조용히 잘못된 문자열을 참조하는 대신, 정의되지 않은 변수에 대한 컴파일 오류가 됩니다. 문자열 키로 인해 발생하는 오류 유형이 모두 사라집니다.
// c.get(LogerToken) -> compile error: LogerToken is not definedInversifyJS와 같은 방식
Inversify도 심벌 토큰을 지원하며, 커뮤니티 도우미가 타입이 지정된 래퍼를 제공합니다. 원리는 동일합니다. 타입이 지정된 토큰을 구현체에 바인딩하고 올바른 타입으로 해석합니다.
import { Container } from "inversify";
const TYPES = { Logger: Symbol.for("Logger") };
// container.bind<Logger>(TYPES.Logger).to(ConsoleLogger)토큰 레지스트리
토큰을 하나의 모듈에 중앙 집중화하면 단일 기준점이 생기므로 코드베이스 전체에서 토큰을 쉽게 찾고, 리팩터링하고, 일관되게 유지할 수 있습니다.
export const TOKENS = {
Logger: token<Logger>("Logger"),
Mailer: token<Mailer>("Mailer"),
};이점 요약
타입이 지정된 토큰은 고유한 식별성(심벌), 컴파일 시점 안전성(불일치 거부), 올바른 해석 타입(any 없음), 오타 방지(정의되지 않은 변수 오류)를 제공합니다.
빠른 확인
이 레슨을 간단히 확인해 봅니다.
복습
타입 안전 서비스 토큰은 고유한 symbol을 팬텀 타입으로 감싸 각 토큰을 토큰이 해석하는 타입에 연결합니다. get은 정확한 타입을 반환하고, 바인딩 시 일치하는 구현체를 사용하도록 하며, 오타는 조용한 문자열 조회 오류가 아니라 컴파일 오류가 됩니다.
자주 묻는 질문
“타입 안전한 서비스 토큰” 강의는 무료인가요?
네 — “타입 안전한 서비스 토큰” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타입 안전한 서비스 토큰”에서 뭘 배우나요?
타입이 지정된 토큰으로 런타임 해결 오류를 방지합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“타입 안전한 서비스 토큰” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 제어 반전 기초
- 생성자 주입
- InversifyJS를 사용한 DI 컨테이너
- 타입 안전한 서비스 토큰