누가 요즘 grep으로 코드를 찾니
— Serena MCP는 사람이 아니라 AI 에이전트를 위한 도구다.
비교 전제부터 다시
처음엔 "코드 호출처 찾기, grep이 정확하냐 Serena가 정확하냐"로 글을 쓰려다 멈췄다. 전제가 틀렸기 때문이다.
요즘 개발자가 "이 함수 어디서 호출되지?"를 grep으로 찾나? 거의 안 그런다. IntelliJ면 Find Usages, VSCode면 Find All References, Cursor도 검색 기능을 기본으로 준다. 셋 다 텍스트가 아니라 심볼(함수, 클래스 같은 의미 단위)을 이해하고 찾아준다. 사람은 이미 IDE가 다 해주고 있다는 얘기다. grep은 오히려 코드보다 로그에서 더 자주 쓴다. 서버 로그에서 에러 한 줄 찾을 때 grep ERROR app.log 치는 게 훨씬 현실적인 grep 사용처다.
그럼 Serena 심볼 도구는 누구를 위한 걸까. 사람 말고, Claude Code나 Codex 같은 AI 코딩 에이전트다.
AI 에이전트는 코드를 어떻게 읽나
Claude Code, Codex처럼 터미널에서 도는 에이전트는 IntelliJ 같은 IDE 인덱스가 없다. 그래서 기본 무기가 ripgrep 텍스트 검색이랑 파일 읽기다. 사람이 IDE에서 클릭 한 번에 보는 "이 함수 호출처 목록"을 에이전트는 텍스트로 긁어모은 다음 직접 추론한다.
여기서 길이 둘로 갈린다. 하나는 그냥 ripgrep으로 긁고 파일 읽어서 버티는 방식. 다른 하나는 Serena 같은 LSP(언어 서버 프로토콜) 기반 MCP를 붙여서 심볼 단위로 보게 하는 방식이다. 쉽게 말해 Serena는 에이전트한테 IDE의 Find Usages를 쥐여주는 도구다.
AI 에이전트 관점에서 비교
호출처 정확도는 둘이 크게 다르다. ripgrep은 주석, 문자열, 이름만 같은 변수까지 다 걸린다. 에이전트가 결과를 다시 추려야 한다. Serena는 실제로 그 심볼을 참조하는 곳만 짚어준다.
토큰 비용도 차이가 난다. ripgrep으로 매칭이 많이 나오면 에이전트가 파일 여러 개를 통째로 읽느라 토큰을 많이 쓴다. 심볼 단위로 필요한 부분만 보면 토큰이 절약될 수 있다. 다만 이건 코드베이스 크기랑 작업에 따라 달라서 항상 그렇다고 단정하긴 어렵다.
리네임이나 리팩토링은 차이가 가장 분명하다. ripgrep 방식은 에이전트가 바꿀 곳을 직접 다 찾아서 고쳐야 하고 누락 위험이 있다. Serena는 참조까지 함께 바꾸는 안전한 리네임을 제공한다.
실제로 여러 파일에 흩어진 함수 하나를 Serena 리네임으로 바꿨더니 참조 12곳이 한 번에 같이 수정됐다. ripgrep으로 긁어서 수동으로 고쳤다면 두세 군데는 놓쳤을 작업이다.
대신 준비 비용은 ripgrep이 이긴다. ripgrep은 설정 없이 바로 되고 어떤 언어든 돈다. Serena는 언어 서버 인덱싱이 먼저 돼야 하고, 지원 안 되는 언어거나 설정이 깨지면 결국 텍스트 검색으로 돌아가야 한다.
그래서 항상 Serena가 낫나
아니다. 요즘 에이전트는 ripgrep이랑 파일 읽기만으로도 꽤 잘한다. 작은 코드베이스나 한 번 보고 끝낼 작업이면 Serena 인덱싱을 띄우는 게 오히려 번거롭다. Serena가 값을 하는 건 큰 코드베이스에서 호출처 추적이나 리네임처럼 코드 사이의 관계가 중요한 작업, 그리고 토큰을 아끼고 싶을 때다.
정리
사람 개발자는 이미 IDE가 심볼 검색을 해주니 grep은 주로 로그용으로 남았다. AI 에이전트는 기본이 텍스트 검색이고, Serena는 거기에 IDE급 심볼 이해를 얹어주는 선택지다. 결국 "grep이냐 Serena냐"는 사람이 할 고민이 아니라, 에이전트를 어떻게 세팅할지의 문제다.