n8n으로 GitHub AI 코드 리뷰 워크플로우 만들기

김주엽·2025년 7월 17일
0
post-thumbnail

✨ 들어가며

팀 프로젝트를 진행하면서 가장 고민이었던 부분 중 하나는 코드 리뷰였습니다.
사람마다 다른 기준, 바쁠 때는 대충 넘어가는 리뷰, 그리고 놓치는 보안 취약점과 컨벤션들...
이런 문제들을 해결하고 싶어서 n8n을 활용한 AI 코드 리뷰 워크플로우를 구축하게 되었습니다.

🚀 n8n이란?

n8n은 Fair-code 라이선스로 제공되는 워크플로우 자동화 플랫폼입니다.
노코드/로우코드 방식으로 다양한 서비스와 API를 연결하여 복잡한 자동화 워크플로우를 시각적으로 구축할 수 있습니다.

주요 특징

  • 400개 이상의 통합: GitHub, Discord, Google Sheets, Slack 등 다양한 서비스 연결
  • AI 네이티브: LangChain 통합으로 AI 기능을 워크플로우에 쉽게 추가
  • 셀프 호스팅: 데이터 주권 보장으로 민감한 정보 보호
  • 시각적 편집기: 드래그 앤 드롭으로 직관적인 워크플로우 구축
  • 커스텀 코드: JavaScript/Python으로 복잡한 로직 구현 가능

알아두면 좋은 것들

💡 셀프호스팅 vs 클라우드: 회사 데이터가 중요하다면 셀프호스팅 추천! Docker로 손쉽게 구축 가능.

  • docker-compose.yml

    services:
      n8n:
        image: n8nio/n8n:latest
        container_name: n8n
        ports:
          - "5678:5678"
        environment:
          - GENERIC_TIMEZONE=Asia/Seoul
          - NODE_ENV=production
          - WEBHOOK_URL=${WEBHOOK_URL}
          - N8N_HOST=${N8N_HOST}
          - N8N_PROTOCOL=${N8N_PROTOCOL}
          - N8N_PORT=5678
          - N8N_SECURE_COOKIE=true
          - N8N_BASIC_AUTH_ACTIVE=true
    
        volumes:
          - n8n_data:/home/node/.n8n
          - ./local-files:/files
    
    volumes:
      n8n_data:

💡 요금 걱정: 클라우드 버전도 월 $20부터 시작. 스타벅스 몇 잔 참으면 됩니다 ☕

💡 학습 난이도: 노코드 도구 중에서는 중간 정도. 프로그래밍 경험 있으면 1주일이면 손쉽게 구현 가능!

📦 핵심 노드

다음으로는 n8n의 기본적인 노드를 소개드리겠습니다 🙆‍♂️

기본 데이터 처리 노드

Edit(Set) 노드

  • 용도: 데이터의 구조를 변경하거나 새로운 필드를 추가
  • 활용: API 응답 데이터를 원하는 형태로 가공
  • 예시: { name: "김철수", age: 30 }{ userName: "김철수", userAge: 30 }

Loop Over Items(Split in Batches) 노드

  • 용도: 배열의 각 아이템에 대해 반복 작업 수행
  • 활용: 여러 사용자에게 개별 맞춤 메시지 전송
  • 주의: 무한 루프 방지를 위한 조건 설정 필요

조건부 처리 노드

Switch 노드

  • 용도: 조건에 따라 워크플로우를 여러 경로로 분기
  • 활용: 사용자 등급에 따른 다른 처리 로직
  • 특징: 복잡한 조건식과 다중 분기 지원

IF 노드

  • 용도: 단순한 참/거짓 조건 판단
  • 활용: 데이터 검증, 예외 상황 처리
  • 차이점: Switch보다 간단하지만 이진 분기만 가능

AI 관련 노드

AI Agent 노드

  • 용도: LangChain 기반의 AI 에이전트 구현
  • 활용: 자연어 처리, 문서 분석, 메일 분류 등
  • 장점: 다양한 도구와 연결하여 복잡한 AI 워크플로우 구성

통합 노드

HTTP Request 노드

  • 용도: 외부 API 호출 및 데이터 수집
  • 활용: REST API 연동, 웹훅 처리
  • 기능: GET/POST/PUT/DELETE 지원, 헤더/인증 설정

