2024.06 ~
소개
GraphQL 쿼리·뮤테이션을 VSCode 안에서 바로 테스트할 수 있는 확장 프로그램입니다. 멀티 환경 전환, URL 기반 스키마 로드, Fragment 인라이닝 등 GraphQL 개발에 필요한 기능을 에디터 내에서 완결합니다.
GraphQL API를 개발하다 보면 쿼리·뮤테이션을 빠르게 테스트해야 하는 상황이 반복됩니다. Postman이나 Insomnia 같은 외부 도구로 컨텍스트를 전환하거나, 프로젝트마다 별도로 환경 설정을 반복하는 비효율이 불편했습니다.
그래서 VSCode 안에서 GraphQL 파일을 열고 버튼 하나로 쿼리를 전송하고, 환경(dev·staging·prod)을 전환하며, Fragment를 인라이닝하는 확장 프로그램을 직접 만들었습니다. 2024년 6월 초기 릴리스 이후 스키마 로드, Fragment 병합, 스타터팩 등을 단계적으로 추가해 v0.3.3까지 발전시켰습니다.
graph-man
├── src/
│ ├── commands/ — 커맨드 팔레트 명령 구현
│ │ ├── send-graphql.ts — GraphQL 전송
│ │ ├── merge-fragments-into-query.ts — Fragment 인라이닝
│ │ ├── load-schema.ts — URL로부터 스키마 로드
│ │ ├── create-config-file.ts — 설정 파일 생성
│ │ ├── create-example-graphql-file.ts
│ │ └── create-starter-pack.ts
│ ├── views/
│ │ ├── environmentTree.ts — 환경 목록 TreeView
│ │ └── graphqlsTree.ts — GraphQL 파일 목록 TreeView
│ ├── lib/
│ │ ├── fp/ — Either / Option 모나드
│ │ └── gql/ — GraphQL 요청 유틸
│ ├── utils/
│ │ ├── config.ts — config.json 파서
│ │ └── file.ts — 파일 I/O 유틸
│ └── constants/ — 경로·시스템 상수
└── .graph-man/
├── config.json — 환경별 URL·헤더 설정
└── **/*.graphql — 저장된 쿼리·뮤테이션 파일.graph-man/config.json에 환경별 URL과 헤더를 정의하면 사이드바 TreeView에서 클릭 한 번으로 활성 환경을 전환할 수 있습니다.
{
"environment": {
"local": { "url": "http://localhost:4000/graphql", "headers": {} },
"staging": { "url": "https://staging.example.com/graphql",
"headers": { "Authorization": "Bearer <token>" } }
}
}선택된 환경은 vscode.ExtensionContext.globalState에 유지되어 VSCode를 재시작해도 보존됩니다.
.graph-man/ 하위의 .graphql / .gql 파일을 열면 에디터 상단 툴바에 전송 버튼이 나타납니다. 버튼을 누르면 현재 파일의 내용을 활성 환경의 엔드포인트로 전송하고, Output 채널에 응답 JSON을 포맷팅해서 출력합니다.
GraphQL 스키마를 URL에서 로드한 뒤, graphql 라이브러리의 AST API로 현재 파일의 모든 Fragment를 인라인 Fragment로 전개합니다.
@skip, @include 등 디렉티브가 있는 필드는 인라이닝 대상에서 제외해 의미 변경을 방지합니다.에러 처리에 Either 모나드, 값의 존재 여부에 Option 모나드를 직접 구현해 사용했습니다. ts-pattern으로 태그 유니온을 exhaustive하게 매칭해 런타임 누락 케이스를 컴파일 타임에 방지합니다.
match(config)
.with(E.LEFT, ({ value: errorMessage }) => {
vscode.window.showErrorMessage(errorMessage);
})
.with({ ...E.RIGHT, value: { environment: P.when(/* ... */) } },
({ value: { environment } }) => { /* 전송 로직 */ })
.otherwise(() => vscode.window.showErrorMessage("Environment not found"));graphql 라이브러리로 Fragment 인라이닝, 중복 제거, 타입 조건 처리 구현ts-pattern 기반 exhaustive 패턴 매칭 도입vscode:prepublish 훅으로 게시 자동화@vscode/test-cli 통합 테스트| 구분 | 기술 |
|---|---|
| 플랫폼 | VSCode Extension API |
| 언어 | TypeScript |
| GraphQL 처리 | graphql (AST parse · visit · print) |
| 패턴 매칭 | ts-pattern |
| 번들러 | esbuild |
| 코드 품질 | Biome |
| 테스트 | Vitest, @vscode/test-cli |
| 패키지 매니저 | Bun |
| 배포 | VS Code Marketplace (vsce) |
try-catch 없는 에러 전파로 호출 체인을 선언적으로 표현vscode:prepublish 단계 최소화0.0.1)