반응형

개요

개발 시 무료 버전의 ChatGPT를 사용하곤 한다. 다만 보안 이슈로 인해 실제 프로젝트의 코드 일부분을 발췌하여 질문하긴 힘들다. 우회책으로 코드에 대한 설명을 하거나, 비지니스와 관련된 코드들을 모두 제거한 후 껍데기 형태의 코드를 제공하는 형태로 질의를 했었다.

 그러던 와중, ollama를 사용해 LLM 모델을 로컬 환경에 다운로드받고, 로컬 환경에서 질의하는 방법을 접하게 되었다. 최대의 장점은 보안. 로컬에서 동작하는 방식이다보니 프라이빗하게 사용할 수 있었다. 또한 이러한 방식을 Intellij IDE Plugin 에서 제공한다는 사실을 알게되었다. Plugin을 일주일정도 사용해보고 느낀점들을 리뷰해보도록 하겠다. 2025년 2월 12일 기준, 플러그인 중 Continue와 CodeGPT에 대한 리뷰를 하려했으나, 갑자기 CodeGPT에 대한 플러그인이 삭제되어 Continue만 리뷰한다.

 

먼저 Continue 뭔지에 대해 한번 알아보자.

 

Continue 란 무엇인가요? 

오픈소스 기반의 AI 코드 어시스턴트이다. 다양한 LLM 모델을 지원하며, 자동 완성, 코드 수정, LLM과의 채팅 기능을 제공한다. Intellij Continue Plugin의 공식문서 내용 기반으로 기능들을 테스트 한 후 현업에서 사용해보았다.

 

https://plugins.jetbrains.com/plugin/22707-continue

 

Continue - IntelliJ IDEs Plugin | Marketplace

Continue Continue is the leading open-source AI code assistant. You can connect any models and any context to build custom autocomplete and chat experiences inside VS...

plugins.jetbrains.com

 

 

Chat 기능

Continue Chat UI

 

 IDE 를 벗어나지 않고 LLM 에게 질의할 수 있는 가장 기본적인 기능이다. Plugin 설치 시 우측에 Continue 아이콘이 생기는데, 클릭하면 위와 같은 채팅 UI가 나타난다. 단순 채팅 뿐 아니라, IDE에 있는 코드나 파일, 폴더를 단축키 기반으로 손쉽게 참조시킬 수 있다.

 

 Continue 설정 통해 API 기반 LLM 서비스로 질의를 보내게 할수도 있지만, 로컬 환경에서 실행되는 ollama 서버의 LLM 모델과 연동도 가능하다. 필자의 경우 로컬 환경의 ollama 서버와 연동하여 채팅 기능을 사용하고 있다. 모델 선택도 간단하다. 로컬 ollama 서버와 연동만 되면 모델들이 자동으로 조회된다. 원하는 모델을 선택하기만 하면 된다.

 

ollama 연동 및 model 선택

 

 

특정 코드블럭을 LLM 질의 내용에 참조시키고싶다면 IDE 상에서 블럭씌운 후 [ Command + J ] 단축키를 통해 추가할 수 있다.

코드 블럭 참조

 

 

 참조된 코드는 프롬프트와 함께 질의 가능하며, 응답받은 코드를 실제 코드에 적용하고 싶다면, 우측 상단의 'insert at cursor' 버튼을 누르면 된다. IDE 상에 위치한 커서로 코드가 복사된다.

질의 결과

 

 파일 참조도 가능하다. 프롬프트 입력창에 '@' 입력 후 베이스가 되는 파일 명을 입력하면 된다. 코드에 대한 리뷰 및 리팩토링이 필요할 경우 좋은 옵션으로 사용될 수 있을 것으로 기대된다.

파일 참조

 

Auto Complete

출처 : continue 공식문서

 

 자동완성 기능을 제공한다. 활성화를 위해 IDE 설정 > Continue > Enable Tab Autocomplete 옵션을 활성화해야한다는데, 필자의 경우 해당 옵션을 활성화해도 자동완성 기능이 활성화되지 않았다. Intellij 의 자체 자동완성 기능을 비활성화해도 마찬가지였다.

 기능을 직접 경험해보면 좋았겠지만, 사실 지원하지 않아도 크게 아쉽진 않았다. IDE 자체에서도 준수한 수준의 자동완성을 제공해주기때문이다.

 

