상품 조회 및 수정

심규환·2022년 2월 7일
0

Shop

목록 보기
2/10

상품 조회

Controller

ItemController.Java

ItemItemImg 엔티티를 가져오기 위해 ItemId를 전달 받습니다. try문으로 EntityNotFoundException 에러를 처리하고 만약 에러가 발생하면 model에 담아서 반환합니다.
컨트롤러에서는 Dto를 서비스에 전달하는 역할과 에러 처리를 담당시킵니다.

  @GetMapping("/admin/item/{itemId}")
    public String itemDtl(@PathVariable("itemId") Long itemId, Model model){
        try{
            ItemFormDto itemFormDto = itemService.getItemDtl(itemId);
            model.addAttribute("itemFormDto", itemFormDto);
        }catch (EntityNotFoundException e){
            model.addAttribute("errorMessage", "존재하지 않는 상품입니다.");
            model.addAttribute("itemFormDto", new ItemFormDto());
            return "item/itemForm";
        }
        return "item/itemForm";
    }

Service

ItemService.Java

단순히 조회만 하기 때문에 @Transactional(readOnly = true) 를 사용하여 성능을 올립니다.
itemId를 사용하여 item과 itemImg 모두 가져오고 Dto 객체로 변환해줍니다.
ItemImgRepository에 itemId를 사용하여 등록된 순서로 조회할 수 있도록 findByItemOrderByIdAsc(); 를 추가해줍니다.

    @Transactional(readOnly = true)
    public ItemFormDto getItemDtl(Long itemId){
        List<ItemImg> itemImgList = itemImgRepository.findByItemIdOrderByIdAsc(itemId);
        List<ItemImgDto> itemImgDtoList = new ArrayList<>();
        for (ItemImg itemImg : itemImgList) {
            ItemImgDto itemImgDto = ItemImgDto.of(itemImg);
            itemImgDtoList.add(itemImgDto);
        }

        Item item = itemRepository.findById(itemId)
                .orElseThrow(EntityNotFoundException::new);
        ItemFormDto itemFormDto = ItemFormDto.of(item);
        itemFormDto.setItemImgDtoList(itemImgDtoList);
        return itemFormDto;
    }    

상품 수정

Controller

itemController.Java

Post방식으로 받으며 item에 대한 정보는 ItemFormDto 안에 같이 들어있기 때문에 @PathVariable으로 uri의 'itemId'를 받을 필요는 없습니다.
아이템 등록과 마찬가지로 bindingresult 처리와 이미지 파일이 잇는지를 확인합니다.
itemService.updateItem() 에 Dto와 MultipartFile 리스트를 넘겨줍니다.

@PostMapping("/admin/item/{itemId}")
    public String itemUpdate(@Valid ItemFormDto itemFormDto, BindingResult bindingResult,
                             @RequestParam("itemImgFile") List<MultipartFile> itemImgFileList, Model model){
        if(bindingResult.hasErrors()){
            return "item/itemForm";
        }

        if(itemFormDto.getId()== null && itemImgFileList.get(0).isEmpty()){
            model.addAttribute("errorMessage", "첫 번째 상품 이미지는 필수 입력 값입니다.");
            return "item/itemForm";
        }

        try{
            itemService.updateItem(itemFormDto, itemImgFileList);
        }catch (Exception e){
            model.addAttribute("errorMessage", "상품 수정 중 에러가 발생하였습니다.");
            return "item/itemForm";
        }
        return "redirect:/";
    }

itemService.Java

전달받은 Dto 객체에서 itemId를 사용하여 item 객체를 가져옵니다. 앤티티 객체 안에 비즈니스 로직을 구성하면 좀더 객체지향적이게 됩니다. (item.updateItem(Dto))
item을 itemRepository에서 조회하여 영속성 컨텍스트에 넣어놨기 때문에 Dto -> item을 하여 수정하기만 하면 더티체킹 기능을 사용하여 자동 저장됩니다.
itemImgids 에는 아이템의 itemImgId들이 들어가 있습니다.
이미지 처리는 itemImgService에 맡깁니다.

public Long updateItem(ItemFormDto itemFormDto, List<MultipartFile> itemImgFileList) throws Exception{

        Item item = itemRepository.findById(itemFormDto.getId())
                .orElseThrow(EntityNotFoundException::new);
        item.updateItem(itemFormDto);
        List<Long> itemImgIds = itemFormDto.getItemImgIds();

        for(int i=0;i<itemImgFileList.size();i++){
            itemImgService.updateItemImg(itemImgIds.get(i),
                    itemImgFileList.get(i));
        }

        return item.getId();
    }

itemImgService.Java

MultipartFile이 없으면 수정할 것도 없기 때문에 if문으로 필터를 걸어줍니다.
기존에 저장되어 있는 itemImg를 가져옵니다.
itemImgFile.getImgName() 으로 수정하려는 이미지의 이름이 있는지 확인하고 있으면 기존 이미지 파일을 삭제합니다.(삭제 처리는 FileService 위임)
FileService에 새로 저장할 값들을 전달하여 파일을 저장하고 기존의 itemImg를 변경된 값으로 수정합니다.

 public void updateItemImg(Long itemImgId, MultipartFile itemImgFile) throws Exception{
        if(!itemImgFile.isEmpty()){
            ItemImg savedItemImg = itemImgRepository.findById(itemImgId)
                    .orElseThrow(EntityNotFoundException::new);

            if(!StringUtils.isEmpty(savedItemImg.getImgName())) {
                fileService.deleteFile(itemImgLocation+"/"+
                        savedItemImg.getImgName());
            }

            String oriImgName = itemImgFile.getOriginalFilename();
            String imgName = fileService.uploadFile(itemImgLocation, oriImgName, itemImgFile.getBytes());
            String imgUrl = "/images/item/" + imgName;
            savedItemImg.updateItemImg(oriImgName, imgName, imgUrl);
        }
    }
profile
장생농씬가?

0개의 댓글