0Pricing
TypeScript Academy · 강의

사용자 정의 변환기 및 코드 생성

AST를 수정하는 컴파일러 변환을 작성합니다.

사용자 정의 변환기 및 코드 생성은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

변환기란 무엇입니까?

TypeScript 변환기는 AST 노드를 받아 (수정되었을 수도 있는) 노드를 반환하는 함수입니다. 컴파일 중에 실행되어 사용자 지정 출력을 생성합니다.

import ts from "typescript";
type Transformer = ts.TransformerFactory<ts.SourceFile>;

변환기 팩토리 형태

변환기 팩토리는 TransformationContext를 받아 SourceFile 노드를 변환하는 함수를 반환합니다.

const myTransformer: ts.TransformerFactory<ts.SourceFile> =
  (ctx) => (sf) => {
    function visit(node: ts.Node): ts.Node {
      // Modify node here
      return ts.visitEachChild(node, visit, ctx);
    }
    return ts.visitNode(sf, visit) as ts.SourceFile;
  };

컨텍스트를 사용한 방문

ts.visitEachChild는 (forEachChild가 아니라) 변환기 내부에서 사용합니다. 수정된 노드를 올바르게 재구성하기 때문입니다.

function visit(node: ts.Node): ts.Node {
  if (ts.isStringLiteral(node)) {
    return ts.factory.createStringLiteral(node.text.toUpperCase());
  }
  return ts.visitEachChild(node, visit, ctx);
}

ts.factory를 사용하여 새 노드 만들기

ts.factory 객체는 모든 종류의 AST 노드를 생성하는 메서드를 제공합니다.

const newCall = ts.factory.createCallExpression(
  ts.factory.createIdentifier("console.log"),
  undefined,
  [ts.factory.createStringLiteral("hello")]
);

프로그램에 변환기 적용하기

customTransformers 옵션을 통해 변환기를 program.emit에 전달합니다.

program.emit(undefined, undefined, undefined, false, {
  before: [myTransformer],
});

코드 생성: 노드 출력하기

전체 컴파일러를 실행하지 않고 AST 노드를 소스 코드 문자열로 다시 변환하려면 ts.createPrinter를 사용합니다.

const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
const result = printer.printNode(
  ts.EmitHint.Unspecified,
  newCall,
  sf
);
console.log(result); // console.log("hello")

전체 소스 파일 생성하기

ts.factory.createSourceFile을 사용하거나 문 노드 목록을 조합하여 처음부터 완전한 소스 파일을 만들 수 있습니다.

const statements = [
  ts.factory.createExpressionStatement(
    ts.factory.createCallExpression(
      ts.factory.createIdentifier("console.log"),
      undefined,
      [ts.factory.createStringLiteral("generated!")]
    )
  ),
];

가져오기 변환하기

가져오기 경로를 변환하는 것은 일반적인 사용 사례입니다. 예를 들어 출력 시점에 별칭이 지정된 경로를 상대 경로로 다시 작성할 수 있습니다.

if (ts.isImportDeclaration(node)) {
  const spec = node.moduleSpecifier as ts.StringLiteral;
  if (spec.text.startsWith("@app/")) {
    return ts.factory.updateImportDeclaration(
      node, node.modifiers, node.importClause,
      ts.factory.createStringLiteral(spec.text.replace("@app/", "../")),
      node.assertClause
    );
  }
}

변환기 테스트하기

변환기를 작은 소스 파일에 적용하고 출력된 결과가 예상 문자열과 일치하는지 단언하여 테스트합니다.

const result = ts.transpileModule("const x = 'hello';", {
  compilerOptions: { target: ts.ScriptTarget.ES2020 },
  transformers: { before: [myTransformer] },
});
console.log(result.outputText);

플러그인 시스템

일부 빌드 도구(예: ttypescript / ts-patch)를 사용하면 TypeScript 설정에 변환기를 플러그인으로 등록할 수 있어 개발 작업 흐름에서 변환기가 보이지 않게 작동합니다.

// tsconfig.json with ts-patch:
// "plugins": [{ "transform": "./my-transformer.js" }]

요약: 사용자 지정 변환기

변환기를 사용하면 컴파일 중에 AST 수준에서 TypeScript 코드를 다시 작성할 수 있습니다. 재귀적 순회에는 ts.visitEachChild를, 노드 생성에는 ts.factory를, 소스 텍스트 생성에는 ts.createPrinter를 사용합니다.

빠른 확인

변환기에서 새 AST 노드를 만들 때 사용하는 객체는 무엇입니까?

학습 내용

사용자 지정 변환기는 컴파일 시 TypeScript AST를 수정합니다. 재귀에는 ts.visitEachChild를, 새 노드 생성에는 ts.factory를, 적용에는 customTransformers와 함께 program.emit을 사용합니다.

자주 묻는 질문

“사용자 정의 변환기 및 코드 생성” 강의는 무료인가요?

네 — “사용자 정의 변환기 및 코드 생성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“사용자 정의 변환기 및 코드 생성”에서 뭘 배우나요?

AST를 수정하는 컴파일러 변환을 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“사용자 정의 변환기 및 코드 생성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. API로 TypeScript 프로그램 만들기
  2. 방문자로 AST 순회하기
  3. 사용자 정의 변환기 및 코드 생성
  4. 간단한 린팅 도구 만들기
← TypeScript Academy(으)로 돌아가기