Fix: Review Response에 멤버 기수 포함#105
Conversation
deveroskp
commented
Sep 8, 2025
- review를 불러오는 api에서 멤버의 기수를 불러오도록 수정하였습니다.
WalkthroughReviewResponse 스키마에 문자열 필드 member_generation이 추가되었으며, 서비스 계층의 get_review, get_reviews, update_review에서 해당 값을 각 소스의 generation으로 채워 응답에 포함하도록 수정되었습니다. 그 외 로직 변경은 없습니다. Changes
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
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes ✨ Finishing Touches
🧪 Generate unit tests
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.
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 = Nonewacruit/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
📒 Files selected for processing (2)
wacruit/src/apps/review/schemas.py(1 hunks)wacruit/src/apps/review/services.py(3 hunks)