SpringBoot]ショッピングモールアイテム(11)-商品修正
27164 ワード
💡 商品を修正する
▼▼▼商品詳細照会
ItemService.java
登録された商品をロードする方法をItemServiceクラスに追加します.
@Service
@Transactional
@RequiredArgsConstructor
public class ItemService {
...
@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;
}
}
@Transactional(readOnly = true)
は、商品データを読み取るトランザクションを読み取り専用に設定する.この場合、JPAは汚れ検査(変更検出)を行わないことで性能を向上させることができる.ItemController.java
商品の修正ページに入るために、ItemControllerクラスでコードを修正します.
@Controller
@RequiredArgsConstructor
public class ItemController {
...
@GetMapping(value = "/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";
}
}
検索した商品データをモデルに入れ、ビュー形式で伝達します.▼▼▼商品イメージの見直し
ItemImgServiceクラスを修正して、商品の画像を修正します.変更検出機能を使用します.
ItemImgService
@Service
@RequiredArgsConstructor
@Transactional
public class ItemImgService {
...
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);
}
}
}
savedItemImg.updateItemImg(oriImgName, imgName, imgUrl);
変更された商品画像情報を設定します.ここで重要なのは、商品登録時のようにitemImg Repositoryです.save()ロジックは呼び出されません.savedItemImgエンティティは現在永続的な状態にあるため、データを変更するだけで変更が検出され、トランザクションの終了時に更新クエリーが実行されます.重要な点は、エンティティが永続的でなければならないことです.商品更新ロジック
Itemクラス
@Entity
@Table(name="item")
@Getter
@Setter
@ToString
public class Item {
...
public void updateItem(ItemFormDto itemFormDto) {
this.itemNm = itemFormDto.getItemNm();
this.price = itemFormDto.getPrice();
this.stockNumber = itemFormDto.getStockNumber();
this.itemDetail = itemFormDto.getItemDetail();
this.itemSellStatus = itemFormDto.getItemSellStatus();
}
}
同様に、変更検出機能を使用します.ItemService
@Service
@Transactional
@RequiredArgsConstructor
public class ItemService {
...
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();
}
}
「商品登録」画面から受け取ったItemFormDtoで商品エンティティを更新します.ItemController
@Controller
@RequiredArgsConstructor
public class ItemController {
...
@PostMapping(value = "/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(itemImgFileList.get(0).isEmpty() && itemFormDto.getId() == null){
model.addAttribute("errorMessage", "첫번째 상품 이미지는 필수 입력 값 입니다.");
return "item/itemForm";
}
try {
itemService.updateItem(itemFormDto, itemImgFileList);
} catch (Exception e){
model.addAttribute("errorMessage", "상품 수정 중 에러가 발생하였습니다.");
return "item/itemForm";
}
return "redirect:/";
}
}
商品修正ロジックitemService.updateItem(itemFormDto, itemImgFileList);
を呼び出す.Reference
この問題について(SpringBoot]ショッピングモールアイテム(11)-商品修正), 我々は、より多くの情報をここで見つけました https://velog.io/@yulhee741/Spring-Boot-쇼핑몰-프로젝트-11-상품-수정하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol