JAVA SPRING/PROJECT

[Day-12] 상품 등록, 목록, 수정

sshhhh 2023. 8. 25.

파일 구조


#상품 등록

상품 등록 폼에서 데이터를 입력하고 Submit 버튼을 클릭하면 /items/new를 POST 방식으로 요청

상품 저장이 끝나면 상품 목록 화면( redirect:/items )으로 리다이렉트

 

 

ItemController

/**
 * 상품 등록 클릭시
 */
@GetMapping(value = "/items/new")
public String createForm(Model model) {
    model.addAttribute("form", new BookForm());  //이렇게 넘겨줘서 html에서 추적가능
    return "items/createItemForm";
}


/**
 * 상품 등록 (submit)
 */
@PostMapping(value = "/items/new")
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());

    itemService.saveItem(book);

    return "redirect:/items"; //저장된 책 목록으로
}

 

 

ItemService

/**
 * 상품 등록
 */
@Transactional
public void saveItem(Item item) {
    itemRepository.save(item);
}

 

ItemRepository

private final EntityManager em;

//item은 jpa에 저장하기 전까지 id값이 없다(=완전히 새로 생성하는 객체)
public void save(Item item) {
    if ((item.getId() == null)) {
        em.persist(item); //상품 신규 등록
    } else { //만약에 db에 이미 있는 값이라면 수정
        em.merge(item);
    }
}

 

 

 

 

http://localhost:8080/items/new

 

 

#상품 목록

 

 

ItemController

/**
 * 상품 목록
 */
@GetMapping(value = "/items")
public String list(Model model) {
    List<Item> items = itemService.findItems();
    model.addAttribute("items", items);
    return "items/itemList";
}

 

 

ItemService

/**
 * 상품 목록
 */
public List<Item> findItems() {
    return itemRepository.findAll();
}

 

 

ItemRepository

public List<Item> findAll() {
    return em.createQuery("select i from Item i",Item.class).getResultList();
}

 

 

 

 

http://localhost:8080/items

 

 

 

 

#상품수정

 

ItemController

/**
 * 상품 수정 폼
 * 폼에서 수정데이터 입력 후 ->수정되어야하니 form 있어야함
 */
@GetMapping("items/{itemID}/edit")
public String updateItemForm(@PathVariable("itemID") Long itemId, Model model) {

    Book item = (Book) itemService.findOne(itemId); //item Id 받아서 수정

    BookForm form = new BookForm(); //form을 수정할때 book엔티티가 아니라 form을 보낼거임

    form.setId(item.getId());
    form.setName(item.getName());
    form.setPrice(item.getPrice());
    form.setStockQuantity(item.getStockQuantity());
    form.setAuthor(item.getAuthor());
    form.setIsbn(item.getIsbn());

    model.addAttribute("form", form);  //updateItemForm으로 보낸다.

    return "items/updateItemForm";
}

 

ItemService

/**
상품 수정할때 쓴다.
 id받아서 수정하려고
 */
public Item findOne(Long itemId) {
    return itemRepository.findOne(itemId);
}

 

ItemRepository

private final EntityManager em;
 
public Item findOne(Long id) {
    return em.find(Item.class, id);
}

 

updateItemForm.html

submit 된 후 

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header" />
<body>
<div class="container">
    <div th:replace="fragments/bodyHeader :: bodyHeader"/>
    <form th:object="${form}" method="post"> <!--post 방식으로 보내기-->
        <!-- id -->
        <input type="hidden" th:field="*{id}" />
        <div class="form-group">
            <label th:for="name">상품명</label>
            <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요" />
        </div>
        <div class="form-group">
            <label th:for="price">가격</label>
            <input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요" />
        </div>
        <div class="form-group">
            <label th:for="stockQuantity">수량</label>
            <input type="number" th:field="*{stockQuantity}" class="form-control" placeholder="수량을 입력하세요" />
        </div>
        <div class="form-group">
            <label th:for="author">저자</label>
            <input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요" />
        </div>
        <div class="form-group">
            <label th:for="isbn">ISBN</label>
            <input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요" />
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
    <div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>

 

ItemController

/**
 * 상품 수정
 */
@PostMapping(value = "/items/{itemId}/edit") //post로 받았다.
public String updateItem(@ModelAttribute("form") BookForm form) { //th:object="${form}" 넘어오게 (이름은 상관없)

    Book book = new Book();

    book.setId(form.getId()); //form에 있는 걸로 수정해야
    book.setName(form.getName());
    book.setPrice(form.getPrice());
    book.setStockQuantity(form.getStockQuantity());
    book.setAuthor(form.getAuthor());
    book.setIsbn(form.getIsbn());

    itemService.saveItem(book);

    return "redirect:/items";
}

 

ItemService

/**
 * 상품 등록
 */
@Transactional
public void saveItem(Item item) {
    itemRepository.save(item);
}

 

ItemRepository

private final EntityManager em;

//item은 jpa에 저장하기 전까지 id값이 없다(=완전히 새로 생성하는 객체)
public void save(Item item) {
    if ((item.getId() == null)) {
        em.persist(item); //상품 신규 등록
    } else { //만약에 db에 이미 있는 값이라면 수정
        em.merge(item);
    }
}

 

상품 수정 폼 이동

1. 수정 버튼을 선택하면 /items/{itemId}/edit URL을 GET 방식으로 요청

2. 그 결과로 updateItemForm() 메서드를 실행하는데

   이 메서드는 itemService.findOne(itemId) 를 호출해서 수정할 상품을 조회

3. 조회 결과를 모델 객체에 담아서 뷰( items/updateItemForm )에 전달

 

상품 수정 실행

상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음

1. 상품 수정 폼에서 정보를 수정하고 Submit 버튼을 선택

2. /items/{itemId}/edit URL을 POST 방식으로 요청하고 updateItem() 메서드를 실행

3. 이때 컨트롤러에 파라미터로 넘어온 item 엔티티 인스턴스는 현재 준영속 상태다.

   따라서 영속성 컨텍스트 의 지원을 받을 수 없고 데이터를 수정해도 변경 감지 기능은 동작x

 

 


 

결과창

 

 

상품목록

http://localhost:8080/items

수정 form

http://localhost:8080/items/1/edit

수정완료

http://localhost:8080/items

 

 

 

 

 

 

 

 

강의 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

댓글