TechFeedTechFeed
Frontend

타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문)

타입스크립트(TypeScript)는 자바스크립트에 타입이라는 안전장치를 얹은 언어인데, 설치 자체는 명령어 한 줄로 끝나지만 진짜 고비는 그다음입니다. 저처럼 JS만 쓰던 1인 개발자가 넘어올 때 가장 많이 막히는 지점이 type과 interface 중 무엇을 쓸지, 그리고 tsconfig.json의 strict 옵션을 어디까지 켤지입니다. 이 글에서는 설치부터 기본 문법, type 대 interface 선택 기준, strict 모드 시행착오까지 제가 직접 프로젝트를 옮기며 겪은 순서대로 풀…

by

한 줄 요약: 타입스크립트(TypeScript)는 자바스크립트에 타입이라는 안전장치를 얹은 언어인데, 설치 자체는 명령어 한 줄로 끝나지만 진짜 고비는 그다음입니다. 저처럼 JS만 쓰던 1인 개발자가 넘어올 때 가장 많이 막히는 지점이 type과 interface 중 무엇을 쓸지, 그리고 tsconfig.json의 strict 옵션을 어디까지 켤지입니다. 이 글에서는 설치부터 기본 문법, type 대 interface 선택 기준, strict 모드 시행착오까지 제가 직접 프로젝트를 옮기며 겪은 순서대로 풀어 보겠습니다.


이 글이 필요한 사람
  • 자바스크립트는 익숙한데 타입스크립트는 처음이라 어디서 시작할지 막막한 분
  • 설치는 했는데 type과 interface 중 무엇을 써야 할지 매번 헷갈리는 분
  • tsconfig.json의 strict 옵션을 켰다가 빨간 줄 폭탄을 맞고 다시 끈 분
  • JS 프로젝트를 점진적으로 TS로 옮기고 싶은 1인 개발자

※ 버전과 명령어는 2026년 6월 기준입니다. 타입스크립트는 마이너 버전마다 동작이 조금씩 달라지므로, 설치 직전 공식 문서에서 최신 절차를 다시 확인하시길 권합니다.


타입스크립트는 왜 굳이 배워야 하나

타입스크립트는 자바스크립트 코드에 타입 정보를 붙여, 코드를 실행하기 전에 오류를 미리 잡아 주는 언어입니다. 예를 들어 숫자가 들어와야 할 자리에 글자가 들어오면, 브라우저에서 화면이 깨진 다음에야 발견하는 게 아니라 코드를 작성하는 그 순간 편집기에 빨간 줄로 알려 줍니다. 작성한 코드는 결국 일반 자바스크립트로 변환(컴파일)되어 똑같이 동작하므로, 실행 환경은 그대로 두고 작성 단계의 안전망만 추가한다고 보면 됩니다.


제가 12개 사이트를 1인으로 운영하면서 가장 크게 체감한 차이는, 함수 하나를 고쳤을 때 그 함수를 쓰는 다른 30곳이 한 번에 빨간 줄로 떠오른다는 점이었습니다. JS만 쓸 때는 어디가 깨졌는지 몰라 사이트를 직접 눌러 보며 찾았는데, TS로 옮긴 뒤로는 편집기가 깨진 자리를 먼저 알려 줍니다. 다만 공짜는 아닙니다. 타입을 적는 손품이 늘고, 초반에는 빨간 줄을 없애느라 시간이 더 들어갑니다.


구분자바스크립트타입스크립트
오류 발견 시점실행 중(런타임)작성 중(편집기)
자동완성 품질제한적타입 기반으로 정확
리팩터링 안정성직접 확인 필요편집기가 영향 범위 표시
초기 작성 속도빠름타입 작성으로 느림
실행 환경그대로 실행JS로 변환 후 실행

타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 이미지 — 타입스크립트는 왜 굳이 배워야 하나
타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 참고 이미지

설치는 명령어 한 줄, 그다음이 중요합니다

설치 자체는 정말 간단합니다. 전역으로 깔 수도 있지만, 저는 프로젝트마다 버전이 엇갈리는 사고를 피하려고 항상 프로젝트 안에 개발 의존성으로만 설치합니다. 새 폴더를 만들고 아래 순서대로 진행하면 됩니다.


