Zed에서도 Spring Boot 개발이 됩니다
Zed를 쓰다가 Java/Spring 프로젝트를 열면 늘 같은 벽에 부딪힙니다. 공식 Java
익스텐션 덕분에 Java 자체는 잘 되는데, Spring은 아무것도 모릅니다.
application.yml은 그냥 텍스트고, @Value("${...}") 안에서는 자동완성이 안 되고,
@Query 안의 JPQL은 오타를 내도 조용합니다. 결국 Spring 작업만 IntelliJ나
VS Code로 넘어가게 됩니다.
그래서 Zed Spring Tools
를 만들고 있습니다. Spring 팀이 만든 공식 Spring Tools
언어 서버를 Zed에 붙이는 익스텐션입니다.
먼저 솔직하게
안정 릴리스가 아닙니다. 지금은 이렇습니다.
- 검증된 환경은 macOS arm64 하나뿐입니다. Temurin JDK 25.0.3과 하한선인
21.0.11에서 확인했습니다. Linux와 Windows용 코드는 들어 있지만 실행 증거가
없으므로 "지원한다"고 말하지 않습니다. - Zed 익스텐션 레지스트리에는 제출해 둔 상태고,
아직 심사 중입니다. 지금은 개발용 익스텐션으로 직접 설치해야 합니다. - 공식 Java 익스텐션이 필수입니다. 이걸 대체하는 게 아니라 옆에 붙는
프로젝트입니다.
문서 원칙도 여기에 맞췄습니다. "구현했다"와 "실제로 동작하는 걸 봤다"를 다른
상태로 관리하고, 후자만 기능 목록에 올립니다. 현재 추적 중인 59개 항목 중
46개가 검증(verified) 상태이고, "구현했지만 아직 확인 못 함" 상태는 의도적으로
0개입니다. 코드가 존재한다는 이유만으로는 아무것도 목록에 올라가지 않습니다.
그래서 뭐가 되나요
검증된 환경 기준으로, 실제로 확인한 것들입니다.
설정 파일 — application.properties와 .yml의 자동완성, 호버, 검증,
정의로 이동. .properties ↔ .yaml 상호 변환.
Spring을 아는 Java 자동완성 — @Value 안의 프로퍼티 키, @Qualifier 안의
빈 이름, 스코프와 프로파일, 엔티티에서 유도한 Spring Data 쿼리 메서드,
@Component 메서드 안의 빈 주입 제안. @GetMapping 계열 메서드 템플릿은
import까지 같이 넣어 줍니다.
쿼리와 SpEL — @Query 안의 JPQL/HQL/SQL 문법 검증, ?1이나 :name
파라미터에서 실제 메서드 파라미터로 정의 이동, ?1 위의 파라미터 이름 인레이
힌트. SpEL은 Spring이 표현식을 읽는 모든 자리(@Value, @Cacheable,
@EventListener, @ConditionalOnExpression 등)에서 검증되고, 빈 참조에서
@Bean 선언으로 이동할 수 있습니다.
Spring 정적 분석과 퀵픽스 — 불필요한 @Autowired, 생성자 주입으로 바꿀 만한
필드 주입, Boot 3에서 제거된 타입, Boot 4의 API 버저닝·빈 레지스트라 관련 검사
등이 진단으로 뜹니다. 중요한 건 퀵픽스가 실제로 코드를 고친다는 점입니다.
"Convert @Autowired field into Constructor Parameter"를 누르면 필드를 지우고
생성자를 씁니다. JDT 리팩터링과 OpenRewrite 레시피 양쪽 경로 모두 동작합니다.
Boot 패치 버전 업그레이드도 같은 경로를 탑니다 — 빌드 파일 상단의 퀵픽스가
저장 전에 검토 가능한 편집으로 버전을 올려 줍니다.
빌드 파일 진단 — 사용 가능한 패치/마이너 릴리스, 현재 Boot 세대가 OSS 지원
범위 안인지 상용 지원 구간인지, 클래스패스의 Spring Cloud 릴리스가 그 Boot
세대를 실제로 지원하는지.
실행 중인 앱의 라이브 데이터 — 코드 액션으로 로컬 Boot 프로세스에 연결해서
CodeLens에 실시간 빈/엔드포인트 정보를 띄우고, 힙·GC·로거 스냅샷을
.zed/spring-live.md로 뽑을 수 있습니다. 로거는 레벨 변경도 됩니다(확인
프롬프트를 거칩니다). 원격 앱은 boot-java.remote-apps 설정으로 붙습니다 —
VS Code도 쓰는 것과 같은 방식입니다.
실행/디버그 설정 생성 — 코드 액션 하나로 워크트리의 Boot 프로젝트를 찾아
.zed/tasks.json과 .zed/debug.json을 만듭니다. application-<profile>.*에서
발견한 프로파일마다 항목이 하나씩 생겨서, Zed의 태스크 선택기가 곧 프로파일
선택기가 됩니다. 기존 설정을 손실 없이 파싱할 수 없으면 덮어쓰지 않고 사이드카
파일로 남깁니다.
Spring Modulith — 모듈 내부를 침범하는 참조에 진단이 뜨고, Structure
문서가 애플리케이션 모듈 단위로 묶이면서 각 타입에 (API) / (internal)
표시가 붙습니다.
비행기에서도 됩니다. 고정된 Spring Tools 아티팩트를 한 번 내려받고 나면
그 뒤로는 네트워크가 필요 없습니다. 모든 아웃바운드 연결을 막고 돌린 실행에서도
자동완성, 진단, 퀵픽스, 클래스패스 브리지가 전부 동작했습니다. Boot 버전
진단만 조용해집니다 — Maven Central과 api.spring.io에 물어봐야 하는
정보라서요. 오래된 조언을 보여 주느니 아무 말도 안 하는 쪽을 택했습니다.
안 되는 것
Java 문자열 안쪽의 SpEL이나 쿼리 조각에 색이 들어가지 않습니다. LSP semantic
tokens가 필요한데 Zed 1.11.3은 Java 버퍼에 대해 이걸 요청하지 않습니다 —
Spring이 동적으로 등록해도, 공식 Java 서버가 정적으로 선언해도 마찬가지입니다.
Java 코드 자체는 Zed의 자체 문법으로 정상 하이라이팅되니, 그 문자열 안의 색깔만
빠집니다. 검증과 이동은 일반 LSP를 타기 때문에 잘 됩니다.
그 외에 Spring Initializr, 실험적 임베디드 MCP 서버, AI 설명 커맨드는 아직
방향을 정하지 못한 상태입니다. 나머지는 알려진 한계에
정리해 뒀습니다.
써 보려면
필요한 것:
- Zed + 공식 Java 익스텐션(필수)
- JDK 21 이상 (21.0.11과 25.0.3에서 검증, 22~24는 미검증)
rustup으로 설치한 Rust (Zed가 개발용 익스텐션 빌드에 요구합니다)- 첫 아티팩트 다운로드를 위한 네트워크 (그때 한 번만)
설치는 저장소를 클론한 다음 Zed 익스텐션 페이지에서 Install Dev Extension을
고르고 그 디렉터리를 선택하면 됩니다. Java 익스텐션을 먼저 설치하세요. 이미
JDT LS가 돌고 있었다면 Zed를 재시작해야 브리지 번들이 전달됩니다.
한 가지 더 — .java 파일을 최소 하나는 열어 두세요. Zed는 Java 버퍼가 있을
때만 Java 언어 서버를 띄우고, 익스텐션이 대신 띄워 줄 수 없습니다.
application.properties만 열어 둔 세션에는 프로젝트 클래스패스가 없어서
프로퍼티 검증이 문법 수준으로만 동작합니다. 이 경우 익스텐션이 실패라고
보고하는 대신 상황을 한 번 알려 줍니다.
CodeLens는 Zed에서 기본적으로 꺼져 있으니, 라이브 데이터를 보려면 설정에
"code_lens": "on"을 넣어야 합니다.
마지막으로
macOS arm64 밖의 환경은 전부 미검증입니다. Linux나 Windows에서 Zed로 Spring을
쓰고 싶으셨다면, 돌려 보고 뭐가 깨지는지 알려 주시는 것만으로도 큰 도움이
됩니다. 이슈, 로그, "이건 왜 이렇게 만들었나요" 같은 질문 전부 환영합니다.