Skip to content

Conversation

@yerinchun
Copy link
Contributor

@yerinchun yerinchun commented Jan 3, 2026

#️⃣ 연관된 이슈

관련된 이슈 번호를 적어주세요.
Close #183

✨ 작업 내용 (Summary)

이번 PR에서 작업한 내용을 간략히 설명해주세요. (이미지 첨부 가능)

  • 특정 사용자의 ID를 통해 해당 사용자가 참여한 챌린지의 전체 인증 기록을 최신순으로 조회하는 기능을 추가했습니다.
  • 조회 대상 유저의 설정이 **비공개(isPublic: false)**일 경우, 실제 데이터가 존재하더라도 빈 배열(content: [])과 함께 isPublic: false 상태를 반환합니다.
  • VerificationServiceImpl에서 기존 '내 인증 기록 조회' 로직을 재사용하여 일관성을 유지했습니다.

✅ 변경 사항 체크리스트

다음 항목들을 확인하고 체크해주세요.

  • 코드에 영향이 있는 모든 부분에 대한 테스트를 작성하고 실행했나요?
  • 문서를 작성하거나 수정했나요? (필요한 경우)
  • 중요한 변경 사항이 팀에 공유되었나요?

🧪 테스트 결과

코드 변경에 대해 테스트를 수행한 결과를 요약해주세요.

  • 테스트 환경: 로컬
  • 테스트 방법: 스웨거
  • 결과 요약: 테스트 통과

📸 스크린샷

관련된 스크린샷 또는 GIF가 있다면 여기에 첨부해주세요.

설명 사진
공개유저일 경우 image
비공개유저일 경우 image

💬 리뷰 요구사항

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.


📎 참고 자료

관련 문서, 레퍼런스 링크 등이 있다면 여기에 첨부해주세요.

Summary by CodeRabbit

릴리스 노트

  • New Features
    • 다른 사용자의 검증 기록 조회 기능 추가: 공개 설정된 사용자의 인증 이력을 페이지네이션과 함께 확인할 수 있으며, 비공개 사용자의 경우 기록이 표시되지 않습니다.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 3, 2026

📝 Walkthrough

워크스루(Walkthrough)

다른 사용자의 인증 기록을 조회하는 새로운 API 엔드포인트를 추가합니다. 사용자 공개 설정을 확인하여 공개 사용자인 경우만 인증 기록을 반환하고, 비공개 사용자인 경우 빈 목록을 반환합니다. 페이지네이션을 지원합니다.

변경사항(Changes)

그룹 / 파일 변경 요약
API 엔드포인트
src/main/java/com/hrr/backend/domain/user/controller/UserController.java
getOtherUserVerificationHistory 엔드포인트 추가. 요청 파라미터: userId (양수), page (1 이상), size (1-100). 입력 검증 후 서비스로 위임하며 표준 ApiResponse 반환.
응답 DTO
src/main/java/com/hrr/backend/domain/verification/dto/VerificationResponseDto.java
OtherUserHistoryResponse 내부 클래스 추가. 필드: isPublic (Boolean), nickname (String), verifications (SliceResponseDto). Lombok 어노테이션 및 Swagger 메타데이터 포함.
서비스 계층
src/main/java/com/hrr/backend/domain/verification/service/VerificationService.java, src/main/java/com/hrr/backend/domain/verification/service/VerificationServiceImpl.java
getOtherUserVerificationHistory 메서드 추가. 사용자 존재 여부 확인 → 비공개 사용자 시 빈 목록 반환 → 공개 사용자 시 COMPLETED 상태 인증 기록만 조회 및 페이지네이션 적용.

시퀀스 다이어그램(Sequence Diagram)

sequenceDiagram
    participant Client
    participant UserController
    participant VerificationService
    participant UserRepository
    participant VerificationRepository

    Client->>UserController: GET /api/v1/user/{userId}/verifications/history<br/>(page, size)
    activate UserController
    Note over UserController: Input validation:<br/>@Positive userId<br/>@Min(1) page, size<br/>@Max(100) size
    UserController->>VerificationService: getOtherUserVerificationHistory(userId, page-1, size)
    deactivate UserController

    activate VerificationService
    VerificationService->>UserRepository: findById(userId)
    activate UserRepository
    UserRepository-->>VerificationService: User or UserNotFound
    deactivate UserRepository

    alt User Not Found
        VerificationService-->>Client: Exception: USER_NOT_FOUND
    else User Found
        alt User is Private (isPublic = false)
            rect rgba(200, 100, 100, 0.3)
            Note over VerificationService: Private Account<br/>Return empty verification list
            VerificationService->>VerificationService: Return OtherUserHistoryResponse<br/>(isPublic: false, nickname, empty verifications)
            end
        else User is Public (isPublic = true)
            rect rgba(100, 150, 150, 0.3)
            Note over VerificationService: Public Account<br/>Fetch COMPLETED verifications
            VerificationService->>VerificationRepository: findCompletedVerifications(userId, page, size)
            activate VerificationRepository
            VerificationRepository-->>VerificationService: Slice<Verification>
            deactivate VerificationRepository
            VerificationService->>VerificationService: Map to HistoryDto
            VerificationService->>VerificationService: Return OtherUserHistoryResponse<br/>(isPublic: true, nickname, verifications)
            end
        end
        VerificationService-->>Client: ApiResponse<OtherUserHistoryResponse>
    end
    deactivate VerificationService