프로젝트 안에 타입스크립트 설치
mkdir my-ts-app && cd my-ts-app npm init -y npm install -D typescript # 설치 확인 (프로젝트 로컬 버전 출력) npx tsc --version

설치가 끝나면 설정 파일인 tsconfig.json을 만듭니다. 이 파일이 어떤 규칙으로 검사하고 어떤 자바스크립트로 변환할지를 정하는 핵심입니다. 아래 명령으로 기본 골격을 자동 생성한 뒤, 필요한 항목만 손보는 흐름을 추천합니다.


tsconfig.json 자동 생성
npx tsc --init

이제 .ts 확장자로 파일을 하나 만들어 보겠습니다. 타입스크립트 파일은 변수 옆에 콜론과 타입을 적는 점만 빼면 자바스크립트와 거의 똑같이 생겼습니다. 아래는 가장 단순한 예시입니다.


hello.ts
function greet(name: string): string { return "안녕하세요, " + name + "님" } const message: string = greet("이승환") console.log(message)

이 파일을 자바스크립트로 변환하려면 npx tsc hello.ts 를 실행하면 같은 폴더에 hello.js 가 생깁니다. 실제로 한 번 돌려 보려면 변환 없이 바로 실행해 주는 도구를 쓰는 게 편한데, 저는 빠른 확인용으로 tsx 를 자주 씁니다. 아래처럼 설치 없이 한 번에 돌려 볼 수 있습니다.


타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 이미지 — 설치는 명령어 한 줄, 그다음이 중요합니다
타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 참고 이미지
변환 없이 .ts 바로 실행
# 1회성 실행 (별도 설치 없이) npx tsx hello.ts
막히는 케이스 메모. npx tsc 가 Cannot find name console 같은 오류를 뱉으면, 십중팔구 node 환경 타입이 빠진 경우입니다. npm install -D @types/node 로 노드용 타입 정의를 추가하면 해결됩니다. 반대로 브라우저에서 돌릴 코드인데 document 가 빨간 줄이면 tsconfig.json 의 lib 항목에 dom 이 포함됐는지 확인하면 됩니다.


기본 문법은 이 다섯 가지만 먼저 익히세요

타입스크립트 문법은 방대해 보이지만, 처음에는 다섯 가지만 손에 익혀도 일상 코드의 대부분을 처리할 수 있습니다. 저도 입문할 때 모든 문법을 외우려다 지쳐서 나가떨어졌는데, 자주 쓰는 것부터 익히니 훨씬 수월했습니다. 핵심만 추리면 다음과 같습니다.


  • 기본 타입: string, number, boolean, null 처럼 자바스크립트의 자료형과 거의 그대로 대응됩니다.
  • 배열과 객체: number 배열은 number와 대괄호로, 객체는 키마다 타입을 적어 모양을 정합니다.
  • 유니온 타입: 세로 막대 기호로 여러 타입 중 하나를 허용합니다. 값이 둘 중 하나일 때 유용합니다.
  • 옵셔널(선택) 속성: 키 뒤에 물음표를 붙이면 있어도 되고 없어도 되는 속성이 됩니다.
  • 함수 타입: 매개변수와 반환값에 각각 타입을 적어, 잘못된 인자가 들어오는 걸 막습니다.

아래 예시 하나로 위 다섯 가지가 어떻게 쓰이는지 한눈에 볼 수 있습니다.


기본 문법 모아 보기
// 기본 타입 let count: number = 3 let title: string = "타입스크립트 입문" let isPublished: boolean = false // 배열 let tags: string[] = ["frontend", "react"] // 객체 (모양 지정) let post: { id: number; title: string; views?: number } = { id: 1, title: "첫 글", } // 유니온 타입 (둘 중 하나) let status: "draft" | "published" = "draft" // 함수 function sum(a: number, b: number): number { return a + b }

위 코드에서 views 키에 붙은 물음표가 옵셔널 속성입니다. 글에 조회수가 아직 없을 수도 있으니 있어도 되고 없어도 되도록 풀어 둔 것입니다. status 처럼 정해진 문자열 몇 개만 허용하는 유니온 타입은, 오타로 publised 같은 잘못된 값을 넣으면 즉시 빨간 줄로 잡아 줘서 실수가 크게 줄었습니다. 제가 게시글 상태를 다룰 때 가장 먼저 도입한 패턴이기도 합니다.


