티스토리 뷰
Springboot 공부하면서 헷갈리는 내용 기록
1. PUT, DELETE 요청 방법 / @RequestBody
form 태그에서는 put,delete로 보내면 get으로 들어간다.
그래서 ajax로 put 보냈는데 또 안됨(타임리프 쓰기전에는 잘됬음)
타임리프를 쓰면 RestController -> Controller로 바꿔서 그러는것 같다.
그래서 PutMapping하는곳에만 ResponseBody를 붙여줘도 안된다. (메소드 리턴값에 ResponseBody를 붙이면 되는것 같다.)
=> properties에 spring.mvc.hiddenmethod.filter.enabled=true 추가한뒤
form 안에 <input type="hidden" name="_method" value="put"/> 추가하니까 put으로 요청이 가능해졌다.
spring.mvc.hiddenmethod.filter.enabled=true
<input type="hidden" name="_method" value="put"/>
그래도 Controller에서 RequestBody로 받으면 안되고 ModelAttribute로 받아야 작동한다. (이유를 모르겠는데 타임리프 쓰기 전에는 RequestBody로 받았었음, form으로 보내줄때만 그런가)
=> form태그로 값을 서버에 보내주게 되면 Json형식으로 보내주는게 아니기 때문에 @RequestBody를 쓰면 에러가 난다. 그래서 RequestBody를 제거하고 받는 Dto에 Setter를 추가하면 정상적으로 받을 수 있다.
그리고 ModelAttribute는 RequestBody와 다르게 set이 없으면 넣어주지 못한다. 원래 이게 맞는것 같은데 RequestBody는 특이하게 set이 없어도 자동으로 넣어준다.
자세한 설명은 밑에 자료를 보면 도움이 될 것같다.
2. @ModelAttribute
@ModelAttribute를 붙이는 것과 안붙이고 받는차이를 정확히 몰랐다 왜냐면 둘다 Setter를 선언해줘야 했기 때문에 @ModelAttribute를 왜 붙이나 했는데 @ModelAttribute가 붙은 객체는 view단에서 데이터를 호출할 수 있기때문에 쓰이는 것 같다.
3. 타임리프 사용할때 RestController
@RestController를 사용거나 @ResponseBody가 붙어있으면 return 문자열시 html을 안띄워주고 문자열만 띄워준다.
Controller는 사용자의 요청이 오면 등록된 ViewResolver를 통해 사용자에게 text/html 타입의 응답을 보내주게 된다.
RestController는 ViewPage를 통해 출력되는것이 아니라 HTTP ResponseBody에 직접 쓰여지게 된다. 사용자의 요청이 오면 Message Converter를 통해서 application/json, text/plain 등 알맞는 형태로 리턴되게 된다.
아직 타임리프가 어떻게 동작하는지 잘 모르기때문에 더 헷갈리는것 같다.
'Programming > Springboot' 카테고리의 다른 글
[Springboot] JPA, N + 1 쿼리 증가 문제 (0) | 2021.05.15 |
---|---|
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 3 (0) | 2021.04.16 |
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 2 (0) | 2021.04.11 |
[Springboot] 자바 ORM 표준 JPA 프로그래밍 - 1 (0) | 2021.04.08 |