[Spring Boot 쇼핑몰] CRUD - Item 클래스

개발자·2022년 1월 28일

Spring boot 쇼핑몰

목록 보기
7/14
post-thumbnail

메인페이지를 구현하였으니 이제 설계한 Item을 이용하여 CRUD, 즉 아이템 등록, 조회, 수정, 삭제를 구현해 보려한다

ItemService.java

@RequiredArgsConstructor
@Service
public class ItemService {
    private final ItemRepository itemRepository;

    // 상품등록
    public void save(Item item, MultipartFile file) throws Exception{

        if(file != null){
            String projectPath = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\files";
            UUID uuid = UUID.randomUUID();
            String fileName = uuid + "_" + file.getOriginalFilename();
            File saveFile = new File(projectPath,fileName);
            file.transferTo(saveFile);

            item.setFilename(fileName);
            item.setFilepath("/files/" + fileName);
        }else{
            item.setFilepath("https://dummyimage.com/450x300/dee2e6/6c757d.jpg");
        }

        item.setCount(item.getStock());
        item.setSoldout(true);
        itemRepository.save(item);
    }

    // 전체 상품목록 조회
    public List<Item> itemList(){
        return itemRepository.findAll();
    }

    // 특정 상품 조회
    public Item itemView(Long id){
        return itemRepository.findById(id).get();
    }

    // 특정 유저 상품 조회
    public List<Item> userItemView(User user){
        List<Item> itemList = itemRepository.findAll();
        List<Item> tempList = new ArrayList<>();

        for(Item item : itemList){
            if(item.getUser() == user){
                tempList.add(item);
            }
        }

        return tempList;
    }

    // 특정 상품 수정
    public void itemModify(Item item, Long id, MultipartFile file)throws Exception{
        String projectPath = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\files";
        UUID uuid = UUID.randomUUID();
        String fileName = uuid + "_" + file.getOriginalFilename();
        File saveFile = new File(projectPath,fileName);
        file.transferTo(saveFile);

        Item tempItem = itemRepository.findItemById(id);
        tempItem.setName(item.getName());
        tempItem.setPrice(item.getPrice());
        tempItem.setStock(item.getStock());
        //tempItem.setSoldout(item.isSoldout());
        //tempItem.setCount(item.getCount());
        tempItem.setText(item.getText());
        tempItem.setFilename(fileName);
        tempItem.setFilepath("/files/" + fileName);

        itemRepository.save(tempItem);
    }

    // 특정 상품 삭제
    public void itemDelete(Long id){
        itemRepository.deleteById(id);
    }

}
  • 객체지향 개발 5가지 원리인 SOLID를 해치지 않기 위해서
    생성자 Injection 을 통하여 ItemRepository를 받아온다.

  • 그 뒤 ItemRepository를 이용하여 CRUD를 활용할 메소드를 구현한다.


ItemController.java

@Controller
@RequiredArgsConstructor
public class ItemController {
    private final ItemService itemService;

    // 상품등록 페이지
    @GetMapping("/item/write")
    public String itemWriteForm(){
        return "/user/itemwrite";
    }

    // 상품등록 처리
    @PostMapping("/item/writting")
    public String itemWritting(Item item, Model model, MultipartFile file,@AuthenticationPrincipal PrincipalDetails principalDetails)throws Exception{
        if(principalDetails.getUser().getRole().equals("ROLE_ADMIN") || principalDetails.getUser().getRole().equals("ROLE_SELLER")){
            item.setUser(principalDetails.getUser());
            itemService.save(item, file);
            return "redirect:/main";
        }else{
            return "redirect:/main";
        }
    }

    // 특정 상품정보 페이지 ( 비로그인 / 로그인구분 )
    @GetMapping("/item/view/{id}")
    public String itemView(@PathVariable Long id, Model model, @AuthenticationPrincipal PrincipalDetails principalDetails) {
        if (principalDetails == null) {
            model.addAttribute("item", itemService.itemView(id));
            return "/none/itemview";
        }else{
            model.addAttribute("user", principalDetails.getUser());
            model.addAttribute("item", itemService.itemView(id));
            return "/user/itemview";
        }
    }

    // 특정 상품정보 수정
    @GetMapping("/item/modify/{id}")
    public String itemModify(@PathVariable("id") Long id, Model model){
        model.addAttribute("item",itemService.itemView(id));

        return "/user/itemmodify";
    }

    // 특정 상품정보 수정처리
    @PostMapping("/item/update/{id}")
    public String itemUpdate(@PathVariable("id") Long id, Item item, MultipartFile file) throws Exception{
        itemService.itemModify(item,id,file);

        return "redirect:/main";
    }

    // 특정 상품 삭제
    @GetMapping("/item/delete")
    public String itemDelete(Long id){
        itemService.itemDelete(id);

        return "redirect:/main";
    }

}
  • Controller를 통해 GetMapping, PostMapping을 수행한다.

    @GetMapping() ?
    Http Get 요청을 특정 핸들러 메소드에 맵핑하기 위한것으로 주소에 파라미터가 노출된다.

    @PostMapping() ?
    GetMapping과는 다르게 주소창에 파라미터가 노출되지 않으며 사용자의 정보입력에 대응하기 위한 어노테이션이다.

  • 프론트엔드단에 html 파일을 생성하고 return 값으로 파일위치를 준다.

  • 이전에 구현했던 로그인 시스템을 이용하여 User의 정보를 받아오고 그것을 이용하여 User의 ROLE, 로그인 여부를 확인한다.

    return "redirect:/main" ?
    여기서는 html 파일의 경로를 주지않고 redirect를 사용하였다.
    html 파일을 return값으로 주게될 경우 그에 해당하는 view를 보여주는것이지만,
    redirect:/ 는 뒤에있는 주소로 URL을 다시 요청하는 방식이다.

  • Model model 은 MVC를 이용하여 데이터를 프론트엔드쪽에 보내는 역할을 하게된다.


ShopController.java

@RequiredArgsConstructor
@Controller
public class ShopController {
    private final ItemService itemService;

    // 메인페이지 ( 비로그인 유저 )
    @GetMapping("/")
    public String home(Model model){
        List<Item> itemList = itemService.itemList();
        model.addAttribute("itemlist",itemList);
        return "/none/main";
    }

    // 메인페이지 ( 로그인 유저 )
    @GetMapping("/main")
    public String main(Model model, @AuthenticationPrincipal PrincipalDetails principalDetails){
        List<Item> itemList = itemService.itemList();
        model.addAttribute("itemlist",itemList);
        model.addAttribute("user",principalDetails.getUser());
        return "/user/main";
    }


}
  • 이전시간에 구현했던 메인페이지도 다음과 같이 수정하도록 한다.

  • 전체 아이템리스트를 메인화면으로 정하였고 이를 Model을 통해 프론트엔드로 보내주어 페이지를 확인할수 있도록 한다.

0개의 댓글