fix: 공개 프로필 응답에서 email 등 PII 제거 (PublicUserResponse 신설) - #92
Conversation
- PublicUserResponse 신설(계약 19필드), userId·githubId·email·role·isNewUser 제외 - UserQueryService.findByUsername·UserController.getUser 반환 타입을 PublicUserResponse로 교체 - UserQueryServiceTest에 리플렉션 기반 PII 미노출·19필드 매핑 검증 추가
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📝 WalkthroughWalkthrough공개 사용자 조회 응답을 Changes공개 프로필 응답
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant Client
participant UserController
participant UserQueryService
participant PublicUserResponse
Client->>UserController: GET /api/v1/users/{username}
UserController->>UserQueryService: findByUsername(username)
UserQueryService->>PublicUserResponse: of(user, activityLog)
PublicUserResponse-->>UserQueryService: 공개 응답 DTO
UserQueryService-->>UserController: PublicUserResponse
UserController-->>Client: ApiResponse<PublicUserResponse>
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/main/java/com/gitranker/api/domain/user/dto/PublicUserResponse.java (1)
9-53: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win계약 문서화를 위한 Javadoc 추가를 권장합니다.
19개 positional 파라미터로 구성된 record는 향후 필드 추가/순서 변경 시 실수 위험이 있습니다.
userId,githubId,role,isNewUser를 의도적으로 제외했다는 계약을 클래스 레벨 Javadoc으로 남겨두면, 이후 이 DTO에 필드를 추가하는 개발자가 PII 재노출 위험을 인지하는 데 도움이 됩니다.📝 제안 예시
+/** + * 공개 프로필 응답 DTO (계약: 19개 필드만 포함). + * PII(email) 및 내부 식별자(userId, githubId, role, isNewUser)는 절대 포함하지 않는다. + */ public record PublicUserResponse(🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/main/java/com/gitranker/api/domain/user/dto/PublicUserResponse.java` around lines 9 - 53, 클래스 `PublicUserResponse`에 클래스 레벨 Javadoc을 추가해 공개 응답 DTO의 계약을 문서화하세요. `userId`, `githubId`, `email`, `role`, `isNewUser` 필드를 의도적으로 포함하지 않으며 PII를 노출하지 않는다는 점을 명시하고, 기존 record 필드와 `of(User, ActivityLog)` 동작은 변경하지 마세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@src/main/java/com/gitranker/api/domain/user/dto/PublicUserResponse.java`:
- Around line 9-53: 클래스 `PublicUserResponse`에 클래스 레벨 Javadoc을 추가해 공개 응답 DTO의 계약을
문서화하세요. `userId`, `githubId`, `email`, `role`, `isNewUser` 필드를 의도적으로 포함하지 않으며
PII를 노출하지 않는다는 점을 명시하고, 기존 record 필드와 `of(User, ActivityLog)` 동작은 변경하지 마세요.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: 7841681f-1a5b-4628-89bd-f04b468c07a0
📒 Files selected for processing (4)
src/main/java/com/gitranker/api/domain/user/UserController.javasrc/main/java/com/gitranker/api/domain/user/dto/PublicUserResponse.javasrc/main/java/com/gitranker/api/domain/user/service/UserQueryService.javasrc/test/java/com/gitranker/api/domain/user/service/UserQueryServiceTest.java
배경
공개 프로필 엔드포인트
GET /api/v1/users/{username}가RegisterUserResponse를 그대로 반환해email·githubId·role·userId·isNewUser등 PII·내부 식별자를 노출했다. 특히email은 OAuthuser:email스코프 값이라 공개 노출이 부적절하다. (P0-1)공유 계약 정본은 추적 이슈 alexization/git-ranker-workflow#106. 채택안은 옵션 B(공개 응답에서 PII 제거).
Closes #91
변경
PublicUserResponse신설 — 계약상 공개 19필드만 담는 record +of(User, ActivityLog)정적 팩토리UserQueryService.findByUsername·UserController.getUser반환 타입을PublicUserResponse로 교체RegisterUserResponse는 무변경 — 소유자 전용POST /users/{username}/refresh와 등록 경로는 본인 데이터라 그대로 유지UserQueryServiceTest: 19필드 매핑 검증 + 리플렉션 기반 PII 미노출 검증(publicResponseExcludesPii) 추가계약 준수
userId·githubId·email·role·isNewUser) — record accessor 부재로 컴파일 타임 보장 + 리플렉션 테스트로 명시 검증검증
./gradlew test→ BUILD SUCCESSFUL./gradlew build -x test→ BUILD SUCCESSFUL프로덕션 배포는 FE(alexization/git-ranker-client#11)의 email 의존 제거·배포가 완료된 뒤에만 한다. FE보다 BE가 먼저 배포되면 공개 응답 계약이 바뀌어 FE Settings·헤더 표시가 깨진다.
Summary by CodeRabbit
새로운 기능
버그 수정
테스트