type과 interface, 도대체 뭘 써야 하나

입문자가 가장 많이 검색하는 질문이 바로 이것입니다. 저도 처음엔 두 키워드가 똑같이 객체 모양을 정의하는 데 쓰여서 무엇이 다른지 한참 헷갈렸습니다. 결론부터 말하면, 객체나 클래스의 모양을 정의할 때는 어느 쪽을 써도 대부분 똑같이 동작합니다. 차이가 드러나는 건 특수한 경우입니다. 아래 표가 둘의 핵심 차이입니다.


항목interfacetype
객체 모양 정의가능가능
확장 방식extends 키워드교차 타입(앰퍼샌드 기호)
유니온 타입불가가능
원시값 별칭불가가능(문자열 등에 별명)
선언 병합가능(같은 이름 합쳐짐)불가

같은 객체를 두 방식으로 적으면 이렇게 생겼습니다. 모양만 보면 거의 차이가 없습니다.


타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 이미지 — 기본 문법은 이 다섯 가지만 먼저 익히세요
타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 참고 이미지
interface vs type — 같은 객체를 두 방식으로
// interface 방식 interface User { id: number name: string } // type 방식 type UserAlias = { id: number name: string } // type만 할 수 있는 것 — 유니온 type Status = "draft" | "published" | "archived" // type만 할 수 있는 것 — 원시값 별칭 type PostId = number

제가 실제로 적용하는 기준은 단순합니다. 객체나 클래스의 모양을 정의할 때는 interface 를 우선 쓰고, 유니온 타입이나 원시값 별칭처럼 interface 로 못 하는 경우에만 type 을 씁니다. 이렇게 한 줄 기준만 정해 두니 매번 고민하던 시간이 사라졌습니다. interface 를 기본으로 두는 이유는, 나중에 다른 사람이 같은 이름으로 속성을 덧붙이는 선언 병합이 가능해서 라이브러리 타입을 확장하기 편하기 때문입니다. 다만 이건 어디까지나 팀 컨벤션 문제이므로, 프로젝트에서 type 으로 통일했다면 그 규칙을 따르는 게 더 중요합니다.


실측 팁. 저는 게시글 데이터 모양은 interface Post 로, 그 게시글의 상태값은 type Status 유니온으로 나눠서 쓰고 있습니다. 처음엔 모든 걸 type 으로만 적었다가, 라이브러리 타입을 확장하려는 순간 extends 가 더 직관적이라 interface 로 옮긴 경험이 있습니다. 둘 중 하나로 우주의 진리를 가리려 하기보다, 프로젝트 안에서 일관된 규칙을 정하는 쪽이 훨씬 실용적이었습니다.


strict 모드, 켜야 할까 끄고 시작할까

tsconfig.json 을 자동 생성하면 strict 항목이 기본으로 true 인데, JS 프로젝트를 처음 옮길 때 이걸 켜 두면 빨간 줄이 수백 개씩 뜨는 경험을 하게 됩니다. 저도 첫 마이그레이션에서 이 광경을 보고 겁을 먹어 strict 를 꺼 버렸는데, 결과적으로는 그게 더 안 좋은 선택이었습니다. strict 가 잡아 주는 오류 상당수가 실제 버그였기 때문입니다. strict 는 여러 세부 옵션을 한 번에 켜는 묶음인데, 그중 입문자가 가장 자주 부딪히는 두 가지가 다음입니다.


  • noImplicitAny: 타입을 안 적은 매개변수를 암묵적으로 any(아무 타입) 로 두지 않고 오류로 처리합니다. 타입을 빼먹지 못하게 강제합니다.
  • strictNullChecks: null 이나 undefined 가 될 수 있는 값을 그냥 쓰지 못하게 막습니다. 화면이 가끔 깨지는 사고의 상당수가 여기서 걸러집니다.

