Skip to content

main으로 머지#93

Merged
kkshyun merged 44 commits intomainfrom
develop
Feb 18, 2026
Merged

main으로 머지#93
kkshyun merged 44 commits intomainfrom
develop

Conversation

@kkshyun
Copy link
Copy Markdown
Member

@kkshyun kkshyun commented Feb 18, 2026

📍 PR 타입 (하나 이상 선택)

  • 기능 추가
  • 버그 수정
  • 의존성, 환경 변수, 빌드 관련 코드 업데이트
  • 기타 사소한 수정

❗️ 관련 이슈 링크

Close #

📌 개요

🔁 변경 사항

📸 스크린샷

👀 기타 더 이야기해볼 점

✅ 체크 리스트

  • PR 템플릿에 맞추어 작성했어요.
  • 변경 내용에 대한 테스트를 진행했어요.
  • 프로그램이 정상적으로 동작해요.
  • PR에 적절한 라벨을 선택했어요.
  • 불필요한 코드는 삭제했어요.

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • FCM 푸시 알림 기능 추가 - 디바이스 등록 및 일일/주간 알림 수신 가능
    • 모니터링 및 성능 추적 대시보드 추가
  • 개선사항

    • 검색 기능 개선 - 대소문자 구분 없는 검색 지원
    • AI 응답 토큰 제한 확대로 더 상세한 답변 제공
    • 인증 시스템 안정성 향상
  • 문서

    • 프로젝트 아키텍처 및 모니터링 설정 문서화

kkshyun and others added 30 commits February 11, 2026 23:43
#63 🐛  fix : 모니터링 도커 수정
# Conflicts:
#	src/main/resources/application.yaml
@kkshyun kkshyun merged commit 5203528 into main Feb 18, 2026
1 check was pending
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 18, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

Firebase 기반 FCM 푸시 알림 기능을 추가하고, 관찰성(observability) 인프라를 강화하며, 기존 인증/검색 로직을 개선합니다. 포괄적인 문서도 함께 업데이트됩니다.

Changes

