Skip to content

Fix: Review Response에 멤버 기수 포함#105

Merged
deveroskp merged 1 commit into
developfrom
fix/review-api
Sep 8, 2025
Merged

Fix: Review Response에 멤버 기수 포함#105
deveroskp merged 1 commit into
developfrom
fix/review-api

Conversation

@deveroskp

Copy link
Copy Markdown
Contributor
  • review를 불러오는 api에서 멤버의 기수를 불러오도록 수정하였습니다.

@deveroskp deveroskp requested a review from a team as a code owner September 8, 2025 07:54
@coderabbitai

coderabbitai Bot commented Sep 8, 2025

Copy link
Copy Markdown

Walkthrough

ReviewResponse 스키마에 문자열 필드 member_generation이 추가되었으며, 서비스 계층의 get_review, get_reviews, update_review에서 해당 값을 각 소스의 generation으로 채워 응답에 포함하도록 수정되었습니다. 그 외 로직 변경은 없습니다.

Changes

Cohort / File(s) Summary
응답 스키마 업데이트
wacruit/src/apps/review/schemas.py
ReviewResponsemember_generation: str 필드 추가
서비스 응답 필드 채움
wacruit/src/apps/review/services.py
get_review, get_reviews, update_review에서 member_generation을 각각 writer.generation/review.member.generation/updated_review.member.generation으로 설정

Sequence Diagram(s)

sequenceDiagram
  participant C as Client
  participant S as ReviewService
  participant DB as Data Store/ORM

  rect rgba(230,245,255,0.5)
    note over S: get_review / get_reviews / update_review
    C->>S: 요청 (단건/목록/업데이트)
    S->>DB: 리뷰 및 멤버/작성자 조회
    DB-->>S: 엔티티(Review, Member/Writer)
    note right of S: 새 응답 필드<br/>member_generation 채움
    S-->>C: ReviewResponse(… , member_generation)
  end
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/review-api

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.

@coderabbitai coderabbitai 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.

Actionable comments posted: 0

🧹 Nitpick comments (5)
wacruit/src/apps/review/schemas.py (1)

19-21: member_generation 타입/널 처리 재검토 필요

writer.generation의 실제 타입(정수/문자열)과 null 가능 여부를 확인해주세요. 현재 스키마가 str로 고정되어 있으면:

  • DB/ORM 속성이 int일 때는 암묵적 캐스팅에 의존하게 됩니다.
  • 값이 None일 경우 ReviewResponse 생성 시 검증 오류가 날 수 있습니다.

도메인에 맞춰 아래 중 하나로 정렬하는 것을 권장합니다.

옵션 A) 기수가 숫자 도메인이라면 정수로 노출

-    member_generation: str
+    member_generation: int

옵션 B) 기수가 비어있을 수 있다면 Optional 허용

-    member_generation: str
+    member_generation: str | None = None
wacruit/src/apps/review/services.py (4)

40-50: member_generation 직렬화 명시화 + 불필요한 삼항 제거

  • 스키마가 Optional[str]로 확정될 경우, 명시적으로 문자열 변환 및 None 처리를 해주세요.
  • member_position은 이미 Optional 타입이므로 삼항 연산자 없이 바로 할당 가능합니다.

스키마를 옵션 B(Optional[str])로 택한 경우 권장 diff:

-            member_generation=writer.generation,
-            member_position=writer.position if writer.position else None,
+            member_generation=str(writer.generation) if writer.generation is not None else None,
+            member_position=writer.position,

스키마가 int라면 캐스팅 없이 그대로 두시면 됩니다(두 번째 줄의 삼항만 제거 권장).


58-71: 리스트 응답도 동일한 직렬화/널 처리 일관성 유지

단건과 동일하게 member_generation 캐스팅/널 처리를 맞춰주세요. 또한 member_position의 불필요한 삼항을 제거할 수 있습니다.

(스키마 Optional[str] 기준)

-                    member_generation=review.member.generation,
-                    member_position=review.member.position
-                    if review.member.position
-                    else None,
+                    member_generation=str(review.member.generation) if review.member.generation is not None else None,
+                    member_position=review.member.position,

참고: review.member 접근이 다수 루프에서 발생합니다. 리포지토리 계층에서 반드시 eager loading(selectin/joined load)로 N+1을 방지하고 있는지 확인 부탁드립니다.


99-111: 업데이트 응답도 동일한 규칙 적용

업데이트 응답에서도 동일한 캐스팅/널 처리와 member_position 단순화를 적용해주세요.

-            member_generation=updated_review.member.generation,
-            member_position=updated_review.member.position
-            if updated_review.member.position
-            else None,
+            member_generation=str(updated_review.member.generation) if updated_review.member.generation is not None else None,
+            member_position=updated_review.member.position,

또한, 위 블록과 별개로 업데이트 입력 처리부에서 빈 문자열로의 업데이트를 허용할지 정책 결정을 요청드립니다. 허용한다면 아래와 같이 is not None 체크로 변경이 필요합니다(해당 라인은 본 변경 범위 밖이지만 참고):

-        if request.title:
+        if request.title is not None:
             review.title = request.title

-        if request.content:
+        if request.content is not None:
             review.content = request.content

40-50: 중복된 매핑 로직 DRY화 제안

ReviewResponse로의 매핑이 세 곳에서 반복됩니다. 유지보수성을 위해 전용 헬퍼로 추출하는 것을 권장합니다.

예시:

def _to_review_response(member, review) -> ReviewResponse:
    return ReviewResponse(
        id=review.id,
        title=review.title,
        content=review.content,
        member_id=review.member_id,
        member_first_name=member.first_name,
        member_last_name=member.last_name,
        member_generation=(
            str(member.generation) if member.generation is not None else None
        ),  # 스키마 결정에 따라 조정
        member_position=member.position,
        is_active=member.is_active,
    )

각 호출부에서는 self._to_review_response(review.member, review) 형태로 대체 가능합니다.

원하시면 위 리팩터를 포함한 패치 diff를 만들어 드리겠습니다.

Also applies to: 58-71, 99-111

📜 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 664238e and d75b338.

📒 Files selected for processing (2)
  • wacruit/src/apps/review/schemas.py (1 hunks)
  • wacruit/src/apps/review/services.py (3 hunks)

@deveroskp deveroskp merged commit c33697a into develop Sep 8, 2025
3 checks passed
@deveroskp deveroskp deleted the fix/review-api branch November 9, 2025 13:36
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.

2 participants