제가 권하는 현실적인 절충안은 이렇습니다. 새 프로젝트라면 처음부터 strict 를 켜고 시작하세요. 코드가 적을 때 규칙을 들이는 게 가장 쉽습니다. 반대로 이미 큰 JS 프로젝트를 옮기는 중이라면, strict 를 한 번에 켜는 대신 아래처럼 세부 옵션을 하나씩 켜며 빨간 줄을 단계적으로 줄여 가는 방식이 덜 고통스럽습니다.


tsconfig.json — 점진 전환용 설정 예시
{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "strict": false, "noImplicitAny": true, "strictNullChecks": true, "esModuleInterop": true, "skipLibCheck": true } }

위 설정은 strict 전체를 끄되, 효과가 가장 큰 두 옵션만 먼저 켠 형태입니다. 이 상태로 빨간 줄을 모두 정리한 다음, 어느 정도 익숙해지면 strict 를 true 로 올리고 나머지 세부 검사를 마저 켜는 순서로 가면 됩니다. skipLibCheck 는 외부 라이브러리 타입 정의의 검사를 건너뛰어 초기 오류를 줄여 주는데, 입문 단계에서는 켜 두는 편이 정신 건강에 좋았습니다. 저는 이 순서로 옮긴 뒤로는 마이그레이션이 더는 무섭지 않게 됐습니다.


타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 이미지 — type과 interface, 도대체 뭘 써야 하나
타입스크립트 입문 가이드 (설치·기본 문법·type vs interface 입문) 관련 참고 이미지

JS 프로젝트를 한 번에 다 바꾸지 마세요

JS만 쓰던 사람이 가장 흔히 저지르는 실수가, 의욕에 넘쳐 전체 파일을 하루 만에 .ts 로 바꾸려는 것입니다. 저도 그랬다가 빨간 줄에 파묻혀 작업을 멈춘 경험이 있습니다. 타입스크립트는 .js 파일과 .ts 파일을 한 프로젝트에서 섞어 쓸 수 있으므로, 점진적으로 옮기는 게 정석입니다. 제가 실제로 따른 순서는 다음과 같습니다.


  1. allowJs 켜기: tsconfig 에 allowJs 를 켜서 기존 .js 파일이 그대로 섞여 동작하게 합니다.
  2. 새 파일부터 .ts 로: 새로 만드는 파일만 .ts 로 작성합니다. 기존 코드는 건드리지 않습니다.
  3. 자주 고치는 파일부터 전환: 손이 자주 가는 핵심 파일을 우선 .ts 로 옮겨 효과를 빨리 봅니다.
  4. any 임시 허용: 당장 타입을 못 정하겠으면 any 로 일단 막아 두고, 나중에 정교하게 좁힙니다.
  5. strict 단계적 강화: 위에서 정리한 대로 세부 옵션을 하나씩 켜며 마무리합니다.

이 순서로 가면 작업이 멈추지 않습니다. 하루에 한두 파일씩만 옮겨도, 손이 자주 가는 파일부터 타입이 붙으니 체감 안정감이 빠르게 올라갔습니다. 한국 1인 개발자라면 시간이 늘 부족하니, 전부 멈추고 마이그레이션에 매달리기보다 평소 작업하면서 건드리는 김에 하나씩 .ts 로 바꾸는 방식이 현실적입니다. 저는 이 방법으로 큰 멈춤 없이 사이트 코드를 옮겼습니다.


비용과 도구, 한국 개발자가 알아둘 점

다행히 타입스크립트 자체는 오픈소스라 설치·사용에 돈이 한 푼도 들지 않습니다. 깃허브(GitHub)에서 누구나 받아 쓸 수 있고, 위에서 정리한 설치·실행 방식 전부 무료입니다. 한국 카드로 따로 결제할 일도, 원화 환산이나 부가세(VAT 10%)를 신경 쓸 일도 없습니다. 편집기로 가장 많이 쓰는 VS Code 역시 무료이고, 타입스크립트 지원이 기본 내장돼 있어 별도 설정이 거의 필요 없습니다.


