메인페이지를 구현하였으니 이제 설계한 Item을 이용하여 CRUD, 즉 아이템 등록, 조회, 수정, 삭제를 구현해 보려한다
@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를 활용할 메소드를 구현한다.
@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를 이용하여 데이터를 프론트엔드쪽에 보내는 역할을 하게된다.
@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을 통해 프론트엔드로 보내주어 페이지를 확인할수 있도록 한다.