@GetMapping("/product/view")
public String view(PageRequestDTO pageRequestDTO, Model model) {
pageRequestDTO.setSize(5);
String prodNo = pageRequestDTO.getProdNo();
// 상품, 판매자(사용자), 메인 카테고리, 서브카테고리, 상품이미지, 상품상세 정보
ProductDTO productDTO = productViewService.selectProductByProdNo(prodNo);
// 광고 정보
List<BannerDTO> banners = productViewService.findBanner("PRODUCT1");
BannerDTO banner = productViewService.randomBanner(banners);
// 리뷰 정보
PageResponseDTO reviewPageResponseDTO = productViewService.selectAllForReview(pageRequestDTO);
// 문의 정보
PageResponseDTO inquiryPageResponseDTO = productViewService.selectAllForQna(pageRequestDTO);
// 상품 조회수 추가
if (productDTO != null) {
productViewService.hitCountUp(prodNo);
}
model.addAttribute(productDTO);
model.addAttribute("banner", banner);
model.addAttribute("reviewPageResponseDTO", reviewPageResponseDTO);
model.addAttribute("inquiryPageResponseDTO", inquiryPageResponseDTO);
return "/product/view/view";
}
기술 설명
- @GetMapping("/product/view"): GET 요청을
/product/view경로로 매핑.- pageRequestDTO.setSize(5): 리뷰·문의 페이징 시 한 페이지당 5건만 조회하도록 설정.
- pageRequestDTO.getProdNo(): 요청 파라미터로 전달된
prodNo(상품 번호) 추출.- productViewService.selectProductByProdNo(prodNo): 상품 번호를 기반으로
ProductDTO조회 (상품 기본 정보, 판매자 정보, 카테고리, 이미지, 상세 정보 포함).- productViewService.findBanner("PRODUCT1"):
"PRODUCT1"영역에 등록된 광고 배너 목록 조회.- productViewService.randomBanner(banners): 조회된 배너 목록 중 하나를 랜덤 선택.
- productViewService.selectAllForReview(pageRequestDTO): 페이징 조건(
size=5,pg)에 맞춘 리뷰 목록과 페이징 메타데이터를 포함한PageResponseDTO반환.- productViewService.selectAllForQna(pageRequestDTO): 페이징 조건(
size=5,pg)에 맞춘 Q&A(문의) 목록과 페이징 메타데이터를 포함한PageResponseDTO반환.- productViewService.hitCountUp(prodNo): 조회된
ProductDTO가 null이 아닐 때만 상품 조회수 1 증가 처리.- model.addAttribute(productDTO): 뷰(
view.html)에productDTO객체 전달.- model.addAttribute("banner", banner): 뷰에 랜덤 선택된
banner객체 전달.- model.addAttribute("reviewPageResponseDTO", reviewPageResponseDTO): 뷰에 페이징된 리뷰 정보 전달.
- model.addAttribute("inquiryPageResponseDTO", inquiryPageResponseDTO): 뷰에 페이징된 Q&A 정보 전달.
- return "/product/view/view":
view.html템플릿을 렌더링하여 클라이언트에 응답.
@GetMapping("/product/reviewList")
@ResponseBody
public PageResponseDTO getReviews(PageRequestDTO pageRequestDTO) {
pageRequestDTO.setSize(5);
PageResponseDTO pageResponseDTO = productViewService.selectAllForReview(pageRequestDTO);
return pageResponseDTO;
}
기술 설명
- @GetMapping("/product/reviewList"): GET 요청을
/product/reviewList경로로 매핑.- @ResponseBody: 반환되는
PageResponseDTO를 JSON 형태로 직렬화하여 응답.- pageRequestDTO.setSize(5): 한 페이지당 최대 5개 리뷰만 조회하도록 설정.
- productViewService.selectAllForReview(pageRequestDTO): 서비스 계층에서 리뷰를 페이징 처리한 결과(
PageResponseDTO)를 받아옴.- return pageResponseDTO: AJAX 호출 시 클라이언트가 사용할
PageResponseDTO(리뷰 리스트, 총 페이지, 현재 페이지 등 포함) 반환.
@GetMapping("/product/qnaList")
@ResponseBody
public PageResponseDTO getQna(PageRequestDTO pageRequestDTO) {
pageRequestDTO.setSize(5);
PageResponseDTO pageResponseDTO = productViewService.selectAllForQna(pageRequestDTO);
return pageResponseDTO;
}
기술 설명
- @GetMapping("/product/qnaList"): GET 요청을
/product/qnaList경로로 매핑.- @ResponseBody: 반환되는
PageResponseDTO를 JSON 형태로 직렬화하여 응답.- pageRequestDTO.setSize(5): 한 페이지당 최대 5개 문의만 조회하도록 설정.
- productViewService.selectAllForQna(pageRequestDTO): 서비스 계층에서 Q&A를 페이징 처리한 결과(
PageResponseDTO)를 받아옴.- return pageResponseDTO: AJAX 호출 시 클라이언트가 사용할
PageResponseDTO(문의 리스트, 총 페이지, 현재 페이지 등 포함) 반환.