‹ 조하원
실습코치 업무 · 직접 설계하고 운영

코드 리뷰 봇

Merge Request가 열리면
10~20초 안에 첫 리뷰가 달려요.

교육생이 GitLab에 Merge Request를 올리면 n8n AI Agent가 diff를 읽고 리뷰 코멘트를 남긴 뒤 Mattermost로 알려주는 자동화예요. 반복되는 1차 리뷰는 봇이 맡고, 코치는 설계와 구조 피드백에 시간을 쓰도록 만들었어요.

형태1인 설계 · 구축 · 운영
적용실습코치 담당 교육생 팀
시작교육생 시절 내 팀 저장소
20개 팀적용 팀
120명교육생
1,000+건누적 리뷰
90%설문 긍정 응답
왜 만들었나

코치 한 명이 모든 MR을 읽을 수 없었어요.

코치가 교육생 MR을 하나하나 확인하고 코멘트를 다는 데 시간이 많이 들었어요. 리뷰가 늦어지면 교육생은 피드백을 기다려야 했고, 인원에 비해 시간이 부족해 사소한 실수까지 짚어주기는 어려웠어요.

  1. GitLabMR open 이벤트
  2. Webhook시크릿 토큰 검증
  3. diff 조회12,000자 초과분 절삭
  4. AI AgentGroq LLM + Redis 메모리
  5. 결과MR 코멘트 + Mattermost 알림

제가 한 일.

설계 판단

  • 그룹 웹훅 1개로 저장소 10개를 커버해 관리 지점을 하나로 줄임
  • 웹훅 URL이 노출돼도 LLM 비용이 새지 않게 시크릿 토큰 검증을 맨 앞에 배치
  • diff가 12,000자를 넘으면 잘라서 토큰 비용 폭증을 막음
  • 자동 리뷰는 MR이 열릴 때 1번만, 이후는 /review 댓글로 다시 요청 — push마다 코멘트가 쌓이는 걸 막으려고 update 이벤트는 일부러 제외

운영

  • Redis 세션 키를 MR 단위로 잡고 5턴 · 30일 보관 → 재리뷰 때 이전 지적을 참고
  • 중요한 이슈 2~3개만 대화체로, 끝에는 '참고용이니 직접 검증하라'는 문구 고정
  • Mattermost 웹훅 URL은 워크플로 JSON이나 git에 넣지 않고 환경변수로만 주입

실제로 이렇게 돌아가요.

저장소가 비공개라, 운영 중인 워크플로 파일(n8n-workflow.json)에서 구조와 판단이 담긴 부분만 옮겼어요. 비밀값은 원본에도 자리표시값으로 되어 있어요.

노드 구성 (10개)

GitLab 웹훅 하나로 받아서, 코드로 거르고, AI Agent가 리뷰한 뒤 두 곳에 남겨요.

GitLab Webhook그룹 웹훅 1개→Filter & PrepareCode · 토큰·트리거 판별→Get MR DiffHTTP · GitLab API→Build Agent InputCode · 12,000자 절삭→AI Agent리뷰 생성→Parse ReviewCode→Post Review CommentMR 코멘트→Mattermost알림
AI Agent에 서브노드로 연결 → Groq Chat Model · llama-3.3-70bRedis Chat Memory · 키 review:{projectId}:{mrIid} · 5턴 · 30일

언제 리뷰할지 정한 코드

Filter & Prepare 노드 발췌

const CONFIG = {
  maxDiffChars: 12000,
  triggerActions: ['open'],  // 처음 열릴 때만 자동 리뷰
  triggerKeyword: '/review', // 댓글로 재리뷰
};
// 1) 시크릿 토큰부터 검증
if (headers['x-gitlab-token'] !== CONFIG.webhookSecret)
  return [];
// 2-A) MR 이벤트: open이 아니면 무시
if (!CONFIG.triggerActions.includes(attrs.action))
  return [];
// 2-B) 댓글 이벤트: 정확히 '/review'일 때만
if (note.trim() !== CONFIG.triggerKeyword)
  return [];

리뷰 규칙

AI Agent 시스템 메시지 발췌

정말 중요한 이슈 2~3개만 선별해서 코멘트하세요.
사소한 트집을 다 나열하지 마세요.

마지막은 다른 팀원도 논의에 참여할 수 있는
열린 질문 하나로 마무리하세요.

"이 리뷰는 참고용으로 활용하시고 반드시
직접 검증해 보셔야 합니다!" 문구를 포함하세요.

// 메모리를 쓰는 만큼 넣어 둔 규칙
이전 답변 기록이 없다면 "이전 리뷰에서" 같은
표현을 단 한 글자도 지어내지 마세요.

문제를 다시 본 순간들.

처음엔

처음엔 Redis 조회·저장과 '이전 리뷰 내용'을 프롬프트에 끼워 넣는 로직을 n8n Code 노드로 직접 짰어요.

알고 보니

다시 보니 부족한 건 기능이 아니었어요. 대화 기록 관리를 제가 짠 코드가 전부 떠안고 있어서, 고칠 곳이 계속 늘어나는 구조였어요.

바꾼 것

n8n AI Agent 노드에 Chat Model(Groq)과 Memory(Redis)를 서브노드로 붙여 기록 관리를 맡겼고, 직접 짠 Code 로직을 줄였어요.

그래서

같은 구조에 GitLab Discussion API를 Tool로 붙이면 줄 단위 리뷰로도 넓힐 수 있게 됐어요.

사용한 기술.

Orchestration
n8n (self-hosted)AI Agent 노드
LLM
Groqllama-3.3-70b-versatile
Memory
Redis Chat Memory
연동
GitLab APIMattermost Webhook