Code 노드

  • 용도: JavaScript/Python 커스텀 로직 실행
  • 활용: 복잡한 데이터 변환, 비즈니스 로직 구현
  • 장점: 노드로 해결되지 않는 부분을 프로그래밍으로 처리

📝 표현식 (Expressions)

표현식이란?

n8n에서 정적인 값 대신 동적인 데이터를 사용할 수 있게 해주는 기능입니다.
이전 노드의 결과값을 참조하거나, 조건에 따라 다른 값을 설정할 때 사용합니다.

예시: "안녕하세요 루이지님" (정적) → "안녕하세요, {{사용자명}}님!" (동적)

기본 문법

{{ $json.fieldName }}          // 현재 노드 데이터
{{ $('노드명').first().json }} // 특정 노드 데이터

자주 사용하는 패턴

문자열 처리

// 문자열 결합
{{ $json.firstName + ' ' + $json.lastName }}

// 템플릿 리터럴
{{ `안녕하세요, ${$json.name}님!` }}

조건부 처리

// 삼항 연산자
{{ $json.status === 'active' ? '활성' : '비활성' }}

// 안전한 접근
{{ $json.user?.email || 'default@email.com' }}

🤖 AI 코드 리뷰 워크플로우

워크플로우 구조

n8n으로 깃허브에 PR이 올라오면 코드 리뷰를 댓글로 추가하도록 설계한 워크플로우입니다.
깃허브에 Pull Request 이벤트가 트리거되면 PR 생성 이벤트인지 비교한 후 파일의 변경사항을 가져옵니다.
이후 AI가 읽기 쉽도록 마크다운 변환을 거친 후에 지정된 프롬프트와 구글 시트에 저장된 팀의 코드 컨벤션 문서를 함께 제공해 코드 리뷰 과정을 진행하고 깃허브에 댓글로 추가합니다.

워크플로우에서 사용하는 각 노드의 요약은 다음과 같습니다.

  1. GitHub Trigger: 깃허브에 PR 이벤트가 발생하면 워크플로우를 실행합니다.
  2. 이벤트 비교: PR이 최초로 생성된건지 비교합니다.
  3. 파일 변경사항 추적: 코드의 변경사항을 가져옵니다.
  4. 마크다운 변환: AI가 좀 더 이해하기 쉽도록 파일에 마크다운 문법을 추가합니다.
  5. AI Agent: Gemini 모델을 사용해 코드 리뷰를 요청합니다.
  6. getCodeConvention: 구글 시트에 저장된 팀의 코드 컨벤션 문서를 Gemini에게 툴로 제공합니다.
  7. 댓글 생성: Gemini가 생성한 코드 리뷰를 깃허브 댓글로 추가합니다.

워크플로우의 진행 과정을 좀 더 구체적으로 살펴보겠습니다.

1. GitHub Trigger

GitHub Trigger 노드로 PR 관련 이벤트가 발생하면 워크플로우가 자동으로 실행됩니다.
단, 노드 사용 전에 GitHub 계정에 대한 인증이 필요합니다.

계정 인증은 Credential to connect with을 클릭한 후 PAT 토큰 방식과 OAuth2 방식 중 하나를 선택해서 인증이 가능합니다.

2. 이벤트 비교

GitHub Trigger 노드에서 PR 이벤트가 발생하면 응답으로 위와 같은 JSON 응답이 반환됩니다.
이 중 action 속성을 opened로 설정해 PR 이벤트가 최초로 생성됐는지 비교합니다.

💡 노드의 Routing RulesSynchronize를 추가하면 PR에 새로 커밋된 경우를 추가로 분류할 수 있습니다.

3. 파일 변경사항 추적

PR에서 변경된 파일들의 정보를 가져오도록 URL을 표현식을 이용해서 다음과 같이 입력합니다.

https://api.github.com/repos/{{ $json.body.repository.full_name }}/pulls/{{ $json.body.pull_request.number }}/files

또한 GitHub API 호출을 위해서 Authentication을 클릭 해 Predefined Credential Type을 선택한 후 인증 타입을 위에서 사용한 깃허브 인증 계정을 선택합니다.

4. 마크다운 변환

GitHub API를 통해 가져온 변경사항을 그대로 AI에게 전달해도 동작은 하지만
간혹 AI가 변경사항에 대해 제대로 이해하지 못하는 경우가 발생할 수 있습니다.
따라서 AI가 읽기 쉬운 마크다운 형식으로 변환하는 과정이 필요합니다.

const files = $input.all().map(item => item.json);
let diffs = '';

for (const file of files) {
  const filename = file.filename.split('/').pop();
  
  diffs += `### 파일 이름: ${filename}\n\n`;
  if (file.patch) {
    const safePatch = file.patch.replace(/```/g, "''");
    diffs += "```diff\n";
    diffs += safePatch;
    diffs += "\n```\n";
  } else {
    diffs += "_패치 정보 없음 (바이너리 파일로 추정)_"
  }
}
return [
  {
    json: {
      diffs: diffs
    }
  }
];

위와 같이 자바스크립트를 작성하면 아래처럼 마크다운 형식으로 변환하게 됩니다.

### 파일 이름: UserController.java

```diff
+ public class UserController {
+   @PostMapping("/users")
+   public ResponseEntity<User> createUser(@RequestBody User user) {
-     return userService.save(user); // 제거된 코드
+     return userService.saveUser(user); // 새로 작성된 코드
+   }
+ }

5. AI Agent

AI Agent 노드로 AI에게 프롬프트를 전달하는 방식은 채팅 방식과 직접 정의하는 방식 두 가지가 존재합니다.
이번 워크플로우에서는 미리 정의된 프롬프트를 사용하기 위해 Source For PromtDefine below로 선택해서 다음과 같이 프롬프트를 입력했습니다.

프롬프트 예시

당신은 10년 경력의 Java Spring Boot와 React를 잘 다루는 시니어 개발자이자 코드 리뷰어입니다.
실제 프로덕션 환경에서 운영되는 시스템을 관리해온 경험을 바탕으로 코드를 분석합니다.

1. getCodeConvention() 툴을 반드시 사용해서 팀원이 코드 컨벤션을 준수했는지 추가로 확인하세요.
2. 사용자가 제공한 코드를 분석하여 해당 코드를 가독성, 성능, 보안 측면에서 면밀히 검토하세요.
3. 제공된 코드를 분석하고, 우선순위별로 이슈를 분류하여 실무에 바로 적용 가능한 개선사항을 제시해주세요.

---

{{ $json.diffs }}

이후에 하단의 Chat Model을 클릭해 사용할 LLM 모델을 선택합니다.

무료로 코드 리뷰를 진행하기 위해 구글의 gemini-2.5-flash을 선택했습니다.

Gemini API 사용을 위해 구글 클라우드 콘솔에서 API 키를 발급받은 후 n8n에서 추가로 인증 설정을 해줘야 합니다.
➡️ https://console.cloud.google.com/

이후에는 팀의 코드 컨벤션 문서를 제공하기 위해 Tool로 구글 시트 툴을 추가합니다.

6. getCodeConvention

AI가 코드 컨벤션 문서를 언제 사용할 지 알려주기 위해 Tool Description을 수동으로 설정해 툴에 대한 설명을 추가해줬습니다.
이후 코드 컨벤션 문서와 시트를 선택하면 AI가 필요한 때에 구글 시트 툴을 실행해 코드 컨벤션 문서를 가져오게 됩니다.

구글 시트 사용을 위해서 Google Sheets API 키가 필요합니다.
➡️ https://console.cloud.google.com/

7. 댓글 생성

댓글 생성을 위해서 GitHub 노드를 다음과 같이 작성합니다.

  • Resource: Review
  • Opertaion: Create
  • Repository Owner: By URL, {{ $('이벤트 비교').first().json.body.repository.owner.html_url }}
  • Repository Name: By URL, {{ $('이벤트 비교').first().json.body.repository.html_url }}
  • PR Number: {{ $('이벤트 비교').first().json.body.pull_request.number }}
  • Evnet: Comment
  • Body: {{ $json.output }}

이후에 워크플로우 작성 화면에서 상단의 Active 버튼을 눌러 워크플로우를 활성화하면 PR 이벤트가 발생할 때마다 AI 코드 리뷰 워크플로우가 자동으로 실행됩니다.

워크플로우 실행 결과

🙆‍♂️ 마무리하며

n8n으로 만든 AI 코드 리뷰 워크플로우 덕분에 실제로 프로젝트를 진행하면서 코드리뷰에
소모되는 시간을 줄일 수 있었습니다.

코딩 실력이 부족해도, 인프라를 몰라도, API 문서가 어려워도 상관없어요.
마우스로 끌어다 놓기만 하면 됩니다!


🔗 참고 링크들

profile
나야 루이지

0개의 댓글