Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update recommendations ASC 방식으로 개선 #15

Merged
merged 4 commits into from
Nov 1, 2024

Conversation

falconlee236
Copy link
Member

Summary

ListRecommendedRestaurants 함수애 있는 nextCursor 변수 선언 부분에 있는 recommendations 부분을 오름차순으로 변경했습니다.

Description

변경사항

restaurant_recommendation_service.go 파일의 171번째 줄에 있는 nextCursor 기능을 변경했습니다.

  • nextCursor는 recommendations 변수에만 영향을 받는데, 이 변수는
recommendations, err := s.restaurantRecommendationRepository.FindAllByRestaurantRecommendationRequestID(
		restaurantRecommendationRequestID,
		cursorRestaurantRecommendationID,
		limit,
	)

이 부분에서 값을 가져오기 때문에 FindAllByRestaurantRecommendationRequestID 이 함수만 변경하면 된다고 판단했습니다.

  • FindAllByRestaurantRecommendationRequestID 해당 함수에서 order by를 DESC에서 ASC로 변경했습니다.

궁금한점

이 파일 하나만 바꾸는게 맞는지 잘 모르겠네요.. 예를 들어서 음식점 이미지도 findbyid 함수가 있는데 이 함수는 nextcursor랑 아무 연관이 없으니까 orderby를 추가할 필요는 없는것 같아서 수정 안했습니다.

  • ListRecommendedRestaurants 함수에 있는 다른 find 함수도 정렬이 필요한지 궁금합니다.
  • 제가 맞게 하고있는지도 피드백 해주실 수 있다면 부탁드립니다!🤗

@falconlee236 falconlee236 added the enhancement New feature or request label Oct 27, 2024
@falconlee236 falconlee236 requested a review from mokhs00 October 27, 2024 07:46
@falconlee236 falconlee236 self-assigned this Oct 27, 2024
@falconlee236 falconlee236 linked an issue Oct 27, 2024 that may be closed by this pull request
Order("restaurant_recommendation_request_id DESC").
Order("restaurant_recommendation_request_id ASC").
Copy link
Member

Choose a reason for hiding this comment

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

p2; 이거 restaurant_recommendation_request_id가 아니라 restaurant_recommendation_id로 페이지네이션해야해요🙏 모델 구조랑 로직 구조를 먼저 이해해보시는 건 어떨까요?

Copy link
Member Author

@falconlee236 falconlee236 Oct 27, 2024

Choose a reason for hiding this comment

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

Cursor를 받아올때 recommendation 객체의 top 10개를 가져와야하는 상황에서
그 객체를 오름차순으로 바꿔야 하는걸로 이해했는데, 제가 이해한게 맞을까요??@mokhs00

@falconlee236
Copy link
Member Author

파악한 부분

  1. nextCursor 변수는 service.go 파일의 ListRecommendedRestaurants 함수에만 존재한다.
  2. ListRecommendedRestaurants 함수는 /request/:restaurantRecommendationRequestId/restaurants API에서만 사용한다. => 해당 api 요청의 결과만 고려하면 된다.
  3. 이 API는 requestID를 받아서 먼저 restaurant_recommendation 테이블을 탐색하며 requestID랑 일치한 restaurantID를 가져온다.
  4. 해당 restuarantID값에 일치하는 가게 정보를 가져온다.

이슈 내용 파악한 부분

