Skip to content

[7주차/제이] 워크북 제출합니다#44

Open
yeongjun25 wants to merge 6 commits into
UMC-Inha:j/mainfrom
yeongjun25:week7
Open

[7주차/제이] 워크북 제출합니다#44
yeongjun25 wants to merge 6 commits into
UMC-Inha:j/mainfrom
yeongjun25:week7

Conversation

@yeongjun25
Copy link
Copy Markdown

@yeongjun25 yeongjun25 commented May 14, 2026

✅ 실습 체크리스트

  • 이론 학습을 완료하셨나요?
  • 미션 요구사항을 모두 이해하셨나요?
  • 실습을 수행하기 위한 공부를 완료하셨나요?
  • 실습 요구사항을 모두 완료하셨나요?

✅ 컨벤션 체크리스트

  • 디렉토리 구조 컨벤션을 잘 지켰나요?
  • pr 제목을 컨벤션에 맞게 작성하였나요?
  • pr에 해당되는 이슈를 연결하였나요?(중요)
  • 적절한 라벨을 설정하였나요?
  • 파트장에게 code review를 요청하기 위해 reviewer를 등록하였나요?
  • 닉네임/main 브랜치의 최신 상태를 반영하고 있는지 확인했나요?(매우 중요!)

📌 주안점

@YoungJJun YoungJJun linked an issue May 17, 2026 that may be closed by this pull request
Copy link
Copy Markdown
Collaborator

@YoungJJun YoungJJun left a comment

Choose a reason for hiding this comment

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

7주차 피드백

  1. 먼저 전체적으로 이번주 미션에 대해 잘 구현되었습니다.

    오프셋/커서 기반 페이지네이션 적용과 검증 어노테이션을 추가하고 GeneralExceptionAdvice 추가까지 모두 잘 되었어요 👍

  2. ReveiwServicegetMyReviews()

    slice에 Review들이 담긴 상황에서

    List<ReviewResponseDTO.ReviewDTO> items = slice.getContent().stream()
                    .map(review -> {
                        ReviewReply reply = reviewReplyRepository.findByReview_Id(review.getId())
                                .stream().findFirst().orElse(null);
                        return ReviewConverter.toReviewDTO(review, reply);
                    })
                    .collect(Collectors.toList());

    slice에 담긴 각각의 리뷰에 대해 findByReview_Id를 이용해 리뷰 답변을 가져오는 구조로 이해했어요.

    이 경우 slice에 들어간 Review 사이즈만큼의 쿼리가 반복되고 이게 워크북에서 배우신 N+1 문제입니다!
    (slice에 10개의 리뷰가 있다면 리뷰답글을 호출하는 쿼리가 각 리뷰당 한 번씩 → 총 10번 반복)

    해결방법은 한번에 조회 후 Map으로 매핑, @Query 에서 JOIN FECTH로 답글을 미리 한번에 가져오는 방식 정도가 있을 것 같습니다.

  3. MissionRequestDTO 의 record CreateMission()

    등에도 @NotNull 등의 검증 어노테이션 추가할 수 있을 것 같아요. 붙이게 된다면 이를 사용하는 MissionController.createMission() 에 @Valid 붙이는것도 기억해주세요!

  4. MissionSuccessCode

    MISSION_LIST_OK(HttpStatus.OK, "MISSION200_1", "미션 목록 조회에 성공했습니다."),
        CREATED(HttpStatus.OK, "MISSION200_1", "성공적으로 미션을 생성했습니다."),
        OK(HttpStatus.OK, "MISSION200_2", "성공적으로 미션을 조회했습니다.")

    MISSION200_1 중복됩니다! CREATED는 HttpStatus.CREATED로 변경 후 MISSION201_1 로 변경하면 좋을 것 같아요.

  5. ReviewService.getMyReviews()

    idCursor = Long.MAX_VALUE;
    starCursor = new BigDecimal(”5.1”);

    이런식으로 작성한 코드를 매직넘버 라고도 부르는데 코드 자체에 의도가 드러나지 않는 느낌입니다.

    첫 페이지 star 값에 대한 기준을 정하는데 첫 페이지에는 일단 별점 5.0도 포함되어야 하니까 5.1로 시작한다 라는 로직인것 같은데 코드만 읽어서는 숨은 의도를 찾아내야 하는 느낌인거죠!

    이경우 해결법은 분기 처리를 바꿔보거나 상수로 이름을 부여하는 방법이 있을 것 같습니다.

      if (cursor == null) {
          slice = reviewRepository.findByMemberIdOrderByStar(memberId, PageRequest.of(0, pageSize));
      } else {
          BigDecimal starCursor = new BigDecimal(parts[0]);
          Long idCursor = Long.parseLong(parts[1]);
          slice = reviewRepository.findByMemberIdOrderByStarWithCursor(memberId, idCursor, starCursor, PageRequest.of(0, pageSize));
      }   
    private static final BigDecimal STAR_CURSOR_INITIAL = new BigDecimal("5.1"); // 최대 별점 5.0 초과값

제이 7주차 수고하셨습니다!
이번 피드백은 하면서 약간 이해하기 어려울수도 있을 것 같다고 생각했어요.. N+1과 커서 초기값 관련해서 매직넘버가 무엇인지 이해하시고 넘어가면 좋을 것 같아요. 여유되시면 코드도 수정해보면 좋을 것 같습니당~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Chapter07_API 설계 심화 - 페이징

2 participants