매칭을 할 사용자 검색을 할 때 밑에 뷰에 사용자 추천해주는 기능을 만들고 싶었다.
이 정도 기능이면 내 실력으로도 가능할 거 같아서 시작!!
처음에는...
MatchingController
//사용자 검색 들어갔을 때(추천 사용자)
@GetMapping("/api/users/recommend")
public List<MatchingResponseDto> recommendMember(@AuthenticationPrincipal UserDetailsImpl userDetails){
return matchingService.recommendMember(userDetails);
}
MatchingResponseDto 에는 추천 사용자를 보여줄 때 필요한 정보를 담고있다.
여기까지는 순조로웠다...
MatchingService 초기 코드
Pageable pageable = PageRequest.of(0, 4, Sort.Direction.DESC, "level");
4개의 정보를 클라이언트에 보내주고 level 컬럼을 기준으로 내림차순을 하는 코드이다. 이걸 나중에 고친다.
MemberRepository 초기 코드
// 사용자 추천
@Query("select m " +
"from Member m " +
"join m.character c " +
"where m.matchingState = :matchingState " +
"and " +
"m.id not in (:memberId) " +
"and " +
"c.level between :level + 3 and :level - 3")
List<Member>findUserByLevel(Pageable pageable, @Param("level") int level, @Param("memberId") Long memberId , @Param("matchingState") Boolean matchingState);
멤버의 정보를 출력해주는데character를 join해준다.
where 절에는 matchingstate를 받는데 false로 고정을 해주었고,
not in을 통하여 자기 자신을 제외하고 출력하게 해주었다.
마지막으로 자신의 레벨을 파라미터 바인딩으로 받는데 +-3을 해준 값 사이를 between으로 뽑아오는 쿼리를 작성하였다.
자. 돌려보자.
could not resolve property: level of: com.hanghae.todoli.member.Member
에러를 읽지 않고 그냥 복붙해서 구글링 하는 습관 때문에 찾는데 길어진 것 같다.
무튼 결론부터 말하자면 Member에 level이라는 컬럼이 없는 것이다.
어? 뭐지? 하면서 코드를 보는데 service쪽 page 코드를 보면 level 기준으로 desc 해준다고 내가 내 손으로 짰었다.
오늘의 집 클론코딩을 할 때에는 생성날짜 기준으로 작성을 하다보니 몰랐다..
level을 빼주니 해결 완료!! 정말 이렇게 쉬운걸 ㅎ
무튼 수정을 한 후 다시 시작!
어라? List빈 값이 출력이 되네? 쿼리가 잘못된건가?
between에서 구린 냄새가 났다. between을 빼고 테스트를 하니 잘 출력이 되었다. between 뭐가 문제일까?
c.level between :level + 3 and :level - 3")
아마 다들 바로 찾으실 거 같다.
between의 파라미터 위치가 변경이 되었다.
-3 +3 으로 가야하는데 그냥 급한대로 막 넣은 거 같다.
두 문제 다 엄청엄청 사소한 것이였다. 그치만 뭔가 뿌듯했다.
누군가에게 의지해서 물어보고 배우는 것이 아닌 혼자 한 느낌?
이러면서 점점 실력을 키워나가고 나중엔 내가 알려주는 입장이 되고싶다.
service
Repository
getThumbnailDtos 함수는 멤버가 끼고있는 아이템의 번호들을 가져와서 그 아이템의 정보들을 받아오는 함수이다.
윗 사진 주석들을 무시하면 된다!!
실행결과
장착한 아이템이 없어서 빈 list가 출력되는 것이니 안심하라구~