Loading

코드 리뷰 난이도 평가(Estimated Code Review Effort)

🎯 3 (보통) | ⏱️ ~20분

사유: 세 개 파일에 걸친 일관된 기능 추가로, 엔드포인트 검증, DTO 구조, 서비스 로직이 명확합니다. 다만 프라이버시 로직, 페이지네이션 처리, 예외 처리를 꼼꼼히 확인해야 합니다.

관련 PR 제안(Possibly Related PRs)

  • PR #138: 인증 기록 조회 기능의 기초 기능으로, 동일한 HistoryDto 및 VerificationService 구조를 사용하여 현재 PR이 확장되었습니다.

시(Poem)

다른 이의 기록을 볼 수 있게,
공개 한 벽은 존중하면서 🔓
페이지를 넘어가며 보여주네 📖
프라이버시와 투명함의 조화로 🎭
새로운 풍경이 펼쳐진다 ✨


개선 제안사항

1. 미사용 Import 정리

위치: UserController.java
이슈: Page 클래스를 import했으나 메서드 본문에서 사용되지 않습니다.
개선: 불필요한 import 제거. IDE의 "Optimize imports" 기능 활용을 권장합니다.

2. DTO 필드명 일관성 검토

위치: OtherUserHistoryResponse.java
이슈: isPublic 필드는 사용자의 프로필 공개 여부를 나타내는데, 변수명이 다른 도메인 개념과 혼동될 여지가 있습니다.
개선: isProfilePublic 또는 profileVisibility 같이 더 명시적인 이름 검토를 권장합니다.

3. 서비스 계층 로직 명확화

위치: VerificationServiceImpl.getOtherUserVerificationHistory
이슈: 현재 "COMPLETED" 상태만 조회한다고 했으나, PR 요건에는 "COMPLETED AND NOT BLOCKED"로 명시되어 있습니다.
개선: BLOCKED 상태 필터링 로직이 실제로 적용되었는지 확인 필요. 필요시 다음과 같은 쿼리 메서드명 권장:

findByUserIdAndStatusAndNotBlocked(userId, Status.COMPLETED, page, size)

4. 테스트 커버리지 확인

위치: 전체 기능
이슈: 프라이버시 로직(공개/비공개)과 페이지네이션이 모두 정상 작동하는지 검증 필요합니다.
개선: 다음 시나리오에 대한 테스트 케이스 추가 권장:

  • ✓ 존재하지 않는 사용자 조회 → USER_NOT_FOUND 예외
  • ✓ 비공개 사용자 조회 → 빈 verifications 리스트 + isPublic: false
  • ✓ 공개 사용자 조회 → verifications 리스트 + isPublic: true
  • ✓ 페이지네이션 경계값 (page=1, size=1, size=100)

칭찬: 기능 요구사항에 충실하고, 입력 검증과 프라이버시 로직이 잘 구현되어 있습니다! 👍

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 핵심 변경사항을 명확하게 반영하고 있으며, 추가된 새 기능(다른 사용자 인증 기록 조회 API)을 정확하게 설명합니다.
Linked Issues check ✅ Passed 코드 변경사항이 이슈 #183의 모든 주요 요구사항을 충족합니다: 엔드포인트 추가, 사용자 검증, COMPLETED 상태 필터링, 최신순 정렬, 공개/비공개 처리.
Out of Scope Changes check ✅ Passed 모든 변경사항이 이슈 #183의 범위 내에 있으며, 불필요한 외부 변경사항은 없습니다. 다만 VerificationService 인터페이스의 docstring 수정은 순수 문서 개선입니다.
✨ Finishing touches
  • 📝 Generate docstrings

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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/main/java/com/hrr/backend/domain/verification/service/VerificationServiceImpl.java (1)

483-501: 비공개 계정 처리가 올바르게 구현되었습니다.

사용자의 프라이버시를 존중하는 로직이 잘 구현되어 있고, isPublic=false와 함께 빈 배열을 반환하는 것이 적절합니다. 로그도 디버깅에 유용하겠네요.

다만, Line 499에서 Page.empty()를 사용하는 부분은 동작에는 문제가 없지만, 코드베이스의 다른 곳에서 일관되게 Slice를 사용하는 것과 비교하면 의미론적으로 약간 불일치합니다.

🔎 더 일관된 코드를 위한 선택적 개선안