비용이 생긴다면 그건 타입스크립트가 아니라 곁들여 쓰는 AI 코딩 도구 쪽입니다. 저는 타입 정의를 빠르게 짜거나 빨간 줄 원인을 물어볼 때 클로드 코드(Claude Code)나 커서(Cursor) 같은 도구를 쓰는데, 이쪽은 구독료가 붙습니다. 해외 서비스라 한국 카드로 결제하면 환율과 부가세가 청구서에 반영되니, 결제 직전 공식 페이지에서 최종 금액을 확인하는 편이 좋습니다. 2026년 6월 기준 가격은 자주 바뀌므로 단정하지 않겠습니다. 정리하면, 타입스크립트 본체는 무료이고 비용은 선택적으로 쓰는 AI 도구에서만 발생한다고 보면 됩니다.


참고 자료


타입스크립트를 배우려면 자바스크립트를 먼저 알아야 하나요

네, 자바스크립트 기본기는 먼저 갖추는 편이 훨씬 수월합니다. 타입스크립트는 자바스크립트에 타입이라는 안전장치를 더한 것일 뿐, 변수·함수·반복문 같은 핵심 문법은 자바스크립트와 똑같기 때문입니다. JS의 기본 문법을 모른 채 TS부터 시작하면, 타입 오류와 문법 오류를 구분하지 못해 더 헷갈립니다. JS로 작은 프로그램 몇 개를 만들어 본 뒤 넘어오시길 권합니다.


type과 interface 중 무엇을 써야 하나요

객체나 클래스의 모양을 정의할 때는 둘 중 어느 쪽을 써도 대부분 같은 결과가 나옵니다. 저는 객체 모양은 interface 를 기본으로 쓰고, 유니온 타입이나 원시값 별칭처럼 interface 로 못 하는 경우에만 type 을 씁니다. 가장 중요한 건 프로젝트 안에서 한 가지 규칙으로 일관되게 쓰는 것이지, 절대적으로 옳은 한쪽이 있는 게 아닙니다.


strict 옵션을 켜니 빨간 줄이 너무 많이 떠요

JS 프로젝트를 처음 옮길 때 흔히 겪는 일입니다. strict 를 한 번에 켜는 대신, 효과가 큰 noImplicitAny 와 strictNullChecks 두 옵션만 먼저 켜서 빨간 줄을 단계적으로 줄여 가세요. 그 줄들을 정리한 뒤 익숙해지면 strict 를 true 로 올리는 순서가 덜 고통스럽습니다. 빨간 줄 상당수는 실제로 잠재된 버그라, 끄기보다 하나씩 잡는 편이 결국 이득입니다.


any 타입을 써도 괜찮은가요

any 는 타입 검사를 사실상 꺼 버리는 도피처라, 남발하면 타입스크립트를 쓰는 의미가 사라집니다. 다만 마이그레이션 초기에 당장 타입을 정하기 어려운 곳을 임시로 막아 두는 용도로는 유용합니다. 일단 any 로 막아 두고, 나중에 구체적인 타입으로 좁혀 나가는 식으로 쓰세요. 새 코드에서는 처음부터 any 를 피하고 정확한 타입을 적는 습관을 들이는 게 좋습니다.


.ts 파일을 어떻게 실행하나요

두 가지 방법이 있습니다. 하나는 npx tsc 로 자바스크립트로 변환한 뒤 그 .js 파일을 node 로 실행하는 정석 방식이고, 다른 하나는 npx tsx 처럼 변환 단계 없이 .ts 를 바로 실행해 주는 도구를 쓰는 빠른 방식입니다. 빠른 확인에는 tsx 가 편하고, 실제 배포용 빌드에는 tsc 로 변환한 결과물을 쓰는 식으로 용도를 나누면 됩니다.


기존 자바스크립트 프로젝트를 한 번에 전부 바꿔야 하나요

그러지 않는 게 좋습니다. 타입스크립트는 .js 와 .ts 파일을 한 프로젝트에서 섞어 쓸 수 있어서, allowJs 를 켜고 새 파일이나 자주 고치는 파일부터 점진적으로 옮기는 방식이 정석입니다. 전체를 하루에 다 바꾸려 하면 빨간 줄에 파묻혀 작업이 멈춥니다. 시간이 부족한 1인 개발자라면 평소 작업하며 건드리는 김에 하나씩 전환하는 편이 현실적입니다.


타입스크립트 설치타입스크립트입문가이드(설치기본문법Frontend
EXPLORE / Frontend

이어서 읽어보기

전체 토픽 둘러보기