JSON → TypeScript 타입 변환기
JSON 객체(또는 JSON 배열)를 붙여넣으면 이에 대응하는 TypeScript interface/type 정의를 자동으로 생성합니다.
JSON에서 TypeScript 타입 정의 만들기
API의 응답을 TypeScript로 받을 때 가장 먼저 필요한 것이 타입 정의입니다. 그런데 중첩이 깊은 JSON을 보면서 `interface`를 손으로 써 내려가는 일은 고되고, **프로퍼티를 빠뜨리거나 타입을 잘못 잡기 쉬운 작업**이기도 합니다. 이 도구는 JSON을 붙여 넣기만 하면 대응하는 `interface`/`type`을 자동으로 생성합니다.
생성에서는 값의 JavaScript상 타입으로부터 TypeScript의 타입을 추론합니다. **중첩된 객체는 별도의 interface로 떼어 내고**, 배열은 요소의 타입에서 `T[]`를 이끌어 냅니다. 루트 타입의 이름은 자유롭게 지정할 수 있어 생성물을 그대로 프로젝트에 붙여 넣을 수 있습니다. **추론은 어디까지나 붙여 넣은 샘플에 근거하므로, 생략될 수 있는 프로퍼티나 `null`을 취할 수 있는 항목은 생성 후에 `?`나 유니온 타입을 직접 더해 주세요.** 처리는 모두 브라우저 안에서 완결됩니다.
타입 정의를 생성하는 순서
- JSON을 붙여 넣습니다 API의 응답 예시 등을 그대로 입력합니다. 객체든 배열이든 상관없습니다.
- 루트 타입의 이름을 정합니다 생성되는 최상위 interface 이름이 됩니다. 기본값 그대로도 괜찮습니다.
- 생성 결과를 확인합니다 중첩된 객체는 별도의 interface로 떼어져 나열됩니다.
- 생략 가능한 항목을 손으로 보완합니다 **샘플에 나타나지 않는 항목은 추론할 수 없습니다.** `?`나 `| null`은 직접 더해 주세요.
- 복사해 프로젝트에 붙여 넣습니다 그대로 `.ts` 파일에 붙여 넣을 수 있습니다.
더 잘 활용하기 위한 팁
- 배열의 모든 요소가 객체인 경우, 각 요소의 키를 병합하여 하나의 interface를 생성합니다. 일부 요소에만 없는 키는 자동으로 선택적(`?`) 속성으로 처리됩니다.
- 루트 타입의 이름은 기본값인 "Root"에서 원하는 이름(예: `User`, `ApiResponse`)으로 변경할 수 있습니다. 중첩된 객체의 interface 이름은 해당 속성 이름을 기반으로 자동 생성됩니다.
- API 응답의 샘플 JSON을 그대로 붙여넣으면 프런트엔드 구현에서 사용할 타입 정의의 초안을 빠르게 얻을 수 있습니다.
- 생성된 결과는 어디까지나 구조로부터 추론한 타입 초안일 뿐입니다. 실제 API 사양(nullable 여부, 필수 항목 등)과 대조하여 수동으로 조정하는 것을 권장합니다.
이럴 때 쓸 수 있습니다
외부 API의 타입을 마련할 때
문서에 타입 정의가 없는 API라도 응답 예시만 있으면 출발점을 만들 수 있습니다.
기존 JSON 설정 파일에 타입을 붙일 때
설정 파일을 타입 안전하게 읽고 싶을 때 구조를 그대로 타입으로 옮길 수 있습니다.
목 데이터에서 타입을 일으킬 때
프런트엔드를 먼저 만드는 국면에서 임시 데이터로 타입을 마련할 수 있습니다.
타입의 누락을 검산할 때
손으로 쓴 타입 정의와 생성된 타입을 견주어 빠진 것을 찾을 수 있습니다.
TypeScript 용어
- interface
- 객체의 형태를 나타내는 선언입니다. **같은 이름으로 여러 번 선언하면 자동으로 합쳐진다**는 점이 type과의 차이입니다.
- type 별칭
- 임의의 타입에 이름을 붙이는 선언입니다. 유니온 타입이나 원시 타입에도 이름을 붙일 수 있습니다.
- 선택적 프로퍼티
- `name?: string`처럼 `?`를 붙인 항목입니다. **붙여 넣은 샘플로부터는 추론할 수 없습니다.**
- 유니온 타입
- `string | null`처럼 여러 타입 가운데 하나를 취할 수 있음을 나타냅니다.
- 중첩 객체
- 값이 다시 객체로 되어 있는 구조입니다. 이 도구는 별도의 interface로 떼어 냅니다.
- 타입 추론
- 값으로부터 타입을 이끌어 내는 것입니다. **여기서의 추론은 붙여 넣은 한 건의 샘플에 근거하므로 실제 API 사양이라고는 할 수 없습니다.**
자주 묻는 질문
여담 ― 타입 추론 도구가 해결하는 "타입 불일치" 문제
TypeScript는 정적 타입을 통해 컴파일 시점에 버그를 발견할 수 있는 언어이지만, 외부 API로부터 받는 JSON 데이터의 타입은 개발자가 직접 정의하지 않는 한 TypeScript 컴파일러가 알 수 없습니다. API 사양과 샘플 응답 사이에 차이가 생기거나 필드가 추가·삭제될 때마다 타입 정의를 수동으로 갱신해야 하며, 이러한 "타입 정의와 API의 실제 모습 사이의 괴리"는 많은 프런트엔드 프로젝트에서 골칫거리였습니다.
JSON → TypeScript 변환 도구는 실제로 반환된 샘플 JSON으로부터 타입을 기계적으로 역산함으로써 이 작업을 크게 효율화합니다. 같은 부류의 도구로는 quicktype(여러 언어의 타입 정의를 생성할 수 있는 오픈소스 도구)이 유명하며, JSON Schema・GraphQL 스키마 등 다양한 입력 형식을 지원하는 고기능 구현으로 잘 알려져 있습니다.
타입 추론의 어려움은 JSON 자체에 "이 필드가 항상 존재하는지", "앞으로 null이 될 수 있는지"와 같은 정보가 담겨 있지 않다는 점에 있습니다. 그래서 자동 생성된 타입 정의는 만능이 아니며, 어디까지나 "이번 샘플 데이터의 구조"를 반영한 초안으로 취급하고 실제 API 사양과 대조하여 조정하는 것이 실무상의 정석으로 여겨집니다.