인프런 커뮤니티 질문&답변

lgh8079님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

변경 감지와 병합(merge)

상품 수정 500에러가 뜹니다.

작성

·

117

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
상품 수정 하려 했더니 다음과 같은 에러가 뜹니다. 강의 듣고 작성한 코드인데 어떤 부분이 잘못됐는지 알고 싶습니다.

package jpabook.jpashop.controller;

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/createItemForm";
    }

    @PostMapping("/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";
    }

    @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) {
        Book item = (Book) itemService.findOne(itemId);

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

        model.addAttribute("form", form);
        return "items/updateItemForm";
    }

    @PostMapping("/items/{itemId}/edit")
    public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) {

        Book book = new Book();
        book.setId(form.getId());
        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";
    }
}
package jpabook.jpashop.repository;

import jpabook.jpashop.domain.item.Item;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import jakarta.persistence.EntityManager;
import java.util.List;

@Repository
@RequiredArgsConstructor
public class ItemRepository {

    private final EntityManager em;

    public void save(Item item) {
        if (item.getId() == null) {
            em.persist(item);
        } else {
            em.merge(item);
        }
    }

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

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

답변 2

0

안녕하세요. lgh8079님, 공식 서포터즈 OMG입니다.

build 실행을 Gradle로 변경하여 확인해보시겠어요?

image

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. lgh8079님의 “상품 수정 500에러” 문제를 살펴보았습니다. 에러 페이지와 코드를 기반으로 가장 주목해야 할 부분은 @PostMapping("/items/{itemId}/edit")에서 itemIdString으로 받고 계신 점입니다. 그러나 보통 ID 값은 Long 타입으로 처리하는 것이 일반적입니다. 이로 인해 타입 불일치 문제가 발생할 수 있으며, 데이터를 처리하는 과정에서 예상치 못한 에러로 이어질 수 있습니다.

또한, 에러 페이지 상의 메시지에서 컴파일러가 ‘-parameters’ 플래그를 사용해야 한다는 메시지가 보이는데, 이는 @PathVariable과 같은 어노테이션을 사용할 때 메소드 파라미터의 이름을 유지하기 위해 필요한 설정입니다. 이 설정 없이는 스프링 MVC가 URL 경로에서 변수 이름을 바인딩할 수 없어 해당 이슈가 발생할 수 있습니다.

이와 유사한 문제와 해결 방법이 아래 링크에 상세하게 나와 있으니 참고하시기 바랍니다:
- 섹션7 상품 수정이 페이지가 연결이 안됩니다.
- editForm 500에러

요약하자면, 첫 번째 링크의 질문과 답변은 updateItemForm 페이지를 불러오는 과정에서 발생한 문제와 유사하며, 경로 설정과 파일 위치 확인이 해결책 중 하나로 제시되었습니다. 두 번째 링크에서는 @PathVariable 사용과 관련하여 파라미터 이름이 명시되지 않아 발생한 문제와 그 해결책을 제시하고 있습니다.

상품 수정 기능 구현 과정에서 발생하는 에러는 대부분 경로 설정 누락, 타입 불일치, 컴파일러 설정 누락 등의 문제로 인해 발생할 수 있습니다. 이런 문제는 코드의 일부만으로는 정확한 원인을 진단하기 어렵기 때문에, 제공된 링크들의 해결 방법을 참고하여 상황에 맞게 적용해보세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

lgh8079님의 프로필 이미지

작성한 질문수

질문하기