해결된 질문
작성
·
59
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
새로고침 시 상품이 중복 등록되는 문제는 POST가 멱등하기 때문인 것이 맞나요?
/add에서 @ModelAttribute로 Item 객체를 바로 만들어서 save했는데, 이 경우 Dto를 거쳐서 저장하는 것이 올바른 방법인가요?
@Data
public class ItemDto {
private String itemName;
private Integer price;
private Integer quantity;
}
@PostMapping("/add")
public String addItemTest(@ModelAttribute ItemDto itemDto) {
Item item = new Item(itemDto.getItemName(), itemDto.getPrice(), itemDto.getQuantity());
itemRepository.save(item);
return "basic/item";
}
dto를 사용하는 방식으로 변경해봤는데, id가 null이라는 예외가 발생했습니다.
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null
에러페이지가 나오지만 목록 페이지로 갔을 때 상품은 정상적으로 저장이 되고 있습니다.
controller의 save부분에서 item의 id가 자동으로 생성되고 있는데, 왜 이런 문제가 발생하는지 궁금합니다.
-- 수정 --
@PostMapping("/add")
public String addItemTest(@ModelAttribute ItemDto itemDto) {
Item item = new Item(itemDto.getItemName(), itemDto.getPrice(), itemDto.getQuantity());
itemRepository.save(item);
return "redirect:/basic/items/" + item.getId();
}
redirect로 수정하니 3번 문제는 해결되었습니다. 하지만 이전 코드에서 왜 저런 예외가 떴는지는 아직 모르겠습니다.
답변 1
0
안녕하세요. jungbeen님, 공식 서포터즈 y2gcoder입니다.
아닙니다. 만약 POST 요청이 멱등하다면, 동일한 POST 요청을 여러 번 보내도 서버의 상태가 변하지 않아야 합니다. 같은 데이터로 여러 번 요청을 보내도 응답은 같으나 상품은 한 번만 등록되어야 합니다 🙂
말씀하신 대로 DTO를 받아 엔티티로 변환 후 저장하거나, 엔티티를 조회한 후 DTO로 변환해서 응답해주는 방식으로 하는 것이 좋았습니다 🙂
보여주신 부분만 보고 말씀을 드리자면, 수정 전 코드에서는 model
객체에 id
필드가 없는 itemDto
를 넣어 basic/item
이라는 뷰와 함께 반환해주고 있습니다. /resource/templates/basic/item.html
를 많이 고쳐주시지 않았다면 해당 템플릿 파일에서는 모델에서 받아온 객체에서 id
를 구하는 곳이 있지만, 모델 객체에는 id
필드가 없기 때문에 말씀해주신 예외가 발생한 것으로 보입니다 🙂 그리고 수정 해주신 코드에서는 저장한 결과를 바탕으로 받은 id
값을 이용해 리다이렉트로 /basic/items/{itemId}
엔드포인트를 호출하고 있습니다. 본 챕터를 다시 복습해주시면 리다이렉트로 일어나는 일들에 대해서는 이해하실 수 있으실 거라 생각합니다 🙂
감사합니다.
감사합니다!