Code Edit

출처 : continue 공식문서

 

 LLM 질의 결과로 코드를 리턴받고, 이를 UI 기반으로 편하게 수정 할 수 있는 기능이다. LLM 에서 제안한 코드는 diff 형식으로 IDE 상에 표시되며 개발자가 판단 후 적용할 수 있다. 이 기능은 별도의 설명 없이 수정할 '코드'만 출력되기 때문에 몇번의 대화가 오가는 수준의 질의가 아닌 단순한 메서드를 만들거나, 가벼운 리펙토링, 로깅처리, 예외처리 등 정형화되고 표준화된 부분에 효과적으로 사용 가능할 것 같다.

 

 사용법은 대상 코드 블럭 지정 후 [ Command + i ] 단축키를 누르면 코드 바로 위에 프롬프트 입력 창이 뜬다. 원하는 내용을 입력하면 코드 수정 제안이 diff 형식으로 나타난다. 기존 코드는 빨간색, 제안 코드는 파란색으로 표시되며, 제안 코드로 변경을 원할경우 우측 Y를, 거절할 경우 우측 N 클릭을 통해 가능하다. Rejcet All, Accept All 버튼을 통해 일괄 처리도 가능하다.

 

아래는 메서드 명을 리팩토링해달라는 요청이었는데, 메서드 명명 규칙에 맞게 동사, 카멜케이스 형태로 자동 리팩토링 한 것을 확인할 수 있다.

메서드명 리팩토링 명령

 

 

일주일간의 사용 후기

 당연한 얘기긴 하지만 일단 답변 품질에서의 차이는 기존 API 기반 LLM 서비스와 차이가 없었다. 개발 전용 IDE에 연동되었기에 품질에서도 뭔가 다르지 않을까라는 조그만 기대를 했던것같다. 답변받은 코드들에 대해 개발자의 자체 검증 과정은 기존 LLM 서비스를 사용했을때와 같이 필요했다. 해서 LLM 품질이 아닌 다른 영역에서 느꼈던 부분들을 정리해보았다.

 

* 코드 유출, 외부 학습의 위험이 없다.

API 기반 LLM 서비스를 사용할 경우 질의한 코드를 모델이 학습할 우려인터넷망을 거친다는 점에서 코드 유출 위험을 우려했는데, 로컬 ollama 를 연동할 경우 인터넷 연결 없이 로컬 환경에서 사용 가능하다는 점에서 위 우려가 해소되었다. 코드에 대해 질의가 필요할 경우 설명으로 대체하는 케이스가 많았는데, 코드를 그대로 질의할 수 있다는 점이 좋았다.

 또한 IDE와 연동이 되어있어 빠르고 편리하게 리소스를 참조시킬 수 있었다. 보다 쉽고 빠른 질의가 가능했다.

 

* 자유롭고 빠른 모델선택

 모델마다 특화된 역량이 있다. 때문에 모델을 바꿔가며 질의하는 경우가 있었는데 모델 변경 방식도 매우 간단했다. 필자는 ollama 3.1, qwen2.5-coder, deepseek-r1 모델을 주로 사용했는데 이중 qwen2.5-coder 모델은 코드 기반의 답변을, deepseek는 도출 과정 기반의 답변을 받을 수 있었다. (참고로 qwen2.5-coder 모델은 코딩과 수학에 특화된 모델이다.)

 

qwen2.5-coder Description 일부 발췌

이 분야의 전문화된 전문가 모델 덕분에 코딩 과 수학 에 대한 지식이 상당히 많아 지고 역량이 크게 향상되었습니다 .

 

qwen2.5-coder 모델과 deepseek-r1 모델에게 메서드 명에 대한 리팩토링 질의를 해본 결과,

질의내용

 

qwen2.5-coder 모델은 아래와 같이 리팩토링 코드간단한 설명만 존재했고, (코드적으로 설명이 필요하거나 새로운 개념이 등장할 경우에는 친절하게 설명해준다.)

