ItemService 코드 추가
- 등록된 상품을 불러오는 메소드 추가
@Override
@Transactional(readOnly = true)
public ItemFormDTO getItemDtl(Long itemId) {
// 해당 상품 이미지 조회
List<ItemImg> itemImgList =
itemImgRepository.findByItemIdOrderByIdAsc(itemId);
// 조회한 ItemImg 엔티티를 ItemImgDTO 객체로 만들어 리스트 추가
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 코드 추가
- 상품 수정 페이지 진입 위한 코드 추가 - 등록용 페이지와 수정용 페이지 나눠서 개발함.
@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", "The product does not exist.");
model.addAttribute("itemFormDTO", new ItemFormDTO());
return "item/itemForm";
}
return "item/itemModify";
}
ItemImgService 클래스 수정
@Override
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 엔티티는 현재 영속 상태이므로 데이터를 변경하는 것만으로 변경 감지 기능이 동작하여 트랜잭션이 끝날 때 update 쿼리가 실행된다.
Item 클래스 코드 추가
- 상품 데이터를 업데이트 하는 로직 추가
public void updateItem(ItemFormDTO itemFormDTO) {
this.itemNm = itemFormDTO.getItemNm();
this.price = itemFormDTO.getPrice();
this.stockNum = itemFormDTO.getStockNum();
this.itemDetail = itemFormDTO.getItemDetail();
this.itemSellStatus = itemFormDTO.getItemSellStatus();
}
ItemService 업데이트 코드 추가
@Override
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<itemImgIds.size(); i++) {
itemImgService.updateItemImg(itemImgIds.get(i), itemImgFileList.get(i));
}
return item.getId();
}
- 상품 등록 화면으로부터 전달 받은 상품 아이디를 이용하여 상품 엔티티 조회
- 상품 등록 화면으로부터 전달 받은 ItemFormDTO를 통해 상품 엔티티를 업데이트
- 상품 이미지 아이디 리스트 조회
- 상품 이미지 업데이트 위해 updateItemImg() 메소드에 상품 이미지 아이디와 상품 이미지 파일 정보를 파라미터로 전달
ItemController 코드 추가
- 상품 수정하는 URL을 ItemController 클래스에 추가
@PostMapping("/admin/item/{itemId}")
public String itemUpdate(@Valid ItemFormDTO itemFormDTO,
BindingResult bindingResult,
@RequestParam("itemImgFiles") List<MultipartFile> itemImgFileList,
Model model) {
if (bindingResult.hasErrors()) {
return "item/itemModify";
}
if (itemImgFileList.get(0).isEmpty() && itemFormDTO.getId() == null) {
model.addAttribute("errorMessage", "The first product image is a required field.");
return "item/itemModify";
}
try {
itemService.updateItem(itemFormDTO, itemImgFileList);
} catch (Exception e) {
model.addAttribute("errorMessage", "An error occured during product registration.");
return "item/itemForm";
}
return "redirect:/";
}
* 내용 참고 - 책 '스프링 부트 쇼핑몰 프로젝트 with JPA'
'Spring & Spring Boot' 카테고리의 다른 글
Spring Boot 쇼핑몰 프로젝트 | 상품 관리 (0) | 2024.08.17 |
---|---|
Spring Boot 쇼핑몰 프로젝트 | 상품 등록 (0) | 2024.08.04 |
Spring Boot 쇼핑몰 프로젝트 | 엔티티 연관 관계 매핑, 엔티티 공통 속성 공통화 (0) | 2024.08.02 |
Spring Boot 쇼핑몰 프로젝트 | 로그인/로그아웃 화면 연동, 페이지 권한 설정 (0) | 2024.08.01 |
Spring Boot 쇼핑몰 프로젝트 | 로그인 기능 구현 (0) | 2024.08.01 |