nextCursor를 가져오는데, nextCursor는 조회한 recommendations 중 가장 큰 recommendationID가 되어야 하지만, 현재는 recommendations이 recommendationID 내림차순으로 정렬되어 있어서 가장 작은 recommendationID를 선택하는 상황.
따라서 recommendations를 recommendationID ASC로 정렬하는 수정이 필요함
restaurantRecommendationRepository.FindAllByRestaurantRecommendationRequestID()도 같이 수정 필요

  1. recommendations는 restaurant_recommendations` 테이블 조회 결과임.
  2. 기존에는 restaurant_recommendation_request_id 기준으로 내림차순 (DESC) 정렬되어 있었음
  3. 항상 높은 restaurant_recommendation_id 를 가져오기 위해서 코드 수정이 필요

궁금한점

  1. 왜 높은 restaurant_recommendation_id를 가져와야 하는지 잘 모르겠습니다
    restaurant_recommendation_request_id에 일치하는 record를 가져와서 그에 맞는 가게 정보를 가져오는 API로 이해했는데, restaurant_recommendation_id는 단순히 record를 구분하는 PK이기 때문에 높은 값이 사용자의 높은 선호도를 의미하지는 않는것 같습니다.
  2. 가장 큰 recommendationID를 가져오려면 recommendationID를 내림차순으로 정렬해야하는것 같아서 질문 드립니다. 오름차순이 1, 2, 3, 4, 5 이고 내림차순이 5, 4, 3, 2, 1인 걸로 알고 있습니다!

수정한 부분

restaurant_recommendation_request_id 가 아닌, restaurant_recommendation_id 기준으로 내림차순으로 정렬했습니다. 이렇게 하면 항상 높은 추천 ID값을 우선적으로 가져옵니다.

@falconlee236 falconlee236 requested a review from mokhs00 October 28, 2024 11:45
Copy link
Member

@mokhs00 mokhs00 left a comment

Choose a reason for hiding this comment

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

pre-approve

@@ -46,7 +46,7 @@ func (r *restaurantRecommendationRepository) FindAllByRestaurantRecommendationRe
RestaurantRecommendationRequestID: restaurantRecommendationRequestID,
},
whereConditions...).
Order("restaurant_recommendation_request_id DESC").
Order("restaurant_recommendation_id DESC").
Copy link
Member

@mokhs00 mokhs00 Oct 31, 2024

Choose a reason for hiding this comment

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

이건 ASC로 해야해용 추천 데이터가 생기는 구조랑 페이지네이션을 어떻게 엮을지 생각해보면 이해하실 수 있을 겁니당

  • 추천 요청(restaurant_recommendation_request)에 매핑되는 추천 데이터(restaurant_recommendation)를 처음에 10 개 생성하고 이후 추천 데이터가 부족하면 추가로 생성하는 식인데, 이러면 페이지네이션할 때 desc로 할 수가 없어용

Copy link
Member

Choose a reason for hiding this comment

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

추가로 위에 이 부분도 restaurant_recommendation_request_id가 아니라 restaurant_recommendation_id를 사용하고 부등호도 알맞게 수정해두어야 합니당

// as-is
whereConditions = append(whereConditions, "restaurant_recommendation_request_id < ?", *cursorRestaurantRecommendationID)

// to-be
whereConditions = append(whereConditions, "restaurant_recommendation_id > ?", *cursorRestaurantRecommendationID)

@falconlee236
Copy link
Member Author

falconlee236 commented Oct 31, 2024

제가 너무 날림으로 코드를 읽은 것 같습니다. 제가 이해한 내용이 맞는지 다시 한번 확인해 주실 수 있을까요? @mokhs00

requestRestaurantRecommendation

해당 api에서 사용자 요청이 들어오면 다음 행동을 합니다.

  1. restaurantRecommendationService.RequestRestaurantRecommendation 함수를 호출합니다.
  2. 해당 함수에서 새로운 request 객체를 생성하고 DB에 저장합니다. => restaurantRecommendationRequestRepository.Save(recommendationRequest)
  3. 이때 2번 값의 반환값인 created는 이미 persist 된 객체이기 때문에 이 값을 수정해도 트랜젝션이 끝나면 수정사항이 DB에 반영됩니다.
  4. restaurantsOrderByRecommendationScoreDesc, err := s.restaurantRepository.FindAllOrderByRecommendationScoreDesc(10) 여기서 restaurant DB에서 제일 값이 높은 10개의 음식점을 불러 옵니다.
  5. 10개 받아온 결과를 request와는 다른 DB에 저장합니다.

질문 1

4번 단계 에서 우리가 수정해야 하는 부분이 보이는 것 같습니다. 지금은 사용자의 위도, 경도에 상관없이 항상 10개의 값을

result := r.db.
		Order("recommendation_score DESC").
		Limit(limit).
		Find(&existingRestaurants)

이런 식으로 받아오는데, 이 로직을 고도화 해야 할것 같은데, 이것이 issue #8 인것 같은데 맞나요?

listRecommendedRestaurants

본격적으로 이 PR에서 수정해야할 API 부분입니다.

  • 현재 상황은 1개의 request당 10개의 restaurant가 있는 상황입니다.
  1. listRecommendedRestaurantsResult, err := c.restaurantRecommendationService.ListRecommendedRestaurants( 이 함수를 호출합니다.
  2. request에 해당하는 10개의 추천 가게를 찾아오기 위해서 GetRestaurantRecommendationRequest를 호출해서 request의 존재여부를 확인합니다.
  3. recommendations, err := s.restaurantRecommendationRepository.FindAllByRestaurantRecommendationRequestID 를 호출합니다.

질문 2

  • 지금 DB에는 단순히 recommendation_score 기준으로 저장되어 있기 때문에 추천 음식점들이 restaurant_recommendation_id 기준으로 정렬되어 있지 않아서 정렬이 필요합니다.
  • 그러기 위해서 restaurant_recommendation_id 기준으로 오름차순으로 정렬한 다음 (1, 2, 3, 4, 5...) cursor를 0, 10, 20 이런식으로 증가시켜서 페이지 네이션을 한다는뜻인가요?
  • 그러기 위해서 where조건을 whereConditions = append(whereConditions, "restaurant_recommendation_id > ?", *cursorRestaurantRecommendationID) 이렇게 해야 한다는 뜻인거 맞나요
Order("restaurant_recommendation_id ASC").
whereConditions = append(whereConditions, "restaurant_recommendation_id > ?", *cursorRestaurantRecommendationID)

결과는 다음과 같고요.

추가로 하고 싶은 말

오늘 JPA 강의를 들으면서 서버 코드에 대한 이해력이 늘어나고 나서 다시 이 코드를 보니까 어느정도 읽을 수 있는 것 같습니다.
부족한 이해력때문에 계속 불필요한 리뷰가 늘어난 것 같아서 죄송스러울 따름입니다..

@mokhs00
Copy link
Member

mokhs00 commented Oct 31, 2024

@falconlee236 ㅎㅎ 잘하고 싶어서 그러시는 거니까 괜찮습니당 죄송 -> 사랑

질문 답변 드리면,,

제가 너무 날림으로 코드를 읽은 것 같습니다. 제가 이해한 내용이 맞는지 다시 한번 확인해 주실 수 있을까요?

넵넵 위에 이해하신 내용이 맞아용

질문 1
이 로직을 고도화 해야 할것 같은데, 이것이 issue #8 인것 같은데 맞나요?

넵넵 맞습니당 위치 기반 검색이 들어가야해용 인덱스 관련해서도 찾아봐야합니당

지금 DB에는 단순히 recommendation_score 기준으로 저장되어 있기 때문에 추천 음식점들이 restaurant_recommendation_id 기준으로 정렬되어 있지 않아서 정렬이 필요합니다.
그러기 위해서 restaurant_recommendation_id 기준으로 오름차순으로 정렬한 다음 (1, 2, 3, 4, 5...) cursor를 0, 10, 20 이런식으로 증가시켜서 페이지 네이션을 한다는뜻인가요?
그러기 위해서 where조건을 whereConditions = append(whereConditions, "restaurant_recommendation_id > ?", *cursorRestaurantRecommendationID) 이렇게 해야 한다는 뜻인거 맞나요

넵넵 이해하신 게 맞아요 로직 플로우는 아래 처럼 됩니당

  1. 추천 데이터 생성 5개 생성했다고 가정 (restaurant_recommendation_id 1~5)
  2. 로직 상 추천 데이터 중 3개를 YES로 선택해야 결과화면으로 넘어감
  3. 5개 중에서 3개를 YES로 선택하지 않았다면 추천 데이터를 더 생성해야함
  4. (YES 3개를 선택하지 않았다고 가정) 추천 데이터 5개 추가 생성 (restaurant_recommendation_id 6~10)
  5. 새로 생성된 추천 데이터부터 조회하려면 id 6부터 오름차순으로 조회 해야함

@falconlee236 falconlee236 requested a review from mokhs00 November 1, 2024 02:25
@falconlee236
Copy link
Member Author

최종적으로 수정했고 여기에 이모지 남겨주시면 바로 merge 하겠습니다

Copy link
Member

@mokhs00 mokhs00 left a comment

Choose a reason for hiding this comment

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

LGTM 👍

@falconlee236 falconlee236 merged commit c0988be into main Nov 1, 2024
@falconlee236 falconlee236 deleted the feat/recommend-sort-asc branch November 1, 2024 12:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Update recommendations는 ASC로 정렬해서 조회하도록
2 participants