Project
GDShader 플러그인 개발 후기

- JetBrians Marketplace: https://plugins.jetbrains.com/plugin/27949-gdshader
Godot 엔진으로 게임을 개발하면서 Rider를 에디터로 사용하고 있는데, Rider에는 GDShader 파일 편집에 대한 공식 지원이 없다. GDShader는 GLSL과 거의 같은 문법의 셰이딩 언어인데, GLSL 관련 자료들이 충분히 있으니 내가 직접 플러그인을 만들 수 있지 않을까 싶어서 도전해봤다.
개발 과정
개발은 IntelliJ IDEA에서 코틀린으로 했다. JetBrains에서 제공하는 커스텀 언어 플러그인 튜토리얼이 있어서 많은 부분을 참고할 수 있었다. 다만 튜토리얼이 자바로 되어있기도 하고, 몇몇 부분들은 최신 정보가 아니어서 IntelliJ API 코드를 직접 찾아봐야 하는 경우도 있었다.
파서와 렉서는 JetBrains의 Grammar-Kit을 이용해서 BNF, FLEX 문법으로 자동생성했다. 아마 GDShader의 문법은 이 방식으로 완전히 표현할 수 있는 것 같다. 다만 에디터의 특성상 전처리기는 구현이 불가능했다. PSI 트리 방식이 전처리기를 처리하기 매우 어려운 구조이기 때문인데, CLion에서 C/C++ 전처리기가 처리되는 방식을 살펴보니 PSI 트리는 거의 더미 노드로 채워지고 내부적으로 PSI 트리를 무시한 파싱을 하는 것 같았다. 전처리기를 지원하지 못하는 건 아쉬운 부분이지만, 파서와 렉서를 직접 만든다고 해도 구현하기는 거의 불가능할 것 같다.
플러그인 구현에 사용하는 IntelliJ API도 꽤 잘 설계돼있었다. 특히 커스텀 언어 지원 플러그인을 만들려는 경우에는 상상하는 대부분의 기능이 API를 통해서 간단하게 처리할 수 있다고 생각이 된다.
변수의 타입을 추적하거나 연산의 타입 유효성을 검사하기 위해서 GDShader의 타입 시스템을 모델링하기도 했다. 다형성같은 복잡한 개념은 없지만 함수 오버로딩이나 일부 암시적 형변환이 허용되는 경우들을 처리하는게 까다로웠다. 이걸 구현하는 과정에서 그간 공부했던 디자인 패턴이 적절하게 잘 적용된 것 같아서 뿌듯했다.
배운 것들
2025년 7월부터 2026년 4월까지, 10달을 진행한 프로젝트다. 학교 과제나 튜토리얼 따라하기 수준을 넘어서 완성도 있게 끝낸 프로젝트는 이번이 처음이었는데, 그 자체로 중요한 경험이었다고 생각한다.
AI 도구가 많은 도움이 됐다. 처음에는 Gemini에 코드를 질문하는 방식으로 시작했다가, 점점 적극적으로 Claude Code를 사용하는 방식으로 바꿨다. 모든 걸 맡기기에는 상식적이지 않은 실수도 나오는 편이지만, 직접 해야 하는 작업량이 훨씬 줄어들고 잘 모르는 부분도 쉽게 시작할 수 있다는 게 엄청난 장점이었다. AI 도구 사용 자체가 매우 중요한 능력의 영역에 있다는 생각을 했다.
테스트를 작성하는 것도 처음에는 막막했는데, 막상 만들어두니 나중에 기능을 추가하거나 수정할 때 정말 많은 도움이 됐다. 테스트를 안 만들어뒀으면 기능을 추가하다가 점점 너무 꼬여서 포기했을 것 같다.
오픈소스로 배포하는 과정도 어느 정도 체험할 수 있었다. 아직 많은 기여가 있지는 않지만 이슈나 PR을 처리하는 것도 해볼 수 있었다.
반면 부족한 점도 많이 느꼈다. 모르는 부분을 구현하는 것이다 보니 어려움도 많았고, 코드 간의 일관성을 유지하기도 어려웠다. 아직 엣지 케이스들이 많이 남아있는 것도 그 흔적이라고 생각한다.
결과
JetBrains Marketplace에 배포해서 현재 다운로드 수가 9000이 넘었다. 다운로드 수가 점점 늘어가는 걸 보는 게 재미있었고, 이용자들의 리뷰나 반응이 많은 동기부여가 됐다. 처음에는 그냥 내가 필요해서 만든 플러그인인데, 같은 불편함을 느끼던 사람들이 이걸 찾아서 사용하고 있다는 게 신기하고 뿌듯했다.