Page.empty() 대신 SliceImpl을 사용하면 Slice 개념과 더 일관성을 유지할 수 있습니다:

+        Pageable pageable = PageRequest.of(page, size);
+
         // 2. 비공개 계정 체크
         if (!user.getIsPublic()) {
             log.info("User {} is private. Returning empty list.", userId);
             return VerificationResponseDto.OtherUserHistoryResponse.builder()
                     .isPublic(false)
                     .nickname(user.getNickname())
-                    .verifications(new SliceResponseDto<>(Page.empty()))
+                    .verifications(new SliceResponseDto<>(new SliceImpl<>(Collections.emptyList(), pageable, false)))
                     .build();
         }

         // 3. 공개 계정
-        Pageable pageable = PageRequest.of(page, size);

추가로 Collections.emptyList() 사용을 위한 import가 필요합니다:

+import java.util.Collections;
src/main/java/com/hrr/backend/domain/user/controller/UserController.java (1)

23-24: Line 24의 import가 사용되지 않는 것 같습니다.

Line 23의 @Positive import는 새로운 엔드포인트에서 userId 검증에 사용되고 있지만, Line 24의 Page import는 새로 추가된 코드에서 사용되지 않는 것으로 보입니다.

🔎 사용하지 않는 import 제거
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.Positive;
-import org.springframework.data.domain.Page;
 import org.springframework.validation.annotation.Validated;

참고: IDE의 "Optimize Imports" 기능을 사용하면 자동으로 정리할 수 있습니다.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b696cda and b0b6cf1.

📒 Files selected for processing (4)
  • src/main/java/com/hrr/backend/domain/user/controller/UserController.java
  • src/main/java/com/hrr/backend/domain/verification/dto/VerificationResponseDto.java
  • src/main/java/com/hrr/backend/domain/verification/service/VerificationService.java
  • src/main/java/com/hrr/backend/domain/verification/service/VerificationServiceImpl.java
🔇 Additional comments (4)
src/main/java/com/hrr/backend/domain/verification/service/VerificationService.java (1)

68-84: 새로운 메서드 시그니처가 명확하고 일관성 있습니다.

인터페이스에 추가된 getOtherUserVerificationHistory 메서드는 기존 getVerificationHistory 메서드와 일관된 네이밍 패턴을 따르고 있으며, 반환 타입이 명확하게 다른 사용자 조회용 응답 DTO를 사용하고 있어 좋습니다. 주석도 목적을 잘 설명하고 있습니다.

src/main/java/com/hrr/backend/domain/verification/dto/VerificationResponseDto.java (1)

177-192: DTO 설계가 적절합니다.

OtherUserHistoryResponse의 구조가 요구사항을 잘 반영하고 있습니다:

  • isPublic 필드로 공개/비공개 상태를 명확히 전달
  • 기존 HistoryDto를 재사용하여 일관성 유지
  • Swagger 문서화가 잘 되어 있어 API 사용자에게 친절함

Builder 패턴 사용도 Good! 👍

src/main/java/com/hrr/backend/domain/verification/service/VerificationServiceImpl.java (1)

503-520: 공개 계정 처리 로직이 우수합니다.

기존의 findVerificationHistoryByUser 메서드를 재사용하여 일관성을 유지한 점이 훌륭합니다. 이는 PR 목표에서 언급한 "기존 로직 재사용"을 잘 따르고 있고, 중복 코드를 방지하는 좋은 패턴입니다.

src/main/java/com/hrr/backend/domain/user/controller/UserController.java (1)

239-262: 엔드포인트 구현이 훌륭합니다!

새로운 엔드포인트가 기존 패턴을 잘 따르고 있습니다:

  • 입력 검증이 적절함 (@Positive, @Min, @Max)
  • 1-based 페이지를 0-based로 변환하는 로직이 다른 엔드포인트와 일관됨
  • Swagger 문서화가 명확하고 도움이 됨
  • 서비스 레이어에 적절히 위임

비공개 사용자 처리를 서비스 레이어에서 담당하게 한 설계가 관심사의 분리(Separation of Concerns) 원칙을 잘 따르고 있네요. 멋집니다! 🎯

@yerinchun yerinchun requested a review from yc3697 January 3, 2026 10:43
@yerinchun yerinchun self-assigned this Jan 3, 2026
@yerinchun yerinchun added 🌟 feat 새로운 기능 개발 예린 labels Jan 3, 2026
Copy link
Contributor

@yc3697 yc3697 left a comment

Choose a reason for hiding this comment

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

확인했습니다! API 명세도 마저 작성해주세요. 수고하셨습니다 ㅎㅎ

@yerinchun yerinchun merged commit 96c6fab into develop Jan 4, 2026
2 checks passed
@yerinchun yerinchun deleted the feat/183-other-user-verification-history branch January 4, 2026 17:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

예린 🌟 feat 새로운 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 다른 사용자 인증 기록 조회 API

3 participants