fix: 리뷰v2 - menu 리뷰 작성시 menuLike가 null일때 발생하는 NPE을 방지해요#352
fix: 리뷰v2 - menu 리뷰 작성시 menuLike가 null일때 발생하는 NPE을 방지해요#352
Conversation
menuLike/menuId 누락 시 FAILED_VALIDATION으로 실패시키고, isLike/imageUrls/menuLikes null도 안전하게 처리해 NPE를 방지합니다.
CreateMenuReviewRequestV2의 rating/menuLike와 MenuLikeRequest의 menuId에 검증을 추가해 잘못된 요청을 조기에 400으로 처리합니다.
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 본 PR은 메뉴 리뷰 작성 시 발생하는 NullPointerException(NPE) 문제를 해결하기 위해 DTO 유효성 검증을 강화하고 서비스 계층의 방어적 코드를 보강하는 작업을 수행했습니다. 이를 통해 잘못된 요청에 대해 명확한 400 에러를 반환하고, 시스템의 안정성을 높였습니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. 메뉴 리뷰 작성 시에, 널 값이 들어오면 멈추네. 어노테이션 꼼꼼히 붙여서, 안전한 코드로 거듭나네. Footnotes
|
| List<MenuLikeRequest> menuLikeRequests = Optional.ofNullable(request.getMenuLikes()).orElse(Collections.emptyList()); | ||
|
|
||
| Map<Menu, Boolean> menuLikes = menuLikeRequests.stream() | ||
| .filter(Objects::nonNull) |
There was a problem hiding this comment.
createMealReview(87줄)에서는 menuLike == null이면 FAILED_VALIDATION으로 예외를 던지는데, 여기서는 .filter(Objects::nonNull)로 조용히 무시합니다. 같은 MenuLikeRequest 리스트인데 처리 방식이 다르면 클라이언트 입장에서 혼란스러울 수 있으니, 여기도 null이면 FAILED_VALIDATION으로 통일하는 게 일관성 있을 것 같습니다...!
| @Max(5) | ||
| private Integer rating; | ||
|
|
||
| @NotNull |
There was a problem hiding this comment.
| if (menuLike == null || menuLike.getMenuId() == null) { | ||
| throw new BaseException(FAILED_VALIDATION); | ||
| } |
There was a problem hiding this comment.
CreateMenuReviewRequestV2에 @NotNull @Valid menuLike를 달았고, 컨트롤러에서 @Valid @RequestBody로 받고 있으므로, 이 null 체크는 Bean Validation을 통과한 뒤에는 도달할 수 없네용
방어적 프로그래밍으로 남겨두는 건 OK인데 흠 createMealReview(87줄)쪽은 DTO에 @Valid가 없어서 실제로 유효한 방어임니다
이 차이를 구분할 수 있도록 간단한 주석이 있으면 좋겠습니다!
| Menu menu = menuRepository.findById(menuLike.getMenuId()) | ||
| .orElseThrow(() -> new BaseException(NOT_FOUND_MENU)); | ||
| review.addReviewMenuLike(menu, menuLike.getIsLike()); | ||
| boolean isLike = Boolean.TRUE.equals(menuLike.getIsLike()); |
There was a problem hiding this comment.
Boolean.TRUE.equals(menuLike.getIsLike())로 null일 때 false(싫어요)로 처리하는 건 깔끔합니당
다만 "좋아요/싫어요를 선택하지 않음"이 별도 상태라면, null을 false로 치환하는 건 데이터 왜곡이 될 수 있으니 비즈니스 로직 확인하면 좋겟네여!
125번째 줄 416번째 줄도 동일한 포인트입니당
#️⃣ Issue Number
resolved #349
좀 더 풀어서 설명하자면,
CreateMenuReviewRequestV2의 경우 menuLike(meunid, islike)이외에 별도의 menuid를 받지 않습니다(중복된다 판단하여 별도로 추가하지 않았습니다)
그렇기에 menu에 대한 리뷰를 작성하는데, menuId가 없어서 NPE이 발생했습니다.
📝 요약(Summary)
💬 공유사항 to 리뷰어
not null이 과하지 않은지 점검 부탁드립니다.
저의 생각은
이 엔드포인트(/v2/reviews/menu)는 메뉴를 식별할 값이 menuLike.menuId밖에 없어서, menuLike가 null이면 애초에 처리 불가능 (이 PR 핵심입니다)
menuId가 없으면 islike가 true든 false든 메뉴리뷰든 의미가 성립하지 않습니다. (다만 CreateMealReviewRequest.menuLikes는 필드에 @Valid가 없어서 “검증 어노테이션만으로”는 리스트 원소 검증이 안 걸릴 수 있는데, 서비스에서 이미 null 방어를 추가해둔 상태라 동작상 문제는 없습니다.
현재 기획단에서 0점 리뷰를 금지하고 있습니다.
기존에는 @Min/@max만 있어서 rating:null도 검증을 통과할 수 있었습니다.(Bean Validation은 null이면 통과)
NotNull을 통해 해당 정책을 명시적으로 400으로 바꿨습니다.
✅ PR Checklist
PR이 다음 요구 사항을 충족하는지 확인하세요.