티스토리 뷰
오늘 타임리프 관련해서 생긴 문제로 계속 구글링을 하다가 정말로 엄청나게 공부가 많이 됐다.
html form태그의 POST 메소드 전송은 HTTP 헤더의 Content-Type 값이 기본적으로 application/x-www-form-urlencoded로 서버에 전송된다는 사실을 알게 됐다.현재 만들고있는 kkaemiGG 사이트의 컨트롤러를 다음과 같이 만들어서 문제가 발생했었다.
@RequiredArgsConstructor
@RestController
public class PostsApiController {
private final PostsService postsService;
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestDto requestDto) {
return postsService.save(requestDto);
}
}
이 상태에서 에러가 나지 않게 하려면 Content-Type 값을 application/json으로 바꿔서 json으로 서버에 값을 보내 주거나
컨트롤러 메소드들의 메소드 시그니처 매개변수 리스트에 있는 @RequestBody 어노테이션을 @ModelAttribute로 바꿔줘야 한다.
위와 같은 경우에 @ModelAttribute 어노테이션을 사용하기 위해선 PostsSaveRequestDto 클래스에 반드시 Setter 메소드가 있어야 한다.
왜냐하면...
@RequestBody 어노테이션은 클라이언트로부터 json 형식으로 값을 받아와서 Jackson라이브러리가 Java 객체로 만들어주기 때문에 Setter 메소드가 필요 없다.
@ModelAttribute 어노테이션은 클라이언트로부터 받은 파라미터들을 하나하나 Setter 메소드로 객체에 넣어주기 때문에 반드시 Setter 메소드가 있어야 한다.
덧붙여서
@RequestParam 어노테이션은 클라이언트로부터 데이터를 파라미터 값으로 하나하나 받을 때 사용하는데, required 속성으로 반드시 필요한 값인지 설정할 수 있고 defaultValue 속성으로 기본값을 정해줄 수도 있다.
'TIL' 카테고리의 다른 글
자바 람다식에 대해 (0) | 2021.02.08 |
---|---|
자바(Java) 스레드(Thread) 공부 (0) | 2021.02.07 |
타임리프(Thymeleaf)에 대해 (0) | 2021.02.05 |
Spring 빌드 클린 (2) | 2021.02.04 |
JPA 더티 체킹 (0) | 2021.02.03 |
- Total
- Today
- Yesterday
- Stream
- IntelliJ
- 도커
- 유효성 검사
- bootstrap
- 이클립스
- optional
- git
- 충돌에러
- rbenv
- Jackson
- 인텔리제이
- interface
- 데이터베이스
- Github
- java
- 스트림
- homebrew
- Thymeleaf
- Set
- Gson
- EC2
- S3
- 타임리프
- Docker
- Spring
- gem
- IDE
- framework
- JSON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |