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

n8n은 Fair-code 라이선스로 제공되는 워크플로우 자동화 플랫폼입니다.
노코드/로우코드 방식으로 다양한 서비스와 API를 연결하여 복잡한 자동화 워크플로우를 시각적으로 구축할 수 있습니다.
💡 셀프호스팅 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의 기본적인 노드를 소개드리겠습니다 🙆♂️

{ name: "김철수", age: 30 } → { userName: "김철수", userAge: 30 }





n8n에서 정적인 값 대신 동적인 데이터를 사용할 수 있게 해주는 기능입니다.
이전 노드의 결과값을 참조하거나, 조건에 따라 다른 값을 설정할 때 사용합니다.
예시: "안녕하세요 루이지님" (정적) → "안녕하세요, {{사용자명}}님!" (동적)
{{ $json.fieldName }} // 현재 노드 데이터
{{ $('노드명').first().json }} // 특정 노드 데이터
// 문자열 결합
{{ $json.firstName + ' ' + $json.lastName }}
// 템플릿 리터럴
{{ `안녕하세요, ${$json.name}님!` }}
// 삼항 연산자
{{ $json.status === 'active' ? '활성' : '비활성' }}
// 안전한 접근
{{ $json.user?.email || 'default@email.com' }}

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

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

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

GitHub Trigger 노드에서 PR 이벤트가 발생하면 응답으로 위와 같은 JSON 응답이 반환됩니다.
이 중 action 속성을 opened로 설정해 PR 이벤트가 최초로 생성됐는지 비교합니다.
💡 노드의
Routing Rules에Synchronize를 추가하면 PR에 새로 커밋된 경우를 추가로 분류할 수 있습니다.

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을 선택한 후 인증 타입을 위에서 사용한 깃허브 인증 계정을 선택합니다.

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); // 새로 작성된 코드
+ }
+ }

AI Agent 노드로 AI에게 프롬프트를 전달하는 방식은 채팅 방식과 직접 정의하는 방식 두 가지가 존재합니다.
이번 워크플로우에서는 미리 정의된 프롬프트를 사용하기 위해 Source For Promt를 Define 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로 구글 시트 툴을 추가합니다.

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

댓글 생성을 위해서 GitHub 노드를 다음과 같이 작성합니다.
ReviewCreateBy URL, {{ $('이벤트 비교').first().json.body.repository.owner.html_url }}By URL, {{ $('이벤트 비교').first().json.body.repository.html_url }}{{ $('이벤트 비교').first().json.body.pull_request.number }}Comment{{ $json.output }}
이후에 워크플로우 작성 화면에서 상단의 Active 버튼을 눌러 워크플로우를 활성화하면 PR 이벤트가 발생할 때마다 AI 코드 리뷰 워크플로우가 자동으로 실행됩니다.


n8n으로 만든 AI 코드 리뷰 워크플로우 덕분에 실제로 프로젝트를 진행하면서 코드리뷰에
소모되는 시간을 줄일 수 있었습니다.
코딩 실력이 부족해도, 인프라를 몰라도, API 문서가 어려워도 상관없어요.
마우스로 끌어다 놓기만 하면 됩니다!