[7주차/제이] 워크북 제출합니다#44
Conversation
YoungJJun
left a comment
There was a problem hiding this comment.
7주차 피드백
-
먼저 전체적으로 이번주 미션에 대해 잘 구현되었습니다.
오프셋/커서 기반 페이지네이션 적용과 검증 어노테이션을 추가하고 GeneralExceptionAdvice 추가까지 모두 잘 되었어요 👍
-
ReveiwService의getMyReviews()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로 답글을 미리 한번에 가져오는 방식 정도가 있을 것 같습니다. -
MissionRequestDTO 의 record CreateMission()
등에도
@NotNull등의 검증 어노테이션 추가할 수 있을 것 같아요. 붙이게 된다면 이를 사용하는 MissionController.createMission() 에@Valid붙이는것도 기억해주세요! -
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 로 변경하면 좋을 것 같아요.
-
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과 커서 초기값 관련해서 매직넘버가 무엇인지 이해하시고 넘어가면 좋을 것 같아요. 여유되시면 코드도 수정해보면 좋을 것 같습니당~
✅ 실습 체크리스트
✅ 컨벤션 체크리스트
📌 주안점