Cohort / File(s) Summary
FCM 푸시 알림 기능 (Firebase)
build.gradle, src/main/java/.../notification/domain/service/FcmService.java, src/main/java/.../notification/persistence/entity/FcmTokenEntity.java, src/main/java/.../notification/persistence/repository/FcmTokenRepository.java, src/main/java/.../notification/presentation/FcmController.java, src/main/java/.../notification/domain/constant/DeviceType.java, src/main/java/.../notification/application/dto/request/FcmTokenRequest.java, src/main/java/.../notification/exception/NotificationException.java, src/main/java/.../notification/exception/code/NotificationErrorCode.java, src/main/java/.../global/config/FirebaseConfig.java
Firebase Admin SDK 의존성 추가 및 FCM 토큰 저장/삭제/푸시 알림 발송 로직 구현. 디바이스 타입별 토큰 관리 및 무효 토큰 자동 정리 기능 포함.
알림 서비스 통합
src/main/java/.../notification/domain/service/NotificationService.java, src/main/java/.../notification/application/usecase/NotificationScheduler.java, src/main/java/.../notification/infrastructure/template/NotificationTemplateBuilder.java, src/main/java/.../mypage/domain/service/MypageService.java, src/main/java/.../user/persistence/repository/UserRepository.java
일일/주간 알림을 이메일과 FCM 이중 발송 방식으로 변경. 속성 기반 스케줄 설정 추가 및 사이트 URL 주입. 사용자 탈퇴 시 FCM 토큰도 함께 삭제.
관찰성(Observability) 인프라
infra/observability/docker-compose.yml, infra/observability/docker-compose.ec2.yml, infra/observability/prometheus/prometheus.yml, infra/observability/prometheus/prometheus.yml.template, infra/observability/promtail/promtail.yml, infra/observability/grafana/dashboards/finsight-overview.json
Prometheus 설정을 템플릿화하여 환경변수 기반 동적 생성. Promtail 로그 수집 서비스 추가. Grafana 대시보드 활성화 제어 및 주요 메트릭(AI, 크롤러, HTTP) 모니터링 패널 구성.
AI 작업 메트릭 및 로깅
src/main/java/.../ai/domain/metrics/AiMetrics.java, src/main/java/.../ai/domain/service/AiJobService.java, src/main/java/.../ai/domain/client/OpenAiClient.java
기사 완성 메트릭 추가. OpenAI 응답 처리 시 지연시간(ms) 및 토큰 수 로깅 추가.
인증 및 보안 개선
src/main/java/.../auth/domain/service/AuthService.java, src/main/java/.../security/CustomUserDetailsService.java, src/main/java/.../security/JwtFilter.java, src/main/java/.../global/config/SecurityConfig.java
인증 흐름에 SLF4J 로깅 추가. 식별자(identifier) 기반 이중 인증(EMAIL/KAKAO) 폴백 로직 구현. Prometheus 메트릭 엔드포인트 공개.
검색 및 조회 로직
src/main/java/.../naver/domain/service/ArticleQueryDslImpl.java, src/main/java/.../naver/persistence/repository/UserArticleViewRepository.java, src/main/java/.../quiz/persistence/repository/QuizAttemptRepository.java, src/main/java/.../storage/persistence/repository/FolderItemRepository.java
제목/요약 검색을 대소문자 구분 없는 검색으로 변경. 사용자별 그룹 집계 쿼리로 변경하여 N+1 쿼리 방지.
설정 및 예외 처리
src/main/resources/application.yaml, src/main/java/.../global/config/OpenAiProperties.java, src/main/java/.../global/exception/GlobalExceptionHandler.java, .gitignore
OpenAI 최대 토큰 900→3000 증가. Firebase, 알림 스케줄, 로깅 설정 추가. 구조화된 에러 로깅 도입. 민감 정보(.env, 로그, Firebase JSON) 무시 설정 추가.
문서
README.md, docs/AI-Architecture-Crawling-to-AI-Jobs.md, docs/Metrics-Monitoring.md
프로젝트 개요, 기술 스택, CI/CD, 시스템 아키텍처 상세 문서화. AI 파이프라인 흐름도 및 메트릭/모니터링 가이드 추가.

Sequence Diagram(s)

sequenceDiagram
    actor User as 사용자
    participant Client as 클라이언트
    participant FcmController as FCM Controller
    participant FcmService as FcmService
    participant FcmTokenRepository as FCM Token<br/>Repository
    participant DB as Database
    participant Firebase as Firebase Admin SDK
    
    rect rgba(200, 150, 255, 0.5)
    Note over User,Firebase: [1] FCM 토큰 등록 흐름
    User->>Client: 앱 시작, FCM 토큰 받음
    Client->>FcmController: POST /api/fcm/token<br/>(fcmToken, deviceType)
    activate FcmController
    FcmController->>FcmService: saveToken(userId, fcmToken, deviceType)
    activate FcmService
    FcmService->>FcmTokenRepository: 기존 토큰 조회
    FcmTokenRepository->>DB: findByUserUserId(userId)
    DB-->>FcmTokenRepository: 토큰 목록
    FcmTokenRepository-->>FcmService: 기존 토큰 데이터
    alt 동일 기기 기존 토큰 있음
        FcmService->>FcmTokenRepository: 기존 토큰 삭제
        FcmTokenRepository->>DB: deleteByUserUserIdAndDeviceType()
    end
    FcmService->>FcmTokenRepository: 새 토큰 저장
    FcmTokenRepository->>DB: save(FcmTokenEntity)
    DB-->>FcmTokenRepository: 저장 완료
    FcmTokenRepository-->>FcmService: 저장됨
    FcmService-->>FcmController: void
    deactivate FcmService
    FcmController-->>Client: 200 OK
    deactivate FcmController
    end
    
    rect rgba(100, 200, 150, 0.5)
    Note over User,Firebase: [2] 알림 발송 흐름
    participant NotificationService as Notification<br/>Service
    NotificationService->>FcmTokenRepository: 활성 사용자 토큰 조회
    FcmTokenRepository->>DB: findByUserUserIdIn(userIds)
    DB-->>FcmTokenRepository: 토큰 목록
    FcmTokenRepository-->>NotificationService: 사용자별 토큰 맵
    loop 각 사용자별
        NotificationService->>FcmService: sendDailyNotification()<br/>(fcmToken, ...)
        activate FcmService
        FcmService->>Firebase: FirebaseMessaging.send(message)
        Firebase-->>FcmService: 메시지 ID /<br/>FirebaseMessagingException
        alt 토큰 유효
            FcmService-->>NotificationService: 발송 완료
        else 토큰 무효 (UNREGISTERED/INVALID)
            FcmService->>FcmTokenRepository: deleteByFcmToken(fcmToken)
            FcmTokenRepository->>DB: 토큰 삭제
            FcmService-->>NotificationService: 토큰 정리 완료
        end
        deactivate FcmService
    end
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