qwen2.5-coder:7b 모델의 응답

 

 

deepseek-r1 모델은 최종 결과 코드에 대한 도출 과정이 자초지종 설명되어 있다. 아래는 답변에 대해 부분 번역 것인데, 구구절절한 느낌이 없지않아 있다. 이 외에도 코드 리뷰를 요청했는데, 마찬가지로 코드에 대한 도출 과정들을 매우 길게 설명했다. 실제로 모든 응답을 받기까지 5분 이상 걸렸었다. 개발을 시작한지 얼마 되지 않았거나, 과정을 이해하고싶은 개발자들에게는 좋은 옵션이 될 수 있을것같다.

 

enterRoom 내부의 각 줄을 통과하겠습니다. 먼저 ValidAteChattingroom (룸메이트)이 있습니다. 그것은 간단 해 보이지만 어쩌면 더 설명 적으로 만들 수 있습니다. 그것이 검증되기 때문에 아마도 그대로 유지하거나 가능하면 더 나은 동사를 찾으십시오.
...(중략)
어쩌면 "검증"이 여기에서 최고 일 것입니다.

다음은 KickoutDuplicationUserInsameroom (룸메이트, 이메일)입니다. 복제라는 단어는 철자가 잘못 될 수 있습니다. 중복되어야합니다.
...(중략)
어쩌면 "제거"가 더 나을 것입니다. 따라서 삭제 된 UplyserInsameroom 또는 그와 비슷한 것으로 변경하십시오.

그런 다음 SessionUser.of (SessionId, 이메일, 룸메이트)가 있습니다. ()의 메소드 이름은 공장 방법에 맞으므로 다른 곳에 다른 이름 지정 규칙이 없다면이를 변경할 필요가 없다고 생각합니다.

다음 줄은 CachingUsersessionTosessionStore (SessionUser)입니다. 흠, 캐싱은 여기서 올바른 동사가 아닐 수도 있습니다. 저장 또는 저장에 대한 것입니다.
...(중략)
아마도 SavessessionUserInsessionStore가 더 나을 것입니다.

...(중략)
So putting it all together, I'll go through each method call and adjust the names accordingly:
validateChattingRoom(roomId) → keep as is since "validate" is a verb.kickOutDuplicationUserInSameRoom(...) → change to removeDuplicateUserFromRoom or something similar, but maybe better phrased as ensureSingleSessionPerRoom to make it more proactive.cachingUserSessionToSessionStore(sessionUser) → saveSessionUserToSessionStorecachingUserSessionToRoomStore(sessionUser) → saveSessionUserToRoomStoresendRoomStatusToRedis(roomId) → updateRoomStatusOnRedis or sendRoomStatusUpdateToRedissendRoomEnterAlarmToRedis(email, roomId) → notifyRoomEntryToRedis

따라서 최종 리팩토링된 메서드 호출은 다음과 같을 것이라고 생각합니다.

validateChattingRoom(roomId);
ensureSingleSessionPerRoom(roomId, email);
sessionUser = SessionUser.of(...);
saveSessionUserToSessionStore(sessionUser);
saveSessionUserToRoomStore(sessionUser);
sendRoomStatusUpdateToRedis(roomId);
notifyRoomEntryToRedis(email, roomId);

이것은 각 메소드 이름을 Camelcase의 동사로 만들고 각각의 행동을 명확하게 설명합니다.
  public void enterRoom(EnterRoomDto.Request request, String email, String sessionId) {
        Long roomId = request.getRoomId();

        validateChattingRoom(roomId);
        ensureSingleSessionPerRoom(roomId, email);

        SessionUser sessionUser = SessionUser.of(sessionId, email, roomId);
        saveSessionUserToSessionStore(sessionUser);
        saveSessionUserToRoomStore(sessionUser);
        sendRoomStatusUpdateToRedis(roomId);
        notifyRoomEntryToRedis(email, roomId);
    }

 

