Springboot에서 @RequestBody 어노테이션을 사용하여 http body를 받는데 파싱 에러가 난다.
JSON parse error: Cannot deserialize value of type `java.util.ArrayList<uj.notion.dto.BlockRequestDto>` from Object value (token `JsonToken.START_OBJECT`)]
에러 문구를 보면 parse error가 나서 json을 객체로 바꾸지 못하고 있다. DTO 정의가 잘못 된 것 같다.
현재 controller단 로직은 이렇다.
@PutMapping("/api/block")
public ResponseEntity<Void> saveBlock(@RequestBody BlockRequestDto rootBlock){
System.out.println("Type: " + rootBlock.getType());
if (rootBlock.getContent() != null) {
System.out.println("자식 블록 개수: " + rootBlock.getContent().size());
}
return ResponseEntity.ok().build();
}
fe에서 넘겨주는 json 형식은 다음과 같다.

content에 한 번 감싸져서 들어오고 있다.
근데 내가 서버에서 받는 방식은 바로 안쪽 데이터에 접근하고 있었다. 즉 문제는 Json 형식과 매핑할 객체의 구조가 맞지 않아서이다.
@Getter
@Setter
@NoArgsConstructor
@ToString
public class BlockRequestDto {
private String type;
private List<BlockRequestDto> content = new ArrayList<>();
private String text;
}
해결 방법은 Json 구조와 일치하도록 BE에서 BlockRequestDto를 감싸는 껍데기 DTO를 하나 더 만들거나, FE에서 content 데이터를 열어서 보내면 된다.
방법1. BE에서 해결
BlockRequestDto는 유지한 채 껍데기를 하나 만들어준다.
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class TaskPayloadDto {
private BlockRequestDto content;
}
방법2. FE에서 해결
- FE에서 API 요청할 때 payload에서 playload.content로 보낸다.
export const updateTaskContent = async (id: string, payload: any) => {
try{
const rest = await apiClient.put(`/api/block`, payload.content)
console.log("[put]/block :", rest.data)
return rest.data;
} catch (err: any){
const errorMessage = err.response?.data?.message || "[put]/block";
console.error("요청 실패:", errorMessage);
}
}
그럼 무사히 파싱 성공한다.
@RequestBody 에러를 만난 김에 다음 포스팅에서 @RequestBody에 대해 알아보자.
2025.12.30 - [IT 정보/스프링 부트] - @RequestBody란?
@RequestBody란?
핵심@RequestBody는 HTTP 요청 본문에 담긴 데이터를 자바의 객체로 변환(역직렬화)해주는 역할을 한다.이때 안쪽 로직에서는 HttpMessageConverter 인터페이스와 Jackson 라이브러리가 사용된다. 작동 원리
uzinlab.tistory.com
'IT 정보 > 스프링 부트' 카테고리의 다른 글
| [Spring Framework] Spring Web MVC (0) | 2026.01.08 |
|---|---|
| @RequestBody란? (1) | 2025.12.30 |
| [Spring] SOLID 원칙을 지켜보자 (1) | 2024.03.26 |
| [Spring] h2적용 후 postman으로 테스트하기 (0) | 2024.02.22 |
| 스프링 : 빈 등록하기 (0) | 2023.12.14 |