Skip to content

ICC-381 ICC-382 ICC-383 ICC-384 ICC-385 ICC-386 ICC-387 ICC-388 ICC-389 모듈 전체 리팩터링 #306

Merged
GulSauce merged 10 commits into
developfrom
refactor
Jul 4, 2026
Merged

ICC-381 ICC-382 ICC-383 ICC-384 ICC-385 ICC-386 ICC-387 ICC-388 ICC-389 모듈 전체 리팩터링 #306
GulSauce merged 10 commits into
developfrom
refactor

Conversation

@GulSauce

@GulSauce GulSauce commented Jul 4, 2026

Copy link
Copy Markdown
Member

quiz-set모듈은 작업중이라 리팩터링 하지 않음

GulSauce and others added 10 commits July 4, 2026 13:36
- infra/terraform/gcp, infra/terraform/oci Terraform 구성 일괄 삭제
- 루트 잔여 org/springframework/ai/google/genai/GoogleGenAiChatModel.java 삭제
- infra/scripts/oci-mysql-backup 스크립트 정리, CLAUDE.md 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- AdminController.uploadImage 인라인 검증을 private validateImage로 추출
- 하드코딩 상수(허용 타입/최대 크기)를 ImageUploadProperties(@ConfigurationProperties)로 분리
  - q-asker.admin.image-upload 설정을 app-common.yml에 추가 (문서 업로드용 file-validation과 분리)
- oci FileValidateServiceImpl: null contentType 에러를 EXTENSION_NOT_EXIST→EXTENSION_INVALID로 통일
- AdminControllerTest 신규 9케이스 추가 (admin 모듈 테스트 셋업 최초 구성)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- R1(SRP): PostResponseMapper.toDetail() 추가, getPost() 인라인 DTO 매핑 제거, "운영팀" 상수 단일화
- R2(DRY): Board.ensureModifiableBy() 도메인 메서드 추출, requireUserId() 헬퍼 통일
- R3(DRY): toPageResponse() 헬퍼 추출, UNKNOWN_USERNAME 상수화
- 회귀 테스트: BoardServiceTest(22) + BoardAdminServiceImplTest(4) 선작성
- BoardService 167줄 → 97줄

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- JwtProvider: JWT 생성/검증 추출
- PrincipalExtractor: 인증 주체 추출 로직 분리
- SecurityErrorResponder: 보안 에러 응답 일원화
- RateLimitFilter 분해: RateLimitBucketRegistry / RateLimitMetrics / RateLimitResponseWriter
- TokenCrypto: 토큰 암호화 유틸 추출
- 회귀 테스트: ClientKeyResolver / JwtTokenAuthenticationFilter / RateLimitFilter / RefreshTokenCrypto / UserIdArgumentResolver

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 제안1(DRY): Timer 조립 4곳 중복 → conversionTimer() 헬퍼로 집약
- 제안1(DRY): 실패 catch 2곳 → 단일 catch + instanceof 분기로 통합
- 제안3(LSP): ConvertService Javadoc에 UnsupportedOperationException 계약 명시
- 회귀 테스트 보강: 성공/실패 Timer 기록·사전 등록 8개 시계열·no-op 검증 (4 → 7케이스)
- ConvertServiceImpl 113줄 → 96줄

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- HashUtil.decode() 도메인 에러 결합 제거 → 중립 INVALID_URL_REQUEST (시그니처 유지, 하위 무파급)
- RateLimitPlanResolver 핸들러 조회 중복 → findAnnotation() 통합 (56→40줄)
- GlobalExceptionHandler 인라인 로깅 분기 → logCustomException() 추출
- 회귀 테스트 24개 선작성 (GlobalExceptionHandler/CustomException/HashUtil/RateLimitPlanResolver)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- OciObjectStorageServiceImpl: uploadImage/uploadPdf 중복 골격(PutObjectRequest 조립→upload→CDN URL)을 private 헬퍼로 집약, 소스 타입별 UploadRequest 조립만 Function 위임 (117→107줄)
- 회귀 테스트 15개 선작성 (URL 계약·objectName 규칙·opcMeta 인코딩·BufferedInputStream 래핑 + FileValidateService 검증 분기)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 청크 오케스트레이터 3종(MULTIPLE/BLANK/OX) → AbstractChunkedQuizOrchestrator 템플릿메서드 통합, 서브클래스는 훅 3개만 override (844→123줄)
- 스트리밍 추출기 제네릭화: StreamingJsonArrayExtractor<T>로 통합, 중복 추출기 2종 삭제
- 레거시 캐시 경로 제거(GeminiChatService/GeminiCacheService/GeminiCacheConfig/ChunkInfo/스모크 ~355줄)
- usage 로깅 4곳 → recordChunkUsage() 흡수, orphan 메트릭·QuizPromptStrategy 2-arg 死메서드 제거(ISP)
- 회귀 테스트 24개 선작성 (오케스트레이터 계약 18 + 추출기 4 + 메트릭 2)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 상세 매핑 로직(객관식/서술형/채점결과)을 서비스 인라인 람다 → QuizHistoryMapper로 이관 (QueryService 261→165줄)
- loadOwnedHistory/loadProblemSet 헬퍼 + AnswerSnapshotView 값 객체 추출로 스냅샷→Map 변환 중복 제거
- 회귀 테스트 8개 선작성 (정오답 판정·스냅샷 매핑·삭제 제외·소유자 검증·서술형 채점)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- processGenerationAsync의 84줄 God 람다 → GenerationBatchConsumer 클래스로 추출 (CommandService 258→166줄)
- 선택지 배치(MULTIPLE/BLANK/REAL_BLANK 셔플 + OX 정규화) → SelectionArranger 유틸로 전략화(OCP)
- SSE 전송 4중 보일러플레이트(get→null체크→send→catch) → safeSend() 헬퍼 통합
- 회귀 테스트 16개 선작성 (배치 순번/SSE eventId/셔플 보존/OX 정규화/finalize 3분기/IOException 처리)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2b2f30ef-abbc-4e3f-a645-2ae6d3ac8505

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor

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.

@GulSauce GulSauce changed the title ICC-381 ICC-382 ICC-383 ICC-384 ICC-385 ICC-386 ICC-387 ICC-388 ICC-389모듈 전체 리팩터링 ICC-381 ICC-382 ICC-383 ICC-384 ICC-385 ICC-386 ICC-387 ICC-388 ICC-389 모듈 전체 리팩터링 Jul 4, 2026
@GulSauce GulSauce merged commit c6ca376 into develop Jul 4, 2026
3 checks passed
@GulSauce GulSauce deleted the refactor branch July 5, 2026 02:14
@claude claude Bot mentioned this pull request Jul 5, 2026
1 task
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.

1 participant