룸메이트 매칭 프로젝트 4주차

윤장원·2023년 7월 24일
0

4주차엔 프로필 추천, 유저의 프로필 정보 불러오기 기능 구현을 했다.
프로필 추천 기능은 유저가 로그인을 하고 메인페이지에 접속하면 설정해 놓은 프로필 정보를 바탕으로, 룸메이트 모집 글을 작성한 유저 중에서 흡연 유무, 원하는 지역, 활동 시간이 같고 희망 연령대에 해당하는 나이를 가진 유저 목록을 가져온다. 비교하는 조건들이 다양하고 룸메이트 모집 글을 작성한 유저 중에서 추천 목록을 가져와야 하기 때문에 JPA 대신 Querydsl을 사용했다.

  @Override
  public List<User> getRecommend(User user, Integer size) {

    var subQuery = JPAExpressions.select(qArticle.user)
        .from(qArticle)
        .where(qArticle.isDeleted.eq(false)
            .and(qArticle.isRecruiting.eq(true)));

    var userQuery = queryFactory.selectFrom(qUser)
        .where(eqGender(user),
            eqSmoker(user),
            preferAge(user),
            eqRegion(user),
            neSelf(user),
            eqActivityTime(user),
            userInSubQuery(subQuery)
        )
        .orderBy(Expressions.numberTemplate(Double.class, "function('rand')").asc())
        .limit(size);

    return userQuery.fetch();
  }

원래는 일치하는 프로필 정보의 종류나 개수에 따라서 점수제로 추천 기능을 구현하고 싶었지만 시간 관계상 모두 일치하는 유저 목록만 가져오도록 구현했다. 추천 기능 로직을 더 사용자에게 유용한 방식으로 짤 수 있었는데 그러지 못해서 아쉬웠다.

유저의 프로필 정보 불러오기 기능은 유저의 Id 값을 받아 요청을 받으면 해당 유저의 프로필 정보를 응답하도록 했다.

ProfileDto

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ProfileDto {

  private String email;
  private String nickname;
  private String image;
  private Boolean isSmoker;
  private String activityTime;
  private String gender;
  private String region;
  private String mbti;
  private Set<String> tags;
  private Integer minAge;
  private Integer maxAge;

  private Integer myAge;
  private String detail;

  public static ProfileDto toDto(User user) {
    return ProfileDto.builder()
        .email(user.getEmail())
        .nickname(user.getNickname())
        .image(user.getImage())
        .isSmoker(user.getIsSmoker())
        .activityTime(Optional.ofNullable(user.getActivityTime()).map(ActivityTime::getValue).orElse("null"))
        .gender(Optional.ofNullable(user.getGender()).map(Gender::getValue).orElse("null"))
        .region(Optional.ofNullable(user.getRegion()).map(Seoul::getValue).orElse("null"))
        .mbti(Optional.ofNullable(user.getMbti()).map(Mbti::name).orElse("null"))
        .tags(user.getTag())
        .minAge(user.getMinAge())
        .maxAge(user.getMaxAge())
        .myAge(user.getMyAge())
        .detail(user.getDetail())
        .build();
  }

}

그리고 룸메이트 구해요 게시글 목록 불러올 때 게시글 목록만 프론트로 보내주고, 프론트에서 페이징 처리를 하기 위해서 전체 글 개수를 받아오는 API가 따로 존재했었다. 하지만 이렇게 하면 불필요하게 서버로 2개의 요청을 보내야해서 게시글 목록을 불러올 때 전체 게시글 개수도 같이 받을 수 있도록 수정했다.

Article 관련해서 전체적인 수정이 있었다. 프로젝트 초반 기획 당시 게시글 작성할 때 구하는 룸메이트의 성별을 따로 입력하여 게시글 목록을 불러올 때 해당 성별을 표시하려고 했다. 하지만 성별 표시를 유저가 봤을 때 작성자의 성별인지 구하는 룸메이트의 성별인지 구분하기 어려운 문제가 발생했다. 이와 관련해서 팀원들과 회의를 진행한 결과 게시글 작성할 때 구하는 룸메이트 성별을 입력하지 않고, 게시글 작성자의 성별을 저장하도록 수정했다. 사용자 입장에서 성별 표시를 보았을 때 작성자의 성별로 인식하기 때문이다.

5주차는 프로젝트 마무리하는 기간으로, 서버 배포 및 전체적인 리팩토링을 진행할 계획이다.

0개의 댓글