분석 근거:

  • 범위: 15개 이상의 파일 변경, 6개의 주요 기능 영역 (FCM, 알림, 관찰성, 인증, 검색, 설정)
  • 로직 밀도: 새로운 FcmService(180줄)의 복잡한 토큰 충돌 처리, NotificationService의 이중 발송 로직, 다중 저장소 조회의 N+1 방지 로직
  • 다양성: DTO, Entity, Repository, Service, Controller, Config, Exception, Utility 등 여러 계층의 이질적 변경
  • 외부 시스템 통합: Firebase Admin SDK 도입으로 신규 의존성 및 초기화 로직 검증 필요
  • 관찰성 개선: 인프라 설정의 복잡도 상승으로 배포 검증 필요

Possibly related PRs

Suggested labels

✨ feature

Suggested reviewers

  • ramen0519
  • kingmingyu

리뷰 의견

안녕하세요! 꽤 큰 PR이네요. 전반적으로 구조가 잘 설계되었다고 생각합니다. 몇 가지 체크 포인트를 공유드립니다:

✅ 칭찬할 점

  1. 토큰 관리 로직의 세심함 - FcmService.saveToken()에서 동일 기기 기존 토큰 삭제, 크로스유저 충돌 방지 등 엣지 케이스를 잘 처리했습니다.
  2. N+1 쿼리 방지 - QuizAttemptRepository, FolderItemRepository, UserArticleViewRepository를 Set 기반 쿼리로 변경한 게 좋습니다.
  3. 구조화된 로깅 - GlobalExceptionHandler의 이벤트 타입 기반 로깅이 모니터링에 유용할 것 같습니다.
  4. 환경변수 기반 설정 - Prometheus 템플릿화로 로컬/운영 환경 분리가 깔끔합니다.

⚠️ 주의할 점

  1. FCM 토큰 삭제 타이밍 - FcmService.sendPushNotification()에서 예외 발생 시 토큰을 바로 삭제하는데, 네트워크 일시 오류와 영구 무효 토큰을 구분하지 않습니다. 재시도 로직이나 삭제 전 검증이 있으면 더 안정적일 것 같습니다.

  2. NotificationService 대량 발송 - sendDailyNotification()에서 사용자당 토큰 수만큼 Firebase 호출이 발생합니다. 한 사용자가 여러 기기를 가진 경우 순차 발송으로 인한 지연이 있을 수 있습니다. 병렬 처리를 고려해보세요.

  3. 예외 처리의 간극 - NotificationService의 continue processing other users on exception에서 단순 주석만 있습니다. 실제 로깅/모니터링이 필요합니다.

  4. Firebase 초기화 검증 - FirebaseConfig에서 IOException을 IllegalStateException으로 변환하는데, 서비스 계정 파일 경로 오류를 조기에 발견하기 위해 로그도 함께 출력하면 좋습니다.

  5. OpenAI 토큰 한도 증가 - 900→3000으로 변경했는데, 이게 비용과 응답 시간에 미치는 영향을 검증하셨으면 좋겠습니다.

이 정도면 잘 정리된 PR입니다. 화이팅! 🚀

✨ Finishing Touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants