인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

상품 주문 후 주문내역 리스트가 보이지 않습니다.

작성

·

613

0

상품 주문을 하고 난 뒤에 바로 /orders로 이동하면서 화면까지는 정상적으로 나오는데 주문한 상품 목록이 리스트로 뿌려지지가 않습니다. 브라우저나 서버 쪽 콘솔에도 아무런 오류도 뜨지 않고요. 왜 이런 것일까요..?

 

orderController.png

orderSearch.png

${orderSearch} 와 ${memberName} 와 ${orderStatus} 부분에 밑줄이 쳐지긴 하네요.

<div>
        <div>
            <form th:object="${orderSearch}" class="form-inline">
                <div class="form-group mb-2">
                    <input type="text" th:field="*{memberName}" class="form-control" placeholder="회원명"/>
                </div>
                <div class="form-group mx-sm-1 mb-2">
                    <select th:field="*{orderStatus}" class="form-control">
                        <option value="">주문상태</option>
                        <option th:each="status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
                                th:value="${status}"
                                th:text="${status}">option
                        </option>
                    </select>
                </div>
                <button type="submit" class="btn btn-primary mb-2">검색</button>
            </form>
        </div>
public List<Order> findAllByString(OrderSearch orderSearch) {

		String jpql = "select o from Order o join o.member m";
		boolean isFirstCondition = true;

		//주문 상태 검색
		if (orderSearch.getOrderStatus() != null) {
			if (isFirstCondition) {
				jpql += " where";
				isFirstCondition = false;
			} else {
				jpql += " and";
			}
			jpql += " o.status = :status";
		}

		//회원 이름 검색
		if (StringUtils.hasText(orderSearch.getMemberName())) {
			if (isFirstCondition) {
				jpql += " where";
				isFirstCondition = false;
			} else {
				jpql += " and";
			}
			jpql += " m.name like :name";
		}

		TypedQuery<Order> query = em.createQuery(jpql, Order.class)
			.setMaxResults(1000);

		if (orderSearch.getOrderStatus() != null) {
			query = query.setParameter("status", orderSearch.getOrderStatus());
		}
		if (StringUtils.hasText(orderSearch.getMemberName())) {
			query = query.setParameter("name", orderSearch.getMemberName());
		}

		return query.getResultList();
	}

답변 2

2

제품 출력과 저장은 다 정상적으로 되고 있는 상황이긴 합니다 ㅠㅠ 목록에도 다 잘 뜨고 있습니당!

 

디버그 모드로 말씀해주신 orders에 브레이크 포인트를 걸고 요청을 날려보니 orderSearch에서 memberName과 orderStatus가 null이 찍히긴 하네요. model size는 2라고 나오고 있구요.

 

log로 orders의 size를 찍어보니 0이 나오네요. 이런 경우라면 JPQL로 조회하는 부분이 잘못됐다고 봐야할까요? 제공해주신 소스 코드 부분에서 findAllByString 코드 복붙해서 넣었는데 이러네요 따흐흑 ㅠ


전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

https://drive.google.com/file/d/1d2xk0l6bFWA8KbXWBsI8MDeoietJMn0j/view?usp=sharing

우선 링크를 보내드립니다.

 

다음으로 요청해주신 질문에 대해 답변 드리겠습니다.

 

  1. 실행방법은 로컬에서 인텔리제이로 실행했습니다.

  2. 문제 상황을 확인하시려면 회원가입을 하셔서 멤버를 하나 만들어보시고 상품등록을 통해 상품을 하나 등록하시고 상품주문을 통해 상품주문까지 하시면 강의에서 영한선생님의 경우에는 바로 주문 목록이 나왔지만 제 코드의 경우에는 주문 목록이 나오지 않는 것을 확인하실 수 있을 것 같습니다.

코드 확인해보았습니다.

제가 확인한 흐름을 설명드릴테니 참고해주세요.

우선

코드 실행 후 주문 데이터가 저장되는지 확인해봤습니다.

실제 화면에 출력되지 않아 DB에 저장되었는지 확인해보았습니다.

 


h2 DB ORDER 테이블에 주문 데이터가 없어서 OrderController를 확인해보았고,

 

@PostMapping("/order")
public String order(@RequestParam Long memberId,
               @RequestParam Long itemId,
               @RequestParam int count) {

   orderService.order(memberId, itemId, count);
   return "redirect:/orders";
}

OrderController.order에는 문제가 없어서 OrderService의 Order()를 확인해봤는데,

OrderService클래스 위에는 @Transactional(readOnly = true)

가 선언되어 있었고,

실제 order를 실행하는 order()에는 트랜잭션이 걸려있지 않아 아래와 같이 수정

(@Transactional(readOnly = false) 추가)

하여 정상실행 확인하였습니다.

 

image

문제가 발생했을 때 어느 부분을 확인해야하는지 흐름을 익히셨으면 좋겠습니다.

 

헐 ㅠㅠ 제가 트랜잭션을 안 줬군요! 진짜 간단한 거였는데 이상한데서 문제를 찾으려고 했군요 ㅠㅠ 요청에서 500에러가 안 떠서 DB에 값이 제대로 들어가는지를 확인을 안 했던게 문제였던 거 같기도 하네요.

 하나하나 문제 원인을 거꾸로 분석하는 좋은 흐름을 알려주셔서 감사합니다.

0

안녕하세요. JUNN님, 공식 서포터즈 OMG입니다.
.

주문하고 나서 제품 목록이 보이지 않으면, 제품을 출력하는 코드와 제품을 저장하는 코드의 확인이 필요한데, 주문 상태 관련 코드만 올려주셔서 확인이 어렵습니다.

image

디버깅 방법을 아시면, orders에 중단점을 걸고 데이터를 조회해오는지 확인해보셔야 할 것 같아요.

디버깅 방법을 모르시면, return 바로 위 코드에서

System.out.println(orders.size())로 List의 크기가 0인지 아닌지(주문 목록 데이터를 갖고 있는지) 확인해보시고, 원인을 파악하여 강의와 다른 부분을 확인해주세요.

해결이 안될 경우 댓글남겨주세요
.
감사합니다.

강의에서는 @Tranactional 만 사용하였는데, readOnly=false가 default이므로 결국 동일하게 동작합니다.

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

질문하기