inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

정리

/add에 dto사용 질문입니다.

해결된 질문

125

jungbeen

작성한 질문수 7

0

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

[질문 내용]

  1. 새로고침 시 상품이 중복 등록되는 문제는 POST가 멱등하기 때문인 것이 맞나요?

  2. /add에서 @ModelAttribute로 Item 객체를 바로 만들어서 save했는데, 이 경우 Dto를 거쳐서 저장하는 것이 올바른 방법인가요?

  3.  

@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번 문제는 해결되었습니다. 하지만 이전 코드에서 왜 저런 예외가 떴는지는 아직 모르겠습니다.

spring mvc

답변 1

0

y2gcoder

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

  1. 아닙니다. 만약 POST 요청이 멱등하다면, 동일한 POST 요청을 여러 번 보내도 서버의 상태가 변하지 않아야 합니다. 같은 데이터로 여러 번 요청을 보내도 응답은 같으나 상품은 한 번만 등록되어야 합니다 🙂

  2. 말씀하신 대로 DTO를 받아 엔티티로 변환 후 저장하거나, 엔티티를 조회한 후 DTO로 변환해서 응답해주는 방식으로 하는 것이 좋았습니다 🙂

  3. 보여주신 부분만 보고 말씀을 드리자면, 수정 전 코드에서는 model 객체에 id 필드가 없는 itemDto를 넣어 basic/item이라는 뷰와 함께 반환해주고 있습니다. /resource/templates/basic/item.html 를 많이 고쳐주시지 않았다면 해당 템플릿 파일에서는 모델에서 받아온 객체에서 id를 구하는 곳이 있지만, 모델 객체에는 id 필드가 없기 때문에 말씀해주신 예외가 발생한 것으로 보입니다 🙂 그리고 수정 해주신 코드에서는 저장한 결과를 바탕으로 받은 id값을 이용해 리다이렉트/basic/items/{itemId} 엔드포인트를 호출하고 있습니다. 본 챕터를 다시 복습해주시면 리다이렉트로 일어나는 일들에 대해서는 이해하실 수 있으실 거라 생각합니다 🙂

 

 

감사합니다.

1

jungbeen

감사합니다!

servlet과 container에 대한 질문입니다

0

25

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

64

1

jsp 의존성 수정 요청

0

78

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

143

1

save() 메서드 문의

0

67

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

101

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

97

1

RequestMapping을 이용한 핸들러, 어댑터

0

119

2

save 후 결과화면

0

89

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

178

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

100

3

파일 오픈 시

0

70

1

스프링 배치 관련

0

78

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

95

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

79

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

75

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

139

1

html 변경하는 부분 적용 문제

0

103

1

한글 깨짐

0

76

2