4.상품 수정하기WEB JAVA SPRING/PROJECT2023. 9. 12. 17:00
Table of Contents
상품 등록 기능을 구현하였으니
상품 상세 페이지 진입 및 상품 데이터 수정하는 기능 구현하자
1.ItemService
//등록된 상품을 불러오는 메소드
@Transactional(readOnly = true) //상품 데이터를 읽어오는 트랜잭션을 읽기전용으로 -> 더티체킹(변경감지)수행하지 않아서 성능 향상
public ItemFormDto getItemDtl(Long itemId){
List<ItemImg> itemImgList = itemImgRepository.findByItemIdOrderByIdAsc(itemId);
List<ItemImgDto> itemImgDtoList = new ArrayList<>();
//조회한 ItemImg 엔티티를 ItemImgDto 객체로 만들어서 리스트에 추가
for (ItemImg itemImg : itemImgList) {
ItemImgDto itemImgDto = ItemImgDto.of(itemImg);//of(): null이 아닌 명시된 값을 가지는 Optional 객체를 반환
itemImgDtoList.add(itemImgDto);
}
//상품의 id를 통해 상품 엔티티를 조회, 존재하지 않으면 EntityNotFoundException 발생
Item item = itemRepository.findById(itemId)
.orElseThrow(EntityNotFoundException::new);
ItemFormDto itemFormDto = ItemFormDto.of(item);
itemFormDto.setItemImgDtoList(itemImgDtoList);
return itemFormDto;
}
2.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";
}
3.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); //변경된 상품 이미지 정보 세팅
//상품 등록 때 처럼 save()로직 호출하지 않는다. savedItemImg엔티티는 현재 영속 상태 이므로 데이터를 변경하는 것만으로도 변경 감지 기능 동작
}
4.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();
}
5.ItemService
//상품 수정
//상품 업데이트 (변경감지)
public Long updateItem(ItemFormDto itemFormDto, List<MultipartFile> itemImgFileList) throws Exception{
//상품 수정
Item item = itemRepository.findById(itemFormDto.getId())
.orElseThrow(EntityNotFoundException::new);
item.updateItem(itemFormDto); //상품 등록 화면으로부터 전달받은 ItemFormDto를 통해 상품 엔티티 업데이트
List<Long> itemImgIds = itemFormDto.getItemImgIds(); //상품 이미지 아이디 리스트 조회
//이미지 등록
for(int i=0;i<itemImgFileList.size();i++){
//상품 이미지를 업데이트 하기 위해 updateItemImg()메소드에 상품 이미지 아이디와, 파일 정보를 파라미터로 전달
itemImgService.updateItemImg(itemImgIds.get(i),
itemImgFileList.get(i));
}
return item.getId();
}
6.ItemController
//상품 수정 url 추가
@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:/";
}
'WEB JAVA SPRING > PROJECT' 카테고리의 다른 글
6.메인 화면 (0) | 2023.09.12 |
---|---|
5.상품 관리하기 : Querydsl (0) | 2023.09.12 |
3.상품 등록하기 (0) | 2023.09.12 |
2.연관관계 매핑 (0) | 2023.09.12 |
1.로그인/로그아웃 (0) | 2023.09.12 |