해결된 질문
작성
·
232
0
우선 강의 정말 유익했으며 친절한 답변도 항상 감사하고 있습니다~
강의가 진심으로 재미있어요!
제가 강의를 마치고 이것저것 해보고 싶어서 시도중입니다.(JPA 기본강의 잘듣고있습니당)
해보고싶은건 많지만 우선 Book 말고 Album과 Movie도 사용해보고 싶었습니다.
현재상황
- Item 엔티티에 itemType 변수추가(어떤 item인지 식별하기 위해서)
- Album,Movie의 Form객체,컨트롤러, 뷰(html)파일 등 생성
-서비스는 따로 구현x ItemService만 사용
주문 목록에 올리는것까진 금방했는데 수정에서 좀 걸렸습니다.
삽질하다가 결국 생각해낸게 조금지저분하지만.. ItemType으로 어떤 아이템인지 if문으로 식별해서
각 아이템에 맞는 수정페이지를 매핑하는 방법으로 했습니다. updateItem 메서드에서 파라미터로 받기위한 ItemForm 객체를 하나 만들어서 업데이트 했습니다.
--------------- ItemController
package jpabook.jpashop.controller;
import jpabook.jpashop.domain.item.Album;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@Controller
@RequiredArgsConstructor
public class ItemController {
private final ItemService itemService;
// 아이템 선택 페이지로 매핑
@GetMapping("/items/new")
public String createForm(Model model) {
//model.addAttribute("form", new BookForm());
return "items/createItemFormAll";
}
// Book 클릭시 등록 페이지로 매핑
@GetMapping("/items/createItemForm")
public String CreateBook(Model model){
model.addAttribute("form", new BookForm());
return "items/createItemForm";
}
// 등록 페이지에서 버튼 클릭시 Book 생성 후 목록화면으로 매핑
@PostMapping("items/new/Book")
public String create(BookForm form) {
Book book = new Book();
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
book.setItemType("Book");
itemService.saveItem(book);
return "redirect:/items";
}
// 상품 목록 클릭시 리스트 화면으로 매핑
@GetMapping("/items")
public String list(Model model) {
List<Item> items = itemService.findItems();
model.addAttribute("items", items);
return "items/itemList";
}
//상품 수정 화면 렌더링
@GetMapping("items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
Item item = itemService.findOne(itemId);
if(item.getItemType() == "Book"){
BookForm form = new BookForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
model.addAttribute("form", form);
return "items/updateItemForm";
}else if(item.getItemType() == "Movie"){
MovieForm form = new MovieForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
model.addAttribute("form", form);
return "items/updateItemFormMovie";
}else if(item.getItemType() == "Album"){
AlbumForm form = new AlbumForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
model.addAttribute("form", form);
return "items/updateItemFormAlbum";
}else {
//에러처리..
}
return null;
}
//상품 수정
@PostMapping("items/{itemId}/edit")
public String updateItem(@ModelAttribute("form") ItemForm form) {
itemService.updateItem(form.getId(), form.getName(), form.getPrice(), form.getStockQuantity());
return "redirect:/items";
}
}
--------------- ItemForm
package jpabook.jpashop.controller;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class ItemForm {
private Long id;
private String name;
private int price;
private int stockQuantity;
}
문제는 ItemForm을 이용하다보니 각 아이템의 고유필드값(Book-isbn,author Movie-director,actor 등)을 수정 못합니다.
Category객체를 이용해야 되나 싶었는데 손을 못대겠더라구요ㅠ
결국 제가 궁금한것은 이거입니다.
실무에선 어떤 방식으로 여러 item들을 사용하나요??
어떤식으로 코드를 짜야하는지 궁급합니다
답변 1
0
안녕하세요. 지훈님
생각해보면 책을 등록하기 위한 화면과, 영화를 등록하기 위한 화면은 완전히 다른 화면일 가능성이 매우 높습니다.
여러가지 방법이 있지만 가장 단순하면서 실용적인 방법은 수정화면을 출력하기 위한 컨트롤러, view, 수정 처리를 하기 위한 컨트롤러까지 각각 따로 만드는 방법을 추천합니다.
감사합니다.