[리뷰] 500달러짜리 AI 개발자 Devin, 오픈소스로 씹고 뜯기: OpenHands(구 OpenDevin) 아키텍처 딥다이브
요즘 개발자들 모여서 커피 한잔하면 꼭 나오는 주제가 있죠. “AI가 진짜 우리 밥그릇 뺏는 거 아니야?” 코파일럿(Copilot)이 처음 나왔을 때만 해도 ‘오, 똑똑한 자동완성이네’ 하고 넘겼지만, 자율형 AI 소프트웨어 엔지니어 Devin(데빈)이 등장했을 때는 솔직히 등골이 서늘했습니다. 프롬프트 하나 던져주면 자기가 알아서 문서를 읽고, 환경을 세팅하고, 코드를 짜고, 심지어 배포까지 하니까요.
하지만 Devin의 치명적인 단점이 하나 있었습니다. 바로 월 500달러(약 60~70만 원)에 달하는 살인적인 가격표죠. 개인 사이드 프로젝트나 작은 스타트업에서 쓰기엔 턱없이 비싼 금액입니다. “기술은 탐나는데 돈이 없다면? 우리가 직접 만들면 되지!” 오픈소스 진영 특유의 이 반골 기질은 언제나 위대합니다. 그렇게 탄생한 프로젝트가 바로 오늘 리뷰할 OpenHands(구 OpenDevin)입니다. (참고로 상표권 문제 때문에 작년 말에 이름이 OpenDevin에서 OpenHands로 바뀌었습니다.)
단순히 텍스트만 뱉어내는 챗봇을 넘어, 내 로컬 환경에서 직접 키보드와 마우스를 쥐고 코딩하는 이 녀석, 과연 실무에 투입할 만한 ‘1인분’을 할까요? 10년 차 개발자의 깐깐한 시선으로 그 속을 낱낱이 뜯어봤습니다.
TL;DR (The Core)
OpenHands는 단순한 코드 생성기가 아닙니다. 철저히 격리된 Docker 샌드박스 내부에서 bash 명령어를 실행하고, 웹을 탐색하며, 에러 로그를 읽고 스스로 코드를 수정하는 ‘자율형 멀티 에이전트(Autonomous Multi-Agent) 프레임워크’입니다.
Deep Dive: Under the Hood (핵심 아키텍처 분석)
“AI가 코드를 짠다”는 말은 너무 피상적입니다. 현업 개발자인 우리가 궁금한 건 ‘대체 어떻게 AI가 내 로컬 터미널을 조작하고 상태를 유지하는가?’ 하는 점이죠. OpenHands의 아키텍처는 크게 세 가지 핵심 축으로 굴러갑니다.
① Event Stream: 행동과 관찰의 무한 루프 (Redux를 닮은 상태 관리) 우리가 코딩할 때를 떠올려보세요. 코드를 작성하고(Action) -> 터미널에서 빌드해 보고 -> 에러 로그를 읽습니다(Observation). OpenHands는 이 과정을 Event Stream이라는 구조로 완벽하게 추상화했습니다. 내부적으로는 프론트엔드의 Redux나 Event Sourcing 패턴과 매우 유사합니다. 에이전트가 내린 모든 명령어(예: npm install), 파일 수정 내역, 그리고 그 결과로 반환된 표준 출력(stdout)과 에러(stderr)가 시간순으로 하나의 스트림에 차곡차곡 기록됩니다. LLM은 매 턴마다 이 Event Stream의 전체 컨텍스트를 읽고 “아, 아까 패키지 설치하다가 버전 충돌이 났으니, 이번엔 강제로 설치(force)해야겠군” 하고 다음 행동을 결정합니다.
② Docker Sandbox: 완벽한 격리와 안전망 만약 AI가 환각(Hallucination)에 빠져 터미널에 rm -rf /를 입력한다면 어떻게 될까요? 상상만 해도 아찔하죠. OpenHands는 이 문제를 원천 차단하기 위해 모든 작업을 일회성(Ephemeral) Docker 컨테이너 내부에서만 실행합니다. 아키텍처 흐름은 이렇습니다:
- Node.js 오케스트레이터가 Docker Engine API를 호출해 샌드박스 컨테이너를 띄웁니다.
- 에이전트는 SSH를 통해 이 컨테이너에 접속하여 명령을 내립니다 (실제 사람이 원격 서버에서 작업하는 것과 동일한 시맨틱을 유지합니다).
- 작업이 끝나면 컨테이너는 흔적 없이 폐기됩니다.
1
2
# 로컬에서 가장 안전하고 빠르게 OpenHands를 띄우는 방법 (uv 활용)
uvx --python 3.12 openhands serve
위 명령어 하나면 백엔드 서버와 세련된 GUI가 3000번 포트에 뜹니다. 여기서 중요한 건 볼륨 마운트입니다. 프로젝트 워크스페이스만 컨테이너에 마운트하여 호스트 시스템의 파일 시스템 무결성을 철저히 보호하죠.
③ Agent Delegation: 마이크로 에이전트들의 협업 초기 AI 에이전트들은 하나의 거대한 프롬프트로 모든 걸 해결하려다 보니 컨텍스트 창이 터져버리거나 바보가 되기 일쑤였습니다. OpenHands는 역할을 나눴습니다. 코딩과 터미널 조작에 특화된 CodeActAgent가 메인으로 돌다가, 특정 라이브러리의 최신 공식 문서 확인이 필요해지면 웹 브라우저 조작에 특화된 BrowsingAgent에게 작업을 위임(AgentDelegateAction)합니다. 브라우징 에이전트가 문서를 읽고 핵심만 요약해서 돌려주면, 다시 코딩 에이전트가 그 문법에 맞춰 코드를 수정하죠. 주니어 개발자가 사수에게 “이거 문서 좀 찾아보고 올게요” 하는 것과 정확히 똑같은 그림입니다.
Hands-on / Pragmatic Use Cases
자, 아키텍처는 훌륭합니다. 그럼 당장 내일 출근해서 이걸 어디에 써먹을 수 있을까요? “뱀 게임 만들어줘” 같은 장난감 수준의 데모 말고, 진짜 돈값을 하는 실무 시나리오를 제안합니다.
- 레거시 마이크로서비스 인프라/버전 업그레이드 노가다 타파: 가장 추천하는 유스케이스입니다. 회사에 수십 개의 Node.js 또는 Golang 마이크로서비스가 있는데, 보안 취약점 때문에 일괄적으로 버전을 올리고 깨지는 테스트를 수정해야 한다고 쳐봅시다. 이건 창의성보다는 끈기가 필요한 작업이죠. OpenHands에게 “이 레포지토리의 라이브러리 버전을 올리고,
make test를 실행한 뒤 실패하는 테스트들을 하나씩 고쳐놔”라고 지시해 두고 우리는 더 가치 있는 아키텍처 설계에 집중하면 됩니다. - CI/CD 파이프라인 버그 슈팅: 에러가 난 GitHub Actions 로그를 텍스트로 던져주고 “이거 왜 실패했는지 분석하고, 소스코드 수정해서 PR 올려”라고 시켜보세요. OpenHands는 스스로 로컬 샌드박스에서 해당 에러를 재현해 보고, 부족한 환경 변수를 세팅하거나 오타를 수정한 뒤 Git 커밋까지 꽤 깔끔하게 완료해 냅니다.
Honest Review (진짜 장단점)
자, 칭찬은 여기까지 하겠습니다. 현업의 냉정한 시선으로 봤을 때, 덮어놓고 도입하기엔 꽤나 묵직한 트레이드오프(Trade-off)들이 존재합니다.
- 비용의 역설 (진짜 Devin보다 쌀까?): OpenHands 자체는 무료 오픈소스입니다. 하지만 코딩 능력이 뛰어난 최고급 모델(Claude 3.7 Sonnet 등)을 API로 연동해서 빡세게 굴리다 보면 이야기가 달라집니다. 에이전트가 스스로 에러를 잡겠다고 수십 번씩 무한 루프를 돌며 컨텍스트를 통째로 API로 쏴대다 보면, 며칠 만에 몇만 원의 토큰 비용이 증발하기도 합니다. 헤비 유저라면 차라리 병렬 실행이 가능하고 독립적인 인스턴스를 제공하는 정액제 Devin($500)이 ‘가성비’ 측면에선 더 나을 수도 있다는 뼈아픈 역설이 존재합니다. (물론 DeepSeek이나 Gemini Flash 같은 저렴한 모델을 쓰면 비용을 확 낮출 수 있지만, 복잡한 로직에서의 코딩 품질은 아직 Claude를 따라오지 못하더라고요.)
- 지옥의 ‘환각 무한 루프 (Hallucination Loop)’: 이 녀석, 생각보다 뚝심이 과합니다. 테스트가 실패하면 원인을 깊이 분석해야 하는데, 가끔 ‘코드 엉뚱하게 수정 -> 테스트 실패 -> 다시 엉뚱하게 수정’이라는 늪에 빠집니다. 인간 개발자가 중간에 개입해서 “야, 그 파일 말고 설정 파일을 보라고!” 하고 명확하게 방향을 틀어주지 않으면(Human-in-the-loop) 아까운 API 크레딧만 갉아먹는 괴물이 됩니다.
- Docker 바인딩의 보안 리스크와 환경 셋업의 장벽: 오케스트레이터가 샌드박스를 띄우기 위해 호스트의
/var/run/docker.sock를 마운트해야 하는데, 이건 사실상 호스트의 root 권한을 내어주는 것과 마찬가지라 기업 내부망 보안 정책상 쉽게 통과되기 어렵습니다. 또한, 회사 내부의 특수한 스택(Private NPM Registry, 사내 VPN 등)을 쓰려면 기본 제공되는runtime:0.14-nikolaik이미지 대신 직접 커스텀 Docker 샌드박스 이미지를 말아서 띄워야 하는 인프라적 번거로움이 있습니다.
Closing Thoughts
OpenHands를 며칠 밤낮으로 뜯어보고 굴려보면서 느낀 감정은 ‘두려움’보다는 ‘짜릿함’이었습니다. AI는 더 이상 내 IDE 구석에 숨어서 코드를 한 줄씩 자동 완성해 주는 소극적인 도구가 아닙니다. 이제는 직접 터미널을 열고 에러와 싸우는 ‘주니어 동료’로 진화했습니다.
물론 아직 이 주니어 동료는 어설픕니다. 엉뚱한 곳에서 삽질도 하고, 가끔은 너무 많은 돈을 쓰기도 하죠. 하지만 방향성은 명확합니다. 앞으로 개발자의 핵심 역량은 ‘어떤 API 문법을 얼마나 잘 아느냐’에서, ‘AI 에이전트에게 얼마나 명확한 컨텍스트와 시스템 바운더리를 설정해 주고, 그들의 결과물을 안전하게 오케스트레이션(Orchestration)할 수 있느냐’로 완전히 옮겨갈 것입니다.
이번 주말, 넷플릭스 대신 로컬 환경에 OpenHands 샌드박스를 한 번 띄워보시길 강력히 권합니다. 아직 완벽하지 않아서 오히려 개발자로서 고민하고 배울 게 훨씬 더 많은, 아주 흥미로운 탐험이 될 겁니다.
References
- https://github.com/All-Hands-AI/OpenHands
- https://arxiv.org/abs/2407.16741
- https://docs.all-hands.dev/
