{"componentChunkName":"component---src-templates-blog-post-js","path":"/javascript/레거시-코드-마이그레이션-6개월-JavaScript에서-TypeScript로-옮기며-배운-것들/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"b0363671-7d32-5a1a-aceb-16c48eb4014b","excerpt":"레거시 코드 마이그레이션 6개월 10만 줄의 JavaScript 코드를 TypeScript로 옮기는 작업을 시작했을 때, 나는 이게 이렇게 어려울 줄 몰랐다. “타입만 추가하면 되지 않을까?”라는 순진한 생각으로 시작했지만, 현실은 달랐다.…","html":"<p><img src=\"/assets/javascript.png\" alt=\"레거시 코드 마이그레이션 6개월\" title=\"레거시 코드 마이그레이션 6개월\"></p>\n<p>10만 줄의 JavaScript 코드를 TypeScript로 옮기는 작업을 시작했을 때, 나는 이게 이렇게 어려울 줄 몰랐다. “타입만 추가하면 되지 않을까?”라는 순진한 생각으로 시작했지만, 현실은 달랐다. 6개월 동안의 고생과 배움, 그리고 결국 성공한 이야기를 기록한다.</p>\n<h2 id=\"시작-typescript-도입-결정\" style=\"position:relative;\"><a href=\"#%EC%8B%9C%EC%9E%91-typescript-%EB%8F%84%EC%9E%85-%EA%B2%B0%EC%A0%95\" aria-label=\"시작 typescript 도입 결정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>시작: TypeScript 도입 결정</h2>\n<h3 id=\"왜-typescript를-선택했나\" style=\"position:relative;\"><a href=\"#%EC%99%9C-typescript%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%96%88%EB%82%98\" aria-label=\"왜 typescript를 선택했나 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>왜 TypeScript를 선택했나</h3>\n<p>2025년 7월, 우리 프로젝트는 10만 줄이 넘는 JavaScript 코드로 구성되어 있었다. 5년간 쌓인 레거시 코드였다. 버그가 자주 발생했고, 특히 타입 관련 에러가 많았다.</p>\n<p>“TypeScript를 도입하면 타입 안정성이 생기고, 버그가 줄어들 거야.” 이렇게 생각하며 TypeScript 도입을 제안했다.</p>\n<h3 id=\"팀-내부의-반대\" style=\"position:relative;\"><a href=\"#%ED%8C%80-%EB%82%B4%EB%B6%80%EC%9D%98-%EB%B0%98%EB%8C%80\" aria-label=\"팀 내부의 반대 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>팀 내부의 반대</h3>\n<p>하지만 팀원들의 반응은 냉랭했다.</p>\n<p>“10만 줄을 다 바꿔야 해?”\n“시간이 너무 오래 걸릴 것 같은데.”\n“지금도 바쁜데 마이그레이션까지?”</p>\n<p>특히 시니어 개발자 한 분이 강하게 반대했다. “레거시 코드를 건드리면 버그가 더 생길 수 있어. 위험하다.”</p>\n<p>하지만 나는 포기하지 않았다. 점진적 마이그레이션 전략을 제안했다. 한 번에 다 바꾸는 게 아니라, 새로 작성하는 코드부터 TypeScript로 작성하고, 기존 코드는 점진적으로 변환하자고.</p>\n<h2 id=\"첫-번째-도전-점진적-마이그레이션-전략\" style=\"position:relative;\"><a href=\"#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%A0%90%EC%A7%84%EC%A0%81-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EC%A0%84%EB%9E%B5\" aria-label=\"첫 번째 도전 점진적 마이그레이션 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>첫 번째 도전: 점진적 마이그레이션 전략</h2>\n<h3 id=\"code-classlanguage-textallowjscode-옵션으로-시작\" style=\"position:relative;\"><a href=\"#code-classlanguage-textallowjscode-%EC%98%B5%EC%85%98%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91\" aria-label=\"code classlanguage textallowjscode 옵션으로 시작 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">allowJs</code> 옵션으로 시작</h3>\n<p>처음에는 <code class=\"language-text\">tsconfig.json</code>에 <code class=\"language-text\">allowJs: true</code>를 설정했다. 이렇게 하면 JavaScript 파일과 TypeScript 파일이 공존할 수 있었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"allowJs\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"checkJs\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"noEmit\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>새로 작성하는 파일부터 <code class=\"language-text\">.ts</code> 확장자로 작성하기 시작했다. 처음 한 달은 순조로웠다. 새로운 기능을 TypeScript로 작성하면서 점점 타입의 이점을 느꼈다.</p>\n<h3 id=\"첫-번째-문제-타입-정의의-부재\" style=\"position:relative;\"><a href=\"#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%AC%B8%EC%A0%9C-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98%EC%9D%98-%EB%B6%80%EC%9E%AC\" aria-label=\"첫 번째 문제 타입 정의의 부재 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>첫 번째 문제: 타입 정의의 부재</h3>\n<p>하지만 문제가 생겼다. 기존 JavaScript 코드를 사용할 때 타입이 없어서 <code class=\"language-text\">any</code>를 남발하게 되었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 기존 JavaScript 함수 사용</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> getUserData <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./legacy.js'</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 타입이 없음</span>\n\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token function\">getUserData</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// any 타입</span>\nuser<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">;</span> <span class=\"token comment\">// 타입 체크가 안 됨</span></code></pre></div>\n<p>이렇게 되면 TypeScript의 장점을 제대로 활용할 수 없었다. 기존 코드에 타입 정의를 추가해야 했다.</p>\n<h2 id=\"두-번째-도전-기존-코드에-타입-추가하기\" style=\"position:relative;\"><a href=\"#%EB%91%90-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EA%B8%B0%EC%A1%B4-%EC%BD%94%EB%93%9C%EC%97%90-%ED%83%80%EC%9E%85-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0\" aria-label=\"두 번째 도전 기존 코드에 타입 추가하기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>두 번째 도전: 기존 코드에 타입 추가하기</h2>\n<h3 id=\"jsdoc으로-시작\" style=\"position:relative;\"><a href=\"#jsdoc%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91\" aria-label=\"jsdoc으로 시작 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JSDoc으로 시작</h3>\n<p>처음에는 JSDoc 주석으로 타입을 추가했다. 기존 코드를 수정하지 않고도 타입 정보를 제공할 수 있었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">/**\n * @param {string} userId\n * @returns {Promise&lt;{id: string, name: string, email: string}>}\n */</span>\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getUserData</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">userId</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>하지만 이 방법도 한계가 있었다. JSDoc은 타입 체크가 약하고, 복잡한 타입을 표현하기 어려웠다.</p>\n<h3 id=\"code-classlanguage-textdtscode-파일-생성\" style=\"position:relative;\"><a href=\"#code-classlanguage-textdtscode-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1\" aria-label=\"code classlanguage textdtscode 파일 생성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">.d.ts</code> 파일 생성</h3>\n<p>그래서 타입 정의 파일(<code class=\"language-text\">.d.ts</code>)을 만들기 시작했다. 기존 JavaScript 파일에 대응하는 타입 정의 파일을 작성했다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// legacy.d.ts</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">declare</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getUserData</span><span class=\"token punctuation\">(</span>userId<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> <span class=\"token builtin\">Promise</span><span class=\"token operator\">&lt;</span><span class=\"token punctuation\">{</span>\n  id<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  name<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n  email<span class=\"token operator\">:</span> <span class=\"token builtin\">string</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>하지만 10만 줄의 코드에 타입 정의를 모두 작성하는 것은 불가능했다. 우선순위를 정해야 했다.</p>\n<h2 id=\"세-번째-도전-우선순위-정하기\" style=\"position:relative;\"><a href=\"#%EC%84%B8-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%EC%A0%95%ED%95%98%EA%B8%B0\" aria-label=\"세 번째 도전 우선순위 정하기 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>세 번째 도전: 우선순위 정하기</h2>\n<h3 id=\"자주-사용되는-코드부터\" style=\"position:relative;\"><a href=\"#%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EC%BD%94%EB%93%9C%EB%B6%80%ED%84%B0\" aria-label=\"자주 사용되는 코드부터 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>자주 사용되는 코드부터</h3>\n<p>우선순위를 정했다:</p>\n<ol>\n<li>공통 유틸리티 함수</li>\n<li>API 호출 함수</li>\n<li>데이터 모델</li>\n<li>비즈니스 로직</li>\n</ol>\n<p>자주 사용되는 코드부터 타입을 추가하기 시작했다. 하지만 이것도 생각보다 시간이 오래 걸렸다.</p>\n<h3 id=\"예상치-못한-문제들\" style=\"position:relative;\"><a href=\"#%EC%98%88%EC%83%81%EC%B9%98-%EB%AA%BB%ED%95%9C-%EB%AC%B8%EC%A0%9C%EB%93%A4\" aria-label=\"예상치 못한 문제들 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>예상치 못한 문제들</h3>\n<p><strong>문제 1: 외부 라이브러리 타입 정의 부재</strong></p>\n<p>일부 오래된 라이브러리는 타입 정의가 없었다. <code class=\"language-text\">@types/</code> 패키지도 없었다. 직접 타입 정의를 작성해야 했다.</p>\n<p><strong>문제 2: 동적 타입의 함정</strong></p>\n<p>JavaScript의 유연함이 문제가 되었다. 객체에 동적으로 프로퍼티를 추가하는 패턴이 많았는데, 이를 TypeScript로 표현하기 어려웠다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// 기존 JavaScript 코드</span>\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\nuser<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">;</span>\nuser<span class=\"token punctuation\">.</span>age <span class=\"token operator\">=</span> <span class=\"token number\">30</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>이런 패턴을 TypeScript로 바꾸려면 인터페이스를 정의해야 했다.</p>\n<p><strong>문제 3: <code class=\"language-text\">any</code> 타입의 남용</strong></p>\n<p>처음에는 빠르게 진행하기 위해 <code class=\"language-text\">any</code>를 많이 사용했다. 하지만 나중에 문제가 되었다. <code class=\"language-text\">any</code>를 사용하면 TypeScript의 장점을 잃게 된다.</p>\n<h2 id=\"네-번째-도전-팀원들의-저항\" style=\"position:relative;\"><a href=\"#%EB%84%A4-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%98-%EC%A0%80%ED%95%AD\" aria-label=\"네 번째 도전 팀원들의 저항 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>네 번째 도전: 팀원들의 저항</h2>\n<h3 id=\"타입-정의-작성의-부담\" style=\"position:relative;\"><a href=\"#%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98-%EC%9E%91%EC%84%B1%EC%9D%98-%EB%B6%80%EB%8B%B4\" aria-label=\"타입 정의 작성의 부담 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>타입 정의 작성의 부담</h3>\n<p>3개월이 지나면서 팀원들의 불만이 커졌다. 타입 정의를 작성하는 것이 부담이 되었다.</p>\n<p>“이전에는 그냥 코드만 작성하면 됐는데, 이제는 타입도 써야 해.”\n“타입 에러 때문에 개발 속도가 느려졌어.”</p>\n<p>특히 주니어 개발자들이 힘들어했다. TypeScript 문법을 익히는 것도 어려웠고, 타입을 제대로 정의하는 것도 어려웠다.</p>\n<h3 id=\"내-고민\" style=\"position:relative;\"><a href=\"#%EB%82%B4-%EA%B3%A0%EB%AF%BC\" aria-label=\"내 고민 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>내 고민</h3>\n<p>나도 고민이 많았다. 분명히 좋은 선택이라고 생각했는데, 팀원들의 불만을 보면서 “내가 잘못 선택한 건가?”라는 생각이 들었다.</p>\n<p>하지만 이미 3개월을 투자했고, 되돌리기엔 너무 많은 작업이 필요했다. 그래도 계속 밀어붙였지만, 상황은 나아지지 않았다.</p>\n<h2 id=\"전환점-타입의-이점을-보기-시작하다\" style=\"position:relative;\"><a href=\"#%EC%A0%84%ED%99%98%EC%A0%90-%ED%83%80%EC%9E%85%EC%9D%98-%EC%9D%B4%EC%A0%90%EC%9D%84-%EB%B3%B4%EA%B8%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4\" aria-label=\"전환점 타입의 이점을 보기 시작하다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>전환점: 타입의 이점을 보기 시작하다</h2>\n<h3 id=\"버그-감소\" style=\"position:relative;\"><a href=\"#%EB%B2%84%EA%B7%B8-%EA%B0%90%EC%86%8C\" aria-label=\"버그 감소 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>버그 감소</h3>\n<p>4개월이 지나면서 타입의 이점이 보이기 시작했다. 타입 체크로 인해 런타임 에러가 줄어들었다.</p>\n<p><strong>이전:</strong></p>\n<ul>\n<li>주간 버그 리포트: 평균 15개</li>\n<li>타입 관련 에러: 평균 5개</li>\n</ul>\n<p><strong>4개월 후:</strong></p>\n<ul>\n<li>주간 버그 리포트: 평균 10개</li>\n<li>타입 관련 에러: 평균 1개</li>\n</ul>\n<p>특히 <code class=\"language-text\">null</code>이나 <code class=\"language-text\">undefined</code> 관련 에러가 크게 줄었다. TypeScript가 이런 문제를 컴파일 타임에 잡아줬다.</p>\n<h3 id=\"개발-경험-개선\" style=\"position:relative;\"><a href=\"#%EA%B0%9C%EB%B0%9C-%EA%B2%BD%ED%97%98-%EA%B0%9C%EC%84%A0\" aria-label=\"개발 경험 개선 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>개발 경험 개선</h3>\n<p>IDE의 자동 완성도 훨씬 좋아졌다. 타입 정보가 있어서 함수의 파라미터와 반환값을 정확히 알 수 있었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"typescript\"><pre class=\"language-typescript\"><code class=\"language-typescript\"><span class=\"token comment\">// 타입이 있을 때</span>\n<span class=\"token keyword\">const</span> user <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getUserData</span><span class=\"token punctuation\">(</span>userId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nuser<span class=\"token punctuation\">.</span> <span class=\"token comment\">// 자동 완성으로 name, email 등이 제안됨</span></code></pre></div>\n<h3 id=\"리팩토링의-안정성\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%98-%EC%95%88%EC%A0%95%EC%84%B1\" aria-label=\"리팩토링의 안정성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리팩토링의 안정성</h3>\n<p>리팩토링할 때도 자신감이 생겼다. 타입 체크가 있어서 실수를 미리 잡을 수 있었다.</p>\n<h2 id=\"다섯-번째-도전-완전한-마이그레이션\" style=\"position:relative;\"><a href=\"#%EB%8B%A4%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%99%84%EC%A0%84%ED%95%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98\" aria-label=\"다섯 번째 도전 완전한 마이그레이션 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>다섯 번째 도전: 완전한 마이그레이션</h2>\n<h3 id=\"마지막-javascript-파일들\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%A7%80%EB%A7%89-javascript-%ED%8C%8C%EC%9D%BC%EB%93%A4\" aria-label=\"마지막 javascript 파일들 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마지막 JavaScript 파일들</h3>\n<p>5개월이 지나면서 대부분의 코드가 TypeScript로 변환되었다. 하지만 아직도 약 2만 줄의 JavaScript 코드가 남아있었다.</p>\n<p>이 코드들은 가장 복잡하고 위험한 부분이었다. 건드리기 두려운 레거시 코드였다.</p>\n<h3 id=\"code-classlanguage-textstrictcode-모드-활성화\" style=\"position:relative;\"><a href=\"#code-classlanguage-textstrictcode-%EB%AA%A8%EB%93%9C-%ED%99%9C%EC%84%B1%ED%99%94\" aria-label=\"code classlanguage textstrictcode 모드 활성화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">strict</code> 모드 활성화</h3>\n<p>대부분의 코드가 TypeScript로 변환되자, <code class=\"language-text\">strict</code> 모드를 활성화했다. 이제 타입 체크가 더 엄격해졌다.</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"strict\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"noImplicitAny\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"strictNullChecks\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>당연히 에러가 많이 발생했다. 하지만 이 에러들을 하나씩 수정하면서 코드 품질이 향상되었다.</p>\n<h2 id=\"여섯-번째-달-마무리와-성찰\" style=\"position:relative;\"><a href=\"#%EC%97%AC%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%8B%AC-%EB%A7%88%EB%AC%B4%EB%A6%AC%EC%99%80-%EC%84%B1%EC%B0%B0\" aria-label=\"여섯 번째 달 마무리와 성찰 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>여섯 번째 달: 마무리와 성찰</h2>\n<h3 id=\"마지막-javascript-파일-변환\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%A7%80%EB%A7%89-javascript-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98\" aria-label=\"마지막 javascript 파일 변환 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마지막 JavaScript 파일 변환</h3>\n<p>6개월째, 마지막 JavaScript 파일들을 TypeScript로 변환했다. 가장 어려운 부분이었다. 복잡한 비즈니스 로직과 레거시 패턴들이 얽혀있었다.</p>\n<p>하지만 끝까지 포기하지 않았다. 하나씩 타입을 추가하고, 리팩토링하고, 테스트했다.</p>\n<h3 id=\"마이그레이션-완료\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EC%99%84%EB%A3%8C\" aria-label=\"마이그레이션 완료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마이그레이션 완료</h3>\n<p>2025년 12월, 드디어 마이그레이션이 완료되었다. 10만 줄의 JavaScript 코드가 모두 TypeScript로 변환되었다.</p>\n<p><strong>결과:</strong></p>\n<ul>\n<li>타입 커버리지: 95%</li>\n<li>버그 감소: 30%</li>\n<li>개발 속도: 초기에는 느려졌지만, 3개월 후에는 오히려 빨라짐</li>\n<li>코드 품질: 크게 향상</li>\n</ul>\n<h2 id=\"배운-점들\" style=\"position:relative;\"><a href=\"#%EB%B0%B0%EC%9A%B4-%EC%A0%90%EB%93%A4\" aria-label=\"배운 점들 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>배운 점들</h2>\n<h3 id=\"1-점진적-마이그레이션이-중요하다\" style=\"position:relative;\"><a href=\"#1-%EC%A0%90%EC%A7%84%EC%A0%81-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%B4-%EC%A4%91%EC%9A%94%ED%95%98%EB%8B%A4\" aria-label=\"1 점진적 마이그레이션이 중요하다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 점진적 마이그레이션이 중요하다</h3>\n<p>한 번에 모든 것을 바꾸려고 하지 말고, 점진적으로 진행하는 것이 중요하다. <code class=\"language-text\">allowJs</code> 옵션을 사용해서 JavaScript와 TypeScript가 공존할 수 있게 한 것이 핵심이었다.</p>\n<h3 id=\"2-팀원들의-이해와-협력이-필수다\" style=\"position:relative;\"><a href=\"#2-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%98-%EC%9D%B4%ED%95%B4%EC%99%80-%ED%98%91%EB%A0%A5%EC%9D%B4-%ED%95%84%EC%88%98%EB%8B%A4\" aria-label=\"2 팀원들의 이해와 협력이 필수다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 팀원들의 이해와 협력이 필수다</h3>\n<p>마이그레이션은 혼자서 할 수 있는 작업이 아니다. 팀원들의 이해와 협력이 필수다. 초기 반대가 있었지만, 타입의 이점을 보여주면서 점차 동의를 얻을 수 있었다.</p>\n<h3 id=\"3-타입-정의-작성에-시간을-투자하라\" style=\"position:relative;\"><a href=\"#3-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98-%EC%9E%91%EC%84%B1%EC%97%90-%EC%8B%9C%EA%B0%84%EC%9D%84-%ED%88%AC%EC%9E%90%ED%95%98%EB%9D%BC\" aria-label=\"3 타입 정의 작성에 시간을 투자하라 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 타입 정의 작성에 시간을 투자하라</h3>\n<p>타입 정의를 제대로 작성하는 것이 중요하다. 처음에는 빠르게 진행하기 위해 <code class=\"language-text\">any</code>를 많이 사용했지만, 나중에 문제가 되었다. 처음부터 제대로 작성하는 것이 장기적으로는 더 빠르다.</p>\n<h3 id=\"4-실용적인-접근이-필요하다\" style=\"position:relative;\"><a href=\"#4-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%EC%A0%91%EA%B7%BC%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4\" aria-label=\"4 실용적인 접근이 필요하다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 실용적인 접근이 필요하다</h3>\n<p>완벽한 타입 정의를 만들려고 하지 말고, 실용적인 접근이 필요하다. 100% 타입 안전성을 추구하기보다는, 80%의 타입 안전성으로도 충분히 이점을 얻을 수 있다.</p>\n<h3 id=\"5-인내심이-필요하다\" style=\"position:relative;\"><a href=\"#5-%EC%9D%B8%EB%82%B4%EC%8B%AC%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4\" aria-label=\"5 인내심이 필요하다 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. 인내심이 필요하다</h3>\n<p>마이그레이션은 시간이 오래 걸린다. 6개월이라는 시간이 걸렸지만, 그만한 가치가 있었다. 인내심을 가지고 꾸준히 진행하는 것이 중요하다.</p>\n<h2 id=\"현재-상태와-앞으로\" style=\"position:relative;\"><a href=\"#%ED%98%84%EC%9E%AC-%EC%83%81%ED%83%9C%EC%99%80-%EC%95%9E%EC%9C%BC%EB%A1%9C\" aria-label=\"현재 상태와 앞으로 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>현재 상태와 앞으로</h2>\n<h3 id=\"typescript로의-완전한-전환\" style=\"position:relative;\"><a href=\"#typescript%EB%A1%9C%EC%9D%98-%EC%99%84%EC%A0%84%ED%95%9C-%EC%A0%84%ED%99%98\" aria-label=\"typescript로의 완전한 전환 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript로의 완전한 전환</h3>\n<p>지금은 모든 새 코드를 TypeScript로 작성하고 있다. 팀원들도 TypeScript에 익숙해졌고, 타입의 이점을 체감하고 있다.</p>\n<h3 id=\"지속적인-개선\" style=\"position:relative;\"><a href=\"#%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%EA%B0%9C%EC%84%A0\" aria-label=\"지속적인 개선 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>지속적인 개선</h3>\n<p>마이그레이션이 완료되었지만, 여전히 개선할 점이 많다. <code class=\"language-text\">any</code> 타입을 줄이고, 더 엄격한 타입을 사용하고, 타입 유틸리티를 활용하는 등 지속적으로 개선하고 있다.</p>\n<h2 id=\"다른-개발자들에게\" style=\"position:relative;\"><a href=\"#%EB%8B%A4%EB%A5%B8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%97%90%EA%B2%8C\" aria-label=\"다른 개발자들에게 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>다른 개발자들에게</h2>\n<h3 id=\"typescript-마이그레이션을-고려한다면\" style=\"position:relative;\"><a href=\"#typescript-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84-%EA%B3%A0%EB%A0%A4%ED%95%9C%EB%8B%A4%EB%A9%B4\" aria-label=\"typescript 마이그레이션을 고려한다면 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TypeScript 마이그레이션을 고려한다면</h3>\n<p>레거시 코드를 TypeScript로 마이그레이션하려는 팀이 있다면, 다음을 고려해보길 바란다:</p>\n<ol>\n<li><strong>점진적 접근</strong>: 한 번에 다 바꾸지 말고 점진적으로 진행하라</li>\n<li><strong>팀원들의 이해</strong>: 타입의 이점을 보여주고 팀원들의 동의를 얻어라</li>\n<li><strong>우선순위 정하기</strong>: 자주 사용되는 코드부터 타입을 추가하라</li>\n<li><strong>인내심</strong>: 마이그레이션은 시간이 오래 걸린다. 인내심을 가져라</li>\n<li><strong>실용적 접근</strong>: 완벽을 추구하지 말고 실용적으로 접근하라</li>\n</ol>\n<h3 id=\"실패를-두려워하지-말라\" style=\"position:relative;\"><a href=\"#%EC%8B%A4%ED%8C%A8%EB%A5%BC-%EB%91%90%EB%A0%A4%EC%9B%8C%ED%95%98%EC%A7%80-%EB%A7%90%EB%9D%BC\" aria-label=\"실패를 두려워하지 말라 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>실패를 두려워하지 말라</h3>\n<p>우리의 경험이 다른 팀에게는 도움이 될 수 있다. 마이그레이션은 어렵지만, 그만한 가치가 있다. 타입 안정성, 버그 감소, 개발 경험 개선 등 많은 이점을 얻을 수 있다.</p>\n<h2 id=\"결론-6개월의-여정\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EB%A1%A0-6%EA%B0%9C%EC%9B%94%EC%9D%98-%EC%97%AC%EC%A0%95\" aria-label=\"결론 6개월의 여정 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결론: 6개월의 여정</h2>\n<p>6개월 동안의 마이그레이션은 쉽지 않았다. 팀원들의 반대, 예상치 못한 문제들, 타입 정의 작성의 부담까지. 하지만 결국 성공했고, 그 과정에서 많은 것을 배웠다.</p>\n<p>지금은 TypeScript로 모든 코드를 작성하고 있다. 타입의 이점을 매일 느끼고 있다. 버그가 줄어들고, 개발 경험이 좋아지고, 코드 품질이 향상되었다.</p>\n<p>마이그레이션은 투자다. 시간과 노력을 투자하면, 그만한 가치를 얻을 수 있다. 다른 개발자들도 이 경험이 도움이 되기를 바란다.</p>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%8B%9C%EC%9E%91-typescript-%EB%8F%84%EC%9E%85-%EA%B2%B0%EC%A0%95\">시작: TypeScript 도입 결정</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%99%9C-typescript%EB%A5%BC-%EC%84%A0%ED%83%9D%ED%96%88%EB%82%98\">왜 TypeScript를 선택했나</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%ED%8C%80-%EB%82%B4%EB%B6%80%EC%9D%98-%EB%B0%98%EB%8C%80\">팀 내부의 반대</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%A0%90%EC%A7%84%EC%A0%81-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EC%A0%84%EB%9E%B5\">첫 번째 도전: 점진적 마이그레이션 전략</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#code-classlanguage-textallowjscode-%EC%98%B5%EC%85%98%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91\"><code class=\"language-text\">allowJs</code> 옵션으로 시작</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EB%AC%B8%EC%A0%9C-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98%EC%9D%98-%EB%B6%80%EC%9E%AC\">첫 번째 문제: 타입 정의의 부재</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%91%90-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EA%B8%B0%EC%A1%B4-%EC%BD%94%EB%93%9C%EC%97%90-%ED%83%80%EC%9E%85-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0\">두 번째 도전: 기존 코드에 타입 추가하기</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#jsdoc%EC%9C%BC%EB%A1%9C-%EC%8B%9C%EC%9E%91\">JSDoc으로 시작</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#code-classlanguage-textdtscode-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1\"><code class=\"language-text\">.d.ts</code> 파일 생성</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%84%B8-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%EC%A0%95%ED%95%98%EA%B8%B0\">세 번째 도전: 우선순위 정하기</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EC%BD%94%EB%93%9C%EB%B6%80%ED%84%B0\">자주 사용되는 코드부터</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%98%88%EC%83%81%EC%B9%98-%EB%AA%BB%ED%95%9C-%EB%AC%B8%EC%A0%9C%EB%93%A4\">예상치 못한 문제들</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%84%A4-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%98-%EC%A0%80%ED%95%AD\">네 번째 도전: 팀원들의 저항</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98-%EC%9E%91%EC%84%B1%EC%9D%98-%EB%B6%80%EB%8B%B4\">타입 정의 작성의 부담</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%82%B4-%EA%B3%A0%EB%AF%BC\">내 고민</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%A0%84%ED%99%98%EC%A0%90-%ED%83%80%EC%9E%85%EC%9D%98-%EC%9D%B4%EC%A0%90%EC%9D%84-%EB%B3%B4%EA%B8%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4\">전환점: 타입의 이점을 보기 시작하다</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%B2%84%EA%B7%B8-%EA%B0%90%EC%86%8C\">버그 감소</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EA%B0%9C%EB%B0%9C-%EA%B2%BD%ED%97%98-%EA%B0%9C%EC%84%A0\">개발 경험 개선</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%98-%EC%95%88%EC%A0%95%EC%84%B1\">리팩토링의 안정성</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%8B%A4%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%8F%84%EC%A0%84-%EC%99%84%EC%A0%84%ED%95%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98\">다섯 번째 도전: 완전한 마이그레이션</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%A7%88%EC%A7%80%EB%A7%89-javascript-%ED%8C%8C%EC%9D%BC%EB%93%A4\">마지막 JavaScript 파일들</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#code-classlanguage-textstrictcode-%EB%AA%A8%EB%93%9C-%ED%99%9C%EC%84%B1%ED%99%94\"><code class=\"language-text\">strict</code> 모드 활성화</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%97%AC%EC%84%AF-%EB%B2%88%EC%A7%B8-%EB%8B%AC-%EB%A7%88%EB%AC%B4%EB%A6%AC%EC%99%80-%EC%84%B1%EC%B0%B0\">여섯 번째 달: 마무리와 성찰</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%A7%88%EC%A7%80%EB%A7%89-javascript-%ED%8C%8C%EC%9D%BC-%EB%B3%80%ED%99%98\">마지막 JavaScript 파일 변환</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EC%99%84%EB%A3%8C\">마이그레이션 완료</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%B0%B0%EC%9A%B4-%EC%A0%90%EB%93%A4\">배운 점들</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#1-%EC%A0%90%EC%A7%84%EC%A0%81-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%B4-%EC%A4%91%EC%9A%94%ED%95%98%EB%8B%A4\">1. 점진적 마이그레이션이 중요하다</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#2-%ED%8C%80%EC%9B%90%EB%93%A4%EC%9D%98-%EC%9D%B4%ED%95%B4%EC%99%80-%ED%98%91%EB%A0%A5%EC%9D%B4-%ED%95%84%EC%88%98%EB%8B%A4\">2. 팀원들의 이해와 협력이 필수다</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#3-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98-%EC%9E%91%EC%84%B1%EC%97%90-%EC%8B%9C%EA%B0%84%EC%9D%84-%ED%88%AC%EC%9E%90%ED%95%98%EB%9D%BC\">3. 타입 정의 작성에 시간을 투자하라</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#4-%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%EC%A0%91%EA%B7%BC%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4\">4. 실용적인 접근이 필요하다</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#5-%EC%9D%B8%EB%82%B4%EC%8B%AC%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4\">5. 인내심이 필요하다</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%ED%98%84%EC%9E%AC-%EC%83%81%ED%83%9C%EC%99%80-%EC%95%9E%EC%9C%BC%EB%A1%9C\">현재 상태와 앞으로</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#typescript%EB%A1%9C%EC%9D%98-%EC%99%84%EC%A0%84%ED%95%9C-%EC%A0%84%ED%99%98\">TypeScript로의 완전한 전환</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%A7%80%EC%86%8D%EC%A0%81%EC%9D%B8-%EA%B0%9C%EC%84%A0\">지속적인 개선</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EB%8B%A4%EB%A5%B8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%97%90%EA%B2%8C\">다른 개발자들에게</a></p>\n<ul>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#typescript-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98%EC%9D%84-%EA%B3%A0%EB%A0%A4%ED%95%9C%EB%8B%A4%EB%A9%B4\">TypeScript 마이그레이션을 고려한다면</a></li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EC%8B%A4%ED%8C%A8%EB%A5%BC-%EB%91%90%EB%A0%A4%EC%9B%8C%ED%95%98%EC%A7%80-%EB%A7%90%EB%9D%BC\">실패를 두려워하지 말라</a></li>\n</ul>\n</li>\n<li><a href=\"/javascript/%EB%A0%88%EA%B1%B0%EC%8B%9C-%EC%BD%94%EB%93%9C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-6%EA%B0%9C%EC%9B%94-JavaScript%EC%97%90%EC%84%9C-TypeScript%EB%A1%9C-%EC%98%AE%EA%B8%B0%EB%A9%B0-%EB%B0%B0%EC%9A%B4-%EA%B2%83%EB%93%A4/#%EA%B2%B0%EB%A1%A0-6%EA%B0%9C%EC%9B%94%EC%9D%98-%EC%97%AC%EC%A0%95\">결론: 6개월의 여정</a></li>\n</ul>","wordCount":{"words":988},"fields":{"slug":"/javascript/레거시-코드-마이그레이션-6개월-JavaScript에서-TypeScript로-옮기며-배운-것들/","image":null,"faq":[]},"frontmatter":{"title":"레거시 코드 마이그레이션 6개월 - JavaScript에서 TypeScript로 옮기며 배운 것들","date":"2026년 1월 5일","dateISO":"2026-01-05T06:15:00.000Z","updatedISO":null,"category":"javascript","description":"10만 줄의 JavaScript 코드베이스를 TypeScript로 마이그레이션한 6개월의 여정을 기록한다. 팀 내부 반대, 점진적 마이그레이션 전략, 예상치 못한 문제들, 그리고 결국 성공한 과정을 솔직하게 공유한다.","tags":["TypeScript","마이그레이션","레거시 코드","프로젝트 경험","개발자 경험","회고","JavaScript"]}}},"pageContext":{"slug":"/javascript/레거시-코드-마이그레이션-6개월-JavaScript에서-TypeScript로-옮기며-배운-것들/","previous":{"fields":{"slug":"/etc/모노레포-도입-실패기-Turborepo로-옮기다가-겪은-문제들/"},"frontmatter":{"title":"모노레포 도입 실패기 - Turborepo로 옮기다가 겪은 문제들","tags":["모노레포","Turborepo","실패 경험","프로젝트 경험","개발자 경험","회고","교훈"]}},"next":{"fields":{"slug":"/etc/서버리스로-옮겼다가-다시-돌아온-이야기-Lambda-Cold-Start의-현실/"},"frontmatter":{"title":"서버리스로 옮겼다가 다시 돌아온 이야기 - Lambda Cold Start의 현실","tags":["Serverless","AWS Lambda","실패 경험","프로젝트 경험","개발자 경험","회고","Cold Start"]}}}},"staticQueryHashes":["213619243","3262363727"]}