Search

[TGC] LLM을 이용한 코드리뷰 자동화 스터디

1회차

이번 주는 OT로 개발조직에서 코드 리뷰를 어떤 방식으로 어떤 프로세스를 태워서 활용하고 싶은지에 대해서 간단히 고민하고 와주시면 좀 더 의미있는 자리가 될 것 같습니다.

1. 현재 코드리뷰 방식

1-1. PR기준

이슈 단위
JIRA를 통해 생성되는 이슈(버그 해결, 기능 개발, 성능 고도화)기준으로 PR 생성

1-2. 리뷰어 지정 방식

백엔드 전체 지정(default)

1-3. 리뷰 진행 방식

(스프린트 항목) PR 리뷰이가 코드에 대한 전체적인 설명을 하며 리뷰어들은 질문 및 피드백 제공
(핫픽스 항목) PR 리뷰이가 리뷰어 지정 후 동일한 과정으로 리뷰 진행
하지만, 이슈가 기하급수적으로 늘어나고 다들 개발일정이 빡빡한 시점에선 리뷰진행 불가능한 상황

2. LLM 기반 리뷰 프로세스 가안

graph TD
A[개발자 PR 생성] --> B[LLM 자동 리뷰]
B --> C[자동 피드백 코멘트 등록]
C --> D[개발자 수정 or 리뷰어 확인]
D --> E[리뷰어가 핵심 로직 및 설계 위주 검토]
E --> F[Merge 결정]
Mermaid
복사
LLM 자동리뷰를 통해 사내 코딩 컨벤션과 lint rule이나 잠재적 버그 포인트등을 사전 검사
insight같은 경우 lint rule 위배된 코드가 너무 많아서 현실성이 조금 떨어지는 부분이 있다.
LLM이 PR에 직접 코멘트를 남기거나 요약한 내용을 정리해서 업로드
리뷰어는 도메인 관점의 비즈니스 로직 피드백에 집중

3. 도입 우선순위

단계
활용 방식
기대 효과
1단계
사내 코딩 스타일/린트 자동 리뷰
반복 코멘트 줄이기
2단계
보안/성능 이슈 탐지
예외처리 누락, N+1, 슬로우 코드 등 선제 대응
3단계
도메인 특화 규칙 학습
사내 규칙 기반 피드백 (ex. 우리팀의 인증 방식, 트랜잭션 규칙 등)
4단계
코드리뷰 가이드 챗봇
신입이 "이거 왜 리뷰 걸린 거야?" → 챗봇에게 설명 듣기

4. LLM 리뷰 결과 활용 방안

리뷰 통계 대시보드화
⇒ 자주 반복적으로 발생하는 리뷰에 대한 정보 취합 및 팀원 코드 교육
리뷰 통계 데이터를 통한 개발자 개발 취약점 분석 및 보완 방식 피드백
⇒ 팀원별로 자주 발생하는 피드백 포인트를 카테고리화하여 역량 보완 리포트 생성
LLM 피드백 퀄리티 향상
⇒ 좋은 피드백과 나쁜 피드백에 대한 리뷰이 피드백을 통해 LLM 리뷰 기능 개선

5. LLM Bot 개발 구성 요소

1.
PR 이벤트 트리거 수신
PR생성 및 업데이트시 트리거되어 Webhook을 통해 llm bot이 이벤트 트리거가 되도록 하기
bitbucket은 Webhook으로 PR이벤트(pullrequest:created, pullrequest:updated) 수신
2.
변경된 파일이나, diff 내용 파싱하기
Bitbucket REST API 사용하여 변경점 가져오기
clone해서 직접 git diff로 파싱하기
3.
LLM 요청 프롬프트 엔지니어링
[설명 예시] - 서비스 명세: 인증 API - 사내 코딩 스타일: 변수명은 camelCase, Controller에는 비즈니스 로직 포함하지 말 것 - 린트 규칙: import 순서, 코드 길이 120자 이하 <변경된 코드> diff --git a/UserController.kt b/UserController.kt @@ -1,5 +1,6 @@ +import java.util.UUID ...
Plain Text
복사
4.
LLM 모델 연동
val prompt = "... 위 내용 ..." val response = openAiClient.chat(prompt)
Kotlin
복사
5.
Bitbucket 리뷰 코멘트 등록
Bitbucket API로 PR에 댓글 달기
POST /repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/comments Authorization: Bearer {token} Content-Type: application/json { "content": { "raw": "❗ 변수명이 모호해요. camelCase로 작성해주세요." }, "inline": { "path": "src/UserController.kt", "to": 12 } }
Kotlin
복사