티스토리 뷰

오늘 타임리프 관련해서 생긴 문제로 계속 구글링을 하다가 정말로 엄청나게 공부가 많이 됐다.

 

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
링크
«   2024/10   »
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
글 보관함