From f2b9371f4e5556086b2255fa1fcf68613ff125cd Mon Sep 17 00:00:00 2001 From: suhee Date: Sat, 19 Oct 2024 17:05:35 +0900 Subject: [PATCH 1/3] refactor: Modify MemberService, code-review.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MemberService - 코드 리뷰 테스트를 위해 일부 리팩토링 진행 - 불필요한 예외 처리 제거, 메서드 분리 - code-review.yml - 최종 요약 comment 는 별도 요청으로 분리 - openai API 요청 max_token 설정 --- .github/workflows/code-review.yml | 37 ++++++++++++++++--- .../member/domain/service/MemberService.java | 35 ++++++++++-------- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/.github/workflows/code-review.yml b/.github/workflows/code-review.yml index bc6e1fa..72070de 100644 --- a/.github/workflows/code-review.yml +++ b/.github/workflows/code-review.yml @@ -43,10 +43,11 @@ jobs: # 시스템 프롬프트 및 모델명 가져오기 system_prompt = """${{ secrets.SYSTEM_PROMPT }}""" model_name = "${{ secrets.OPENAI_MODEL }}" + summary_system_prompt = """${{ secrets.SUMMARY_SYSTEM_PROMPT }}""" # 처리된 파일과 라인 기록 (중복 방지) processed_files = set() # 각 파일을 기록 - processed_lines = {} # 각 파일별로 라인을 기록하기 위한 딕셔너리로 수정 + review_history = [] # 각 파일의 리뷰 기록을 저장 # GitHub API 호출 로그 print("Fetching changed files from GitHub API...") @@ -99,6 +100,7 @@ jobs: {"role": "system", "content": system_prompt}, {"role": "user", "content": f"Here is the code diff for context:\n{patch}"} ], + max_tokens=500, timeout=30 ) except Exception as e: @@ -109,6 +111,9 @@ jobs: print(f"GPT response received for file: {file_path}") print(f"Review comment: {review_comment}") + # 리뷰 히스토리 기록 + review_history.append(f"File: {file_path}\nReview: {review_comment}") + # 변경된 파일과 라인에 리뷰 코멘트를 추가 commit_id = "${{ github.event.pull_request.head.sha }}" line_number = file.get('patch').split('\n').index(next(line for line in file['patch'].split('\n') if line.startswith('+'))) + 1 @@ -135,14 +140,34 @@ jobs: # 각 파일을 처리한 후 파일 이름을 기록 processed_files.add(file_path) + # 최종 요약 요청 + review_history_text = "\n\n".join(review_history) + print("Requesting final review summary from GPT...") + try: + final_review_response = openai.chat.completions.create( + model=model_name, + messages=[ + {"role": "system", "content": summary_system_prompt}, + {"role": "user", "content": review_history_text} + ], + max_tokens=1000, + timeout=60 # 타임아웃을 60초로 설정 + ) + except Exception as e: + print(f"Error in GPT summary request: {e}") + exit(1) + + final_review_comment = final_review_response.choices[0].message.content + print(f"Final review comment received: {final_review_comment}") + + # 최종 요약 코멘트 추가 + comment_url = f"https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" + requests.post(comment_url, headers=headers, data=json.dumps({"body": final_review_comment})) + print("Final review comment posted.") + else: print(f"Unexpected status code: {response.status_code}") exit(1) - # 최종 리뷰 요약 코멘트 추가 - final_comment = "### 최종 리뷰 요약: .java 파일에 대한 모든 변경 사항을 검토 완료했습니다." - comment_url = f"https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" - requests.post(comment_url, headers=headers, data=json.dumps({"body": final_comment})) - print("Final review comment posted.") exit(0) EOF diff --git a/src/main/java/app/member/domain/service/MemberService.java b/src/main/java/app/member/domain/service/MemberService.java index 2aced12..6d32c64 100644 --- a/src/main/java/app/member/domain/service/MemberService.java +++ b/src/main/java/app/member/domain/service/MemberService.java @@ -55,33 +55,36 @@ public MemberVo getMember(Long memberId) { @Transactional public UpdateMemberVo updateMember(UpdateMemberDto dto) { try { - Member member = memberRepository.findById(dto.getMemberId()).orElseThrow(() -> new CustomException( - ResponseCode.NOT_EXIST)); - log.info("### 회원 조회 결과: {}", member); + Member member = memberRepository.findById(dto.getMemberId()) + .orElseThrow(() -> new CustomException(ResponseCode.NOT_EXIST)); + + log.debug("### 회원 조회 결과: {}", member); - if (!dto.getName().isBlank()) { - member.setName(dto.getName()); - } - if (!dto.getEmail().isBlank()) { - member.setEmail(dto.getEmail()); - } - if (!dto.getRole().equals(member.getRole())) { - member.setRole(dto.getRole()); - } - member.setUpdatedMemberId(dto.getMemberId()); + updateMemberFields(member, dto); Member result = memberRepository.save(member); - log.info("### 회원 수정 결과: {}", result); + log.debug("### 회원 수정 결과: {}", result); return UpdateMemberVo.toVo(result); } catch (DataIntegrityViolationException e) { throw new CustomException(ResponseCode.CONFLICT_DATA); } catch (CustomException e) { throw new CustomException(e.getResponseCode()); - } catch (Exception e) { - throw e; } } + private void updateMemberFields(Member member, UpdateMemberDto dto) { + if (!dto.getName().isBlank()) { + member.setName(dto.getName()); + } + if (!dto.getEmail().isBlank()) { + member.setEmail(dto.getEmail()); + } + if (!dto.getRole().equals(member.getRole())) { + member.setRole(dto.getRole()); + } + member.setUpdatedMemberId(dto.getMemberId()); + } + } From 5bd163d8add7e26d11e7fc3050ab1886e20989ad Mon Sep 17 00:00:00 2001 From: suhee Date: Sat, 19 Oct 2024 17:10:00 +0900 Subject: [PATCH 2/3] fix: Modify code-review.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - code-review.yml - 최종 요약 comment 는 별도 요청으로 분리 - openai API 요청 max_token 설정 --- .github/workflows/code-review.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/code-review.yml b/.github/workflows/code-review.yml index 72070de..6f4abe5 100644 --- a/.github/workflows/code-review.yml +++ b/.github/workflows/code-review.yml @@ -45,7 +45,7 @@ jobs: model_name = "${{ secrets.OPENAI_MODEL }}" summary_system_prompt = """${{ secrets.SUMMARY_SYSTEM_PROMPT }}""" - # 처리된 파일과 라인 기록 (중복 방지) + # 처리된 파일 기록 (중복 방지) processed_files = set() # 각 파일을 기록 review_history = [] # 각 파일의 리뷰 기록을 저장 @@ -86,10 +86,6 @@ jobs: patch = file.get('patch', '') print(f"Analyzing patch for file: {file_path}") - # 각 파일마다 중복 라인 처리를 위한 집합 생성 - if file_path not in processed_lines: - processed_lines[file_path] = set() - # 전체 패치 내용을 GPT에게 전달 if patch: # 패치가 존재할 경우에만 처리 print(f"Calling GPT API for patch in file: {file_path}") From e5aca703f72b473e738018283e061142434e3825 Mon Sep 17 00:00:00 2001 From: suhee Date: Sat, 19 Oct 2024 17:12:55 +0900 Subject: [PATCH 3/3] fix: Modify code-review.yml --- .github/workflows/code-review.yml | 41 ++++++++++++++++--------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/.github/workflows/code-review.yml b/.github/workflows/code-review.yml index 6f4abe5..a781250 100644 --- a/.github/workflows/code-review.yml +++ b/.github/workflows/code-review.yml @@ -112,26 +112,27 @@ jobs: # 변경된 파일과 라인에 리뷰 코멘트를 추가 commit_id = "${{ github.event.pull_request.head.sha }}" - line_number = file.get('patch').split('\n').index(next(line for line in file['patch'].split('\n') if line.startswith('+'))) + 1 - comment_body = { - "body": review_comment, - "path": file_path, - "line": line_number, - "side": "RIGHT", - "commit_id": commit_id - } - - # 코멘트를 추가하기 전 파일 경로와 위치를 로그로 출력 - print(f"Commenting on file: {file_path}, line: {line_number}") - - comment_url = f"https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments" - response = requests.post(comment_url, headers=headers, data=json.dumps(comment_body)) - - # 응답 상태 확인 - if response.status_code == 201: - print(f"Comment posted successfully for file: {file_path}") - else: - print(f"Failed to post comment. Status code: {response.status_code}, Response: {response.text}") + position = file.get('position', None) # 'position' 필드 사용 + if position is not None: + comment_body = { + "body": review_comment, + "path": file_path, + "position": position, # 'line' 대신 'position' 사용 + "side": "RIGHT", + "commit_id": commit_id + } + + # 코멘트를 추가하기 전 파일 경로와 위치를 로그로 출력 + print(f"Commenting on file: {file_path}, position: {position}") + + comment_url = f"https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments" + response = requests.post(comment_url, headers=headers, data=json.dumps(comment_body)) + + # 응답 상태 확인 + if response.status_code == 201: + print(f"Comment posted successfully for file: {file_path}") + else: + print(f"Failed to post comment. Status code: {response.status_code}, Response: {response.text}") # 각 파일을 처리한 후 파일 이름을 기록 processed_files.add(file_path)