Skip to content

-reset- [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링(A파트)#191

Merged
yujin9907 merged 3 commits into
developfrom
refactor/#187-kafka-architecture-refactoring
Mar 22, 2026
Merged

-reset- [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링(A파트)#191
yujin9907 merged 3 commits into
developfrom
refactor/#187-kafka-architecture-refactoring

Conversation

@yujin9907

@yujin9907 yujin9907 commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

PR 제목

[Feat/Fix/Refactor/Docs/Chore 등]: 간결하게 변경 내용을 요약해주세요. (예: Feat: 사용자 로그인 기능 구현)

  • 리팩토링 A파트
  • 스프링 이슈 첨부 확인

✨ 변경 유형 (하나 이상 선택)

  • Feat: 새로운 기능 추가
  • Fix: 버그 수정
  • Refactor: 코드 리팩토링 (기능 변경 없음)
  • Docs: 문서 업데이트 (주석, README 등)
  • Chore: 기타 변경 (빌드 설정, 라이브러리 업데이트 등)
  • Test: 테스트 코드 추가/수정

📚 변경 내용

구체적으로 어떤 변경 사항이 있는지, 왜 이러한 변경이 필요한지 설명해주세요.
(예: 사용자 회원가입 시 이메일 중복 확인 로직 추가. 기존 로직에서 누락된 부분 발견하여 수정.)

  • Kafka Producer 관련 코드 전체 제거 (Spring 서버로 책임 이관 완료)
    • base_producer.py, message.py, report_producer.py, report_producer_impl.py 삭제
    • report_controller.py (리포트 생성 라우터) 제거
    • kafka_config.py에서 producer 설정 필드 제거, kafka_broker.py producer TODO 주석 제거
  • Consumer 에러 핸들링 개선: 처리 실패 시 예외를 re-raise하여 메시지 유실 방지
  • requirements.txt 정리 및 의존성 업데이트
  • kafka_config 설정 컨슈머에 적용(base_consumer.py)

⚙️ 주요 작업 (선택 사항)

  • 새로운 API 추가 (API 명세서 링크 또는 간단한 정보)
  • 데이터베이스 스키마 변경 (변경 내용 명시)
  • 외부 라이브러리 추가/제거 (라이브러리 명시)

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 변경 사항에 대한 문서 업데이트가 필요한 경우 반영했습니다.

🔗 관련 이슈 (선택 사항)

해당 PR이 해결하는 이슈 또는 관련 있는 이슈가 있다면 링크를 걸어주세요.
(예: #123, ABC-456)

💬 기타 (선택 사항)

리뷰어에게 전달하고 싶은 추가 정보나 궁금한 점이 있다면 작성해주세요.

! 반드시 확인 !

역방향 메시지 보낼 때 producer 관련 재설정 필요함
v1 제거 필요함
save vector 파리미터 확인 필요함

카프카 ui 로컬에서 확인 시 아래 설정 후 컨테이너 실행

  kafka-ui:
    image: provectuslabs/kafka-ui
    container_name: kafka-ui
    ports:
      - "8989:8080"
    restart: always
    environment:
      - DYNAMIC_CONFIG_ENABLED=true
      - KAFKA_CLUSTERS_0_NAME=local
      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=broker:29092
    volumes:
      - ./kafka:/var/lib/kafka/data
    depends_on:
      - broker
    networks:
      - app-network

Ochangmin524 and others added 3 commits March 15, 2026 14:13
- Python 애플리케이션의 Kafka 메시지 발행(생산) 책임이 Spring 서버로 이관됨을 반영
- 더 이상 사용되지 않는 리포트 생성 컨트롤러 및 Kafka 프로듀서 관련 코드 삭제
- Kafka 설정 및 `base_producer`에 프로듀서의 현재 상태 및 재시도 전략에 대한 주석 추가 및 명확화(스프링으로 역방향 메시지 발행 시 TODO 참고)

#187
@yujin9907 yujin9907 self-assigned this Mar 17, 2026
@yujin9907 yujin9907 added 🐛 버그 버그 발생 🛠️ 리팩토링 리팩토링 labels Mar 17, 2026
@yujin9907 yujin9907 linked an issue Mar 17, 2026 that may be closed by this pull request
@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 리포트 생성 시스템을 비동기 Kafka 기반 아키텍처로 전환하여, 기존 서비스에서 Producer의 역할을 분리하고 메시지 처리의 견고성과 확장성을 향상시키는 데 중점을 둡니다. 이를 통해 리포트 생성 로직이 더욱 유연하고 독립적으로 운영될 수 있도록 기반을 마련했습니다.

Highlights

  • 리포트 생성 아키텍처 리팩토링: 리포트 생성 아키텍처가 Spring 기반 동기 방식에서 Kafka 기반 비동기 방식으로 리팩토링되었습니다. 이는 리포트 생성 로직의 책임 분리와 확장성을 목표로 합니다.
  • Kafka Producer 관련 코드 제거: 기존 Kafka Producer 관련 코드(base_producer.py, message.py, report_producer.py, report_producer_impl.py)가 모두 제거되었으며, Producer의 책임은 Spring 서버로 이관되었습니다.
  • 리포트 생성 API 엔드포인트 제거: domain/report/controller/report_controller.py 파일이 삭제되어, 기존의 리포트 생성 API 엔드포인트가 제거되었습니다.
  • Consumer 에러 핸들링 개선: Kafka Consumer에서 메시지 처리 실패 시 예외를 re-raise하도록 개선하여 메시지 유실을 방지하고, kafka_config 설정을 base_consumer.py에 적용했습니다.
  • Kafka 설정 및 의존성 업데이트: kafka_config.py에서 Producer 설정 필드가 제거되고, kafka_broker.py의 Producer 관련 TODO 주석이 업데이트되었습니다. 또한 requirements.txt가 정리되고 의존성이 업데이트되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • core/config/kafka_config.py
    • Producer 압축 방식을 'gzip'에서 'snappy'로 변경했습니다.
    • Consumer의 오프셋 리셋 정책을 'latest'에서 'earliest'로 변경했습니다.
    • Producer 설정에 대한 TODO 주석을 추가하여 향후 역방향 메시지 발행 시 재설정 필요성을 명시했습니다.
  • core/kafka/base_consumer.py
    • Kafka Consumer가 kafka_config의 설정을 직접 사용하도록 변경하여, group_id, auto_offset_reset, auto_commit, auto_commit_interval_ms를 구독 시점에 적용하도록 했습니다.
    • 에러 처리 로직(_handle_error)에 예외를 의도적으로 삼키고 메시지 유실을 허용한다는 주석을 추가했습니다.
    • 메시지 처리 중 데이터 조회 실패 시(_get_report_and_video가 None 반환) logger.error와 함께 raise를 추가하여 오류를 명확히 알리도록 변경했습니다.
  • core/kafka/base_producer.py
    • Kafka 메시지 발행을 위한 기본 Producer 클래스가 제거되었습니다.
  • core/kafka/kafka_broker.py
    • 전역 Kafka Broker 설정에 Producer 관련 TODO 주석을 추가하여 향후 설정 필요성을 명시했습니다.
  • core/kafka/message.py
    • Kafka 메시지 구조를 정의하는 Pydantic 모델과 관련 Enum이 제거되었습니다.
  • domain/report/controller/report_controller.py
    • 리포트 생성 API 엔드포인트와 관련 로직을 포함하는 컨트롤러 파일이 제거되었습니다.
  • domain/report/service/report_consumer_impl_v2.py
    • 메시지 핸들러(handle_overview_v2, handle_analysis_v2)에서 _get_report_and_video 호출 결과가 없을 경우, 에러 로깅 후 예외를 발생시키도록 수정하여 메시지 처리 실패를 명확히 했습니다.
  • domain/report/service/report_producer.py
    • 리포트 생성을 위한 Producer 인터페이스 파일이 제거되었습니다.
  • domain/report/service/report_producer_impl.py
    • 리포트 생성을 위한 Producer 구현체 파일이 제거되었습니다.
  • main.py
    • FastAPI 애플리케이션에서 report_router의 포함이 제거되었습니다.
  • requirements.txt
    • python-multipart 의존성을 추가하고, pydantic-settings의 위치를 변경했습니다.
    • Kafka 관련 의존성으로 python-snappy==0.7.3을 추가했습니다.
    • 전반적인 의존성 목록을 정리하고 재구성했습니다.
Activity
  • 작성자 yujin9907은 리포트 생성 아키텍처를 Spring에서 Kafka 기반 비동기 구조로 리팩토링하는 작업을 진행했습니다.
  • PR 설명에 따르면, Kafka Producer 관련 코드 전체 제거, Consumer 에러 핸들링 개선, requirements.txt 정리 및 의존성 업데이트, kafka_config 설정을 컨슈머에 적용하는 등의 주요 변경 사항이 포함되어 있습니다.
  • 관련 이슈 #187이 언급되어 있으며, 역방향 메시지 발행 시 Producer 재설정, v1 제거, save vector 파라미터 확인 등의 추가 작업이 필요함을 명시했습니다.
  • 로컬 Kafka UI 설정을 위한 가이드가 PR 설명에 포함되어 있습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@yujin9907 yujin9907 changed the title [Refactor] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링 [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링 Mar 17, 2026
@github-actions

Copy link
Copy Markdown

🤖 Gemini AI 코드 리뷰

❌ Gemini API 호출 실패: 최대 재시도 횟수 초과


이 리뷰는 Gemini AI가 자동으로 생성했습니다. 참고용으로만 활용해주세요.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이 PR은 리포트 생성 아키텍처를 Kafka 기반의 비동기 구조로 리팩토링하는 중요한 변경을 포함하고 있습니다. Producer 관련 코드를 제거하고 Consumer 로직에 집중하여 서비스의 책임을 명확히 한 점이 좋습니다. 또한, 설정 파일을 통해 Kafka Consumer의 동작을 제어하도록 개선한 부분도 긍정적입니다.

리뷰에서는 메시지 유실 방지를 위한 에러 핸들링 개선에 중점을 두었습니다. base_consumer.py의 에러 처리 방식이 PR의 의도와 다르게 동작하여 메시지 유실을 유발할 수 있는 치명적인 문제를 발견하여 수정을 제안했습니다.

추가적으로, handle_overview_v2handle_analysis_v2의 에러 핸들링이 개선되었지만, handle_idea_v2에는 동일한 개선이 적용되지 않아 일관성이 부족합니다. 이 부분도 함께 수정하면 더 견고한 코드가 될 것입니다.

Comment on lines 74 to 78
async def _handle_error(self, topic: str, message: Dict[str, Any], error: Exception):
"""에러 처리"""
"""에러 처리 - 의도적으로 예외를 삼킴 (메시지 유실 허용, DLQ 없음)
NOTE: auto_commit=True 설정과 함께 동작하므로 에러 발생 시 해당 메시지는 오프셋이 커밋되어 재처리되지 않음
"""
logger.error(f"메시지 처리 실패: {topic}, 오류: {error}")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

PR 설명에 "처리 실패 시 예외를 re-raise하여 메시지 유실 방지"라고 명시되어 있지만, 현재 _handle_error 구현은 예외를 로깅만 하고 삼키고 있어 메시지 유실을 유발할 수 있습니다. auto_commit=True 설정에서는 핸들러에서 예외가 전파되지 않으면 오프셋이 정상적으로 커밋되어 해당 메시지는 재처리되지 않습니다.

domain/report/service/report_consumer_impl_v2.py에서 예외를 raise하도록 수정한 부분이 의도대로 동작하려면, _handle_error에서도 예외를 다시 발생시켜 FastStream이 메시지 처리에 실패했음을 인지하고 오프셋 커밋을 방지하도록 해야 합니다.

이렇게 수정하면 메시지 처리 실패 시 재시도 로직이 정상적으로 동작하여 메시지 유실을 막을 수 있습니다.

Suggested change
async def _handle_error(self, topic: str, message: Dict[str, Any], error: Exception):
"""에러 처리"""
"""에러 처리 - 의도적으로 예외를 삼킴 (메시지 유실 허용, DLQ 없음)
NOTE: auto_commit=True 설정과 함께 동작하므로 에러 발생 해당 메시지는 오프셋이 커밋되어 재처리되지 않음
"""
logger.error(f"메시지 처리 실패: {topic}, 오류: {error}")
async def _handle_error(self, topic: str, message: Dict[str, Any], error: Exception):
"""에러 처리 - 예외를 다시 발생시켜 메시지 재처리를 유도합니다."""
logger.error(f"메시지 처리 실패: {topic}, 오류: {error}")
raise error

@yujin9907 yujin9907 changed the title [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링 [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링(A파트) Mar 17, 2026
@yujin9907 yujin9907 merged commit ca7e0b5 into develop Mar 22, 2026
1 check passed
@yujin9907 yujin9907 changed the title [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링(A파트) -reset- [REFACTOR] 리포트 생성 아키텍처 Spring -> Kafka 기반 비동기 구조로 리팩토링(A파트) Apr 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 버그 버그 발생 🛠️ 리팩토링 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[REFACTOR]: 카프카 구조 리펙토링

2 participants