본문 바로가기
Project/MangoPlate Clone

마이페이지 및 위시리스트

by 혀눅짱 2023. 3. 29.

사실 로그인 jwt관련  토큰 관리를 redis 캐시로 해야 좋을거같은데.. 일단은 뭐 db에서 관리하는거로 넘어가고

 

로그인이 되었으니 이제 마이페이지 및 위시리스트로직을 구현하였다.

 

@RequiredArgsConstructor
public class UserRepositoryCustomImpl implements UserRepositoryCustom{

    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public UserDto getMyPage(String email) {
        UserDto result = jpaQueryFactory.select(Projections.constructor(
                        UserDto.class,
                        user,
                        ExpressionUtils.as(
                                select(review.id.count()).
                                        from(review).
                                        where(review.user.id.eq(user.id))
                                , "reviewCount"),
                        ExpressionUtils.as(
                                select(wishList.id.count()).
                                        from(wishList).
                                        where(wishList.user.id.eq(user.id))
                                , "wishListCount")

                ))
                .from(user)
                .where(user.email.eq(email))
                .fetchOne();

        return result;
    }
}

 

마이페이지니까 당연히 유저 정보는 필수다 거기에 망고플레이트 실제 앱을 보니 사용자가 작성한 리뷰 및 가고싶다(위시리스트) 개수 등 을 표시하고있었다. 그리하여 유저정보 뿐만아니라 각개수를 가져오기위해 dto에 생성자로 값을 주입하는 방식으로 QueryDSL Projections.constructor을 사용하였다. 여기에 각개수는 조인으로 가져오면 괜히 1:n관계가 되서 로우수가 늘어나기때문에 group by를 해줘야하는 번거로움이있고 QueryDSL에서 서브쿼리를 사용해보고싶어서 서브쿼리로 해당 유저의 각 리뷰 및 위시리스트 개수를 가져온다.

 

public List<RestaurantDto> getUserWishList(String email){
    return jpaQueryFactory.select(
                    Projections.constructor(RestaurantDto.class,
                                restaurant,
                                ExpressionUtils.as(
                                        select(MathExpressions.round(review.rating.avg(),1)).
                                                from(review).
                                                where(review.restaurant.id.eq(restaurant.id))
                                        , "avgRating"),
                                ExpressionUtils.as(
                                        select(review.rating.count()).
                                                from(review).
                                                where(review.restaurant.id.eq(restaurant.id))
                                        , "cnt")
                    )
            )
            .from(wishList)
            .innerJoin(wishList.restaurant,restaurant)
            .leftJoin(restaurant.region,region).fetchJoin()
            .leftJoin(restaurant.category,QCategory.category).fetchJoin()
            .where(wishList.user.id.eq(
                    select(user.id).
                            from(user).
                            where(user.email.eq(email))))
            .orderBy(wishList.id.desc())
            .fetch();


}

마이페이지에서 위시리스트목록을 가져오는 api다 일단 위시리스트에 담긴순서대로 해당유저가 위시리스트에 담아놓은 레스토랑 id로 레스토랑과 조회해 레스토랑목록을 불러온다. 레스토랑의 지역과 카테고리는 페치조인으로 한번에가져오고 레스토랑의 이미지들은 dto의 생성자로 값을 주입할때 지연로딩 하도록 해놓았다.

 

QueryDSL사용하면서 편하게 스태틱 임포트를 하다보니 막상또 새로운 class파일에서 풀 문법을 까먹어서 다시 찾아보는 경우가 많다..

자주자주 사용하면서 익숙해져야겠다.