캡스톤 프로젝트 - intellij 플러그인 개발기(2) - 삭제 코드 저장

이민호·2025년 6월 27일

intellij 플러그인 개발기(1) - 코드 스니펫 실시관 트래킹 기능

지난번에 플러그인을 개발하면서 사용자의 코드 스니펫을 저장하는 기능을
구현해보았다. 오늘은 스니펫이 삭제되었을때 이전 기록을 어떻게 저장하여 개발 기록을 남길 수 있었는지 알아보자.

🎲 요구사항

이전 글에서도 다루었지만, 우리는 개발 과정자체를 저장해야하므로
1. 사용자가 최종으로 남겨놓은 소스코드
2. 삭제 되었지만 저장하고 싶은 소스코드
두가지를 함께 저장해야 했다.

하지만, 이전 실시간 트래킹기능만 사용한다면 지워졌을때 내용도 전부 다 지워지므로 2번에 해당하는 내용을 저장할 수가 없었다.


🎞️ 해결법

그래서 나는 사용자가 드래그한 소스코드를 스니펫으로 설정할 때, 소스코드의 스냅샷을 Redis에 저장할 뿐만아니라 플러그인에도 hashmap형태로 백업해 놓았다.

key : 코드 스니펫 Id(uuid)
value : RangeMarker 객체 형태

나는 먼저 시스템의 실시간성과 성능을 함께 고려해야 한다고 판단했고 코드 편집 이벤트는 매우 빈번하게 발생하기 때문에, 삭제된 코드의 상태를 추적하는 과정이 전체 흐름에 병목이 되어서는 안 된다고 생각했다.

그래서 시간 복잡도를 최소화할 수 있는 자료구조를 고민했고, key 기반으로 빠르게 접근할 수 있는 Map 형태가 적합하다는 결론에 도달했다.


위의 소스코드는 document가 변화할때마다 호출되는 함수인데, RangeMarker 객체가 지워진것을 위의 유효성 검사하는 부분에서 File Listener가 감지하면 SendUpdateStatue함수로 서버로 요청을 보내 Redis의 해당 소스코드 객체의 "status"필드 값을 “deleted"상태로 수정하게 했다.

이후 커밋 이벤트 발생 시, 플러그인은 Map 데이터를 서버로 보내고,
서버는 Redis 유저 데이터를 순회하며 status = “managed”인 데이터는
Redis data(실시간데이터)를 DB에 저장하고 status = “deleted”인 데이터는 스니펫 id 값을 이용해 Map data(스냅샷)을 DB에 저장하는 원리로 구성했다.

결과

이렇게 코드를 나눠서 저장한 결과, 실제로 커밋시점까지 남아있던 소스코드는 GitHub계정을 연동하여 가져온 커밋소스코드와 연동하여 사용자의 코드 스니펫을 보여줄 수 있었다.

실제로 플러그인에서 실시간으로 관리되던 소스코드 스니펫이며, 사용자가 등록한 제목, 카테고리, 설명할 내용등이 적혀있는 것을 확인할 수 있다.

커밋 시점에는 없었지만 삭제된 소스코드들은 별도로 타임라인으로 저장하여 그 시점의 소스코드와 사용자 코드 스니펫 내용들을 볼 수 있게 만들었다.

위의 사진은 CodeServiceImpl.java document에 설정돤 RangeMarker객체의 내용이 지워진 이후의 스냅샷을 따로 저장해 놓았다.


사용자는 이 데이터들을 이용하여 개발하는 과정에 포트폴리오나, 자신이 부각하고 싶은 내용들을 미리미리 저장하여 일종의 글 형태로 저장할 수 있고, 이런 부분들을 AI에게 맡겨 좋은 품질의 글을 생성할 수 있게 만든것이 우리 서비스이다! 👏👏

마무리

플러그인을 개발하면서 Reference가 너무 없어서 힘들었다. 하지만 플러그인 자체에도 API를 연결하여 좋은 서비스를 만들 수 있다는 것을 알았고
실제로 아래는 우리가 플러그인에서 사용했던 API이다.

기술적으로 보여줄만한 것들이 없었는데 여러 고민과 설계를하면서 그런것들을 조금이나마 보여줄 수 있어서 다행이었다.

끗 -

profile
효율적으로 살게요.

0개의 댓글