Kotlin SpringBoot에서 POST 메소드의 데이터가 Null일 경우

PublicMinsu·2023년 8월 20일
0

개요

그냥 간단하게 개요를 넣어보고 싶었다.
바로 문제로 넘어가도 된다.

내가 유니티를 쓰는 이유는 간단하다.
비교적 문서와 자료가 많다.

이렇듯 문서와 자료가 많은 언어는 비교적 문제를 쉽게 풀어나간다.

코틀린 스프링부트는 그런 면에서 보면 꽝이지 않을까 싶다.
이번 문제는 어떻게 보면 초보적인 문제지만 스프링부트를 잘 모른다는 점, 코틀린도 잘 모른다는 점에서 생겨난 문제 2개를 소개하고자 한다.

문제

Controller에서 받아야 하는 데이터가 NULL이라고 오류가 뜬다.

2가지 경우에서 생겨난 일이기에 2가지 경우에 대해서 답하겠다. (기본적으로 변수명은 똑같이 했다는 가정을 한다)

WARN 16896 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed in public 자료형(자료형): [Error in object '자료형': codes []; arguments []; default message [Parameter specified as non-null is null: method 자료형 parameter 변수명]] ]

밑에 에러는 POSTMAN에서 POST로 요청을 보냈는데도 오류가 난 것이다.

"message": "Request processing failed: org.springframework.beans.InvalidPropertyException: Invalid property 'tableList[0]' of bean class [자료형]: Illegal attempt to get property 'tableList' threw exception"

해결법

전송 Content-Type 확인

만약 보내는 곳에서 JSON으로 보낸다면 @RequestBody 어노테이션을 적어줘야 한다. JSON이 많이 쓰이기에 기본 값처럼 보이지만 그렇지 않다.

만약 @RequestBody 또는 JSON을 안쓰고 싶다면 보내는 곳에서 FormData로 보내면 된다. FormData에 해당하는 어노테이션은 @ModelAttribute를 쓸 수 있다. (생략 가능하다)

FormData로 List 전송일 경우에는 Data class 수정


리스트의 요소의 변수들이 val로 작성됐다면 var로 수정하고 생성자를 작성하면 된다.
생성자 구현은 위의 2가지 중 하나를 택하면 된다.

List의 경우 Null을 허용하면 된다.

기존의 코드에서는 신경 쓰지 않아도 되는 부분이었다.
DTO로 받은 값이 변경될 일이 없다면 val로 작성해도 됐고 생성자 또한 필요 없었다.
그렇기에 당연히 리스트도 그럴 줄 알았는데 아니었다.

위의 과정이 필요한 것을 보면 일단 객체를 생성하고 그 뒤의 값을 변경하는 방식으로 객체를 구성하는 것 같다.

23.08.31 MultipartFile 리스트의 경우 val로 하여도 됐고 POSTMAN에서는 배열의 인덱스를 안 적어줘야 했다. 아마도 형식이 다르기 때문일 것 같다.

23.09.30

객체의 경우 리스트가 아닌 경우에도 Nullable하게 받으면 된다.

또는 기본 생성자를 이용하여 만들어줘도 된다.

profile
연락 : publicminsu@naver.com

1개의 댓글

comment-user-thumbnail
2023년 12월 19일

선생님 정말 감사합니다... 드디어 발뻗고 잘 수 있을 것 같습니다.

답글 달기