* 리팩토링, 코드리뷰 활용

 리팩토링과 코드리뷰에 잘 활용될 수 있을것이라 생각한다. 필자의 경우 비지니스 클래스에 대한 코드 리뷰를 요청했더니, 실제로 문제가 될 수 있는 부분에 대한 개선을 제안받았다. 병렬 처리가 필요한 부분에서 SingleThread 를 계속 생성해나가는 방식을 채택했었는데, Thead Pool 방식으로의 개선을 제안받았고, 제안받은 코드도 정상적으로 돌아갔다. 참고로 모델은 qwen2.5-coder 모델을 사용했다.

 

* 다국어 대화 지원 여부 파악 필요

 필자는 영어와 친하지 않아 주로 한글로 질의했다. qwen2.5-coder나 ollama 3.1 모델은 한글로 질의할 경우 한글 답변을 줬는데, deepseek-r1 모델의 경우 영어 답변을 줘서 번역기를 돌려야하는 불편함이 있었다. ollama 공식 사이트에 접속하여 모델 정보를 읽어보니 qwen2.5-coder나 ollama 3.x의 경우 모델 설명 부분에 '다국어를 지원한다', '다국어 대화가 가능하다' 등의 내용이 있는데 반해, deepseek-r1 모델은 다국어 관련 내용이 존재하지 않았다. 영어를 잘 못하는 사람들은 모델에 명시된 다국어 지원 여부를 잘 살펴보는것이 좋을것같다.
(deepseek도 프롬프트에 한국어로 답변해달라고 추가하면 한글 답변이 나오긴 하지만, 추가하는걸 자꾸 까먹...)

 

ollama 3.1 Description 일부 발췌

8B 및 70B 모델의 업그레이드된 버전은 다국어이며 128K의 상당히 긴 컨텍스트 길이, 최첨단 도구 사용 및 전반적으로 더 강력한 추론 기능을 갖추고 있습니다. 이를 통해 Meta의 최신 모델은 장문 텍스트 요약, 다국어 대화 에이전트코딩 어시스턴트와 같은 고급 사용 사례를 지원할 수 있습니다.

 

qwen2.5-coder Description 일부 발췌

중국어, 영어, 프랑스어, 스페인어, 포르투갈어, 독일어, 이탈리아어, 러시아어, 일본어, 한국어, 베트남어, 태국어, 아랍어 등 29개 이상의 언어에 대한
 다국어 지원 제공합니다 .

 

참고로 잠깐 사용했던 CodeGPT는 모델과 별개로 시스템 프롬프트 설정이 가능했는데, 한글로 답변해달라는 내용을 추가하니 deepseek-r1 모델 또한 한글 답변을 주긴 했었다. continue에도 이러한 설정이 있다면 좋을것같다.

  

* 시스템 리소스에 따른 모델 규모 선택

 아무래도 로컬 환경에 설치된 LLM 모델이 동작하는 거라 시스템 리소스를 많이 먹는다. 필자의 컴퓨터 메모리가 18GB인데, 14b 규모의 모델을 사용할 경우 컴퓨터가 심하게 버벅거린다. 7b 규모로 낮추니 버벅거림이 많이 사라졌다. 

 규모가 클수록 더 좋은 답변을 받을 수 있겠지만 본인의 PC 사양을 고려하여 모델 규모를 설정하는 것이 필요해보인다. 모델 크기는 GB 기준 메모리의 절반을 넘지 않는 것이 바람직해보인다. 메모리가 18GB라면 모델 크기는 9B를 넘지 않는것이 정신건강에 좋았다.

 

회고

 일주일동안 현업에 적용하려고 시도해보았으나, LLM의 답변 내용을 검증하기 위해, 또는 믿지못해서 구글링을 하는 자신을 볼 수 있었다. 사용 초기엔 무지성 채팅 기능만 사용했는데, 공식문서를 읽어보니 꽤나 유용한 기능이 있음에 놀랐다. 특히 Edit 기능이 매우 매력적이라 생각됐다.

 사용 기간이 길지 않았고, 기능 경험, 사용 부분에 초점이 맞춰져서인지, 다양하고 구체적인 현업 적용 아이디어는 도출해내지 못했다. 계속해서 현업에 활용하면서 유의미한 포인트를 찾아봐야겠다.

 

 

 

반응형

+ Recent posts