강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

lusate님의 프로필 이미지
lusate

작성한 질문수

스프링 부트 상품 목록

해결된 질문

작성

·

259

0

김영한님 강의 듣고 제가 주문한 상품 리스트를 조회할 때

@GetMapping("/orders")
public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model, Long id){

List<Order> orders = orderService.findOrders(orderSearch); //여기서 모든 주문을 다 가져오기 때문에
model.addAttribute("orders", orders);

return "order/orderList";
}

이렇게 하면 조회가 되기는 하는데 로그인한 유저 말고도 다른 유저가 주문한 상품도 조회가 되서 어떻게 해야할 지 모르겠습니다.

알려주시면 감사하겠습니다

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.
다른 유저의 주문 정보가 함께 조회되는 문제에 대해서 궁금하신 것 같아요.

여러 유저의 주문 정보가 함께 조회되는 이유는, 현재 구현된 코드에서 유저의 정보를 기반으로 라우팅이 이루어지지 않기 때문입니다. @GetMapping(“/orders”) 어노테이션은 해당 경로로 오는 모든 요청을 처리하게 됩니다.

따라서 로그인한 유저와 다른 유저의 조회가 함께 이루어지는 것입니다.

해결을 위해서는 현재 유저의 정보를 파라미터로 받아와 해당 유저의 주문 정보만 조회하도록 코드를 변경해야 합니다.

가장 간단한 방법은 현재 세션에 저장된 유저 정보를 이용하는 것입니다. 세션에서 유저 정보를 가져와 조회하도록 구현하면 됩니다.

세션에서 유저 정보를 가져오기 위해서는 세션 객체를 생성하고, 해당 세션 객체에서 유저 정보를 가져와 사용하시면 됩니다. 세션은 HttpServletRequest 객체를 통해 사용할 수 있으니, 주문 조회 메서드의 파라미터로 HttpServletRequest를 추가해보세요.

@GetMapping(“/orders”)public String orderList(@ModelAttribute(“orderSearch”) OrderSearch orderSearch, Model model, HttpServletRequest request){ // 기존 코드와 동일
HttpSession session = request.getSession();
User loginUser = (User)session.getAttribute(“loginUser”);
List orders = orderService.findOrdersByUser(loginUser); // 로그인한 유저의 주문만 조회
model.addAttribute(“orders”, orders);
return “order/orderList”;
}

이렇게 변경하면 로그인한 유저의 주문 정보만 조회하는 것이 가능해질 것입니다.
추가적으로 세션에 유저 정보를 저장하는 처리도 필요할 수 있으니, 해당 부분도 구현되어있는지 확인해보세요.

이렇게 코드를 변경하면 로그인한 유저와 다른 유저의 주문 정보가 분리되어 조회가 될 거에요. 문제가 해결되었으면 좋겠네요.
더 궁금한 점이 있으면 언제든지 물어보세요. 좋은 결과가 있기를 기대할게요!

lusate님의 프로필 이미지
lusate
질문자

그럼 orderService.findOrdersByUser는 public List<Order> findOrdersByUser(OrderSearch orderSearch, Member loginUser) {
return orderRepository.findAll(orderSearch, loginUser);
} 이렇게 하고

 

OrderRepository는 List<Order> findAll(OrderSearch orderSearch, Member loginMember);

이렇게만 해놓으면 되나요?

 

@Override
public List<Order> findAll(OrderSearch orderSearch) {
JPAQueryFactory query = new JPAQueryFactory(em);

QOrder order = QOrder.order;
QMember member = QMember.member;


return
query
.select(QOrder.order)
.from(order)
.join(order.member, member)
// 여기 where 절에서 order의 member_id와 로그인한 유저의 id가 같도록 해야 한다.
// .where(statusEq(orderSearch.getOrderStatus()), nameLike(orderSearch.getMemberName()))
.where(statusEq(orderSearch.getOrderStatus()), nameLike(orderSearch.getMemberName()))
.limit(1000)
.fetch();
}

 

쿼리는 어떻게 해야되나요?

lusate님의 프로필 이미지
lusate

작성한 질문수

질문하기