반응형
안녕하세요. 개발자 Jindory입니다.
오늘은 Postman을 이용하여 데이터를 Json array로 요청하고 그 데이터를 Controller에서 처리하는 방법에 대해서 작성해보고자 합니다.
# 글 작성 이유
객체를 생성할때 Json Array형식으로 만들어서 요청하려고 했으나, List<객체명>으로 파라미터 형식을 선언했을때, 역직렬화 문제가 발생하여 찾아보다가 Controller에서 Json Array를 처리할 수 있는 방법을 발견하여 이를 기록하고자 작성하였다.
먼저 아래와 같은 상황이 존재한다고 가정하자.
Member를 등록하고자 하는데, 한번에 요청으로 여러명의 Member의 정보를 등록하여, 다수의 Member의 정보를 생성하고자 한다.
Member의 정보는 Player의 이름, 유니폼 번호, 주민번호, team 정보가 있다.
Postman을 통해 전달하고자 하는 정보는 아래와 같이 json으로 표현할 수 있다.
{
"members":[
{
"name" : "선수1",
"uniformNo" : 1,
"resRegNo" : "220506-1111111",
"team":"readTeam"
},
{
"name" : "선수2",
"uniformNo" : 2,
"resRegNo" : "220506-2222222",
"team":"redTeam"
},
{
"name" : "선수3",
"uniformNo" : 3,
"resRegNo" : "220506-3333333",
"team":"redTeam"
}
]
}
이때 Controller에서 Member의 정보를 받을 MemberDto를 정의하고 jsonArray이므로 아래와 같은 3가지 방법을 시도해 보도록 하자.
@Data
public class MemberDto {
private String name;
private String resRegNo;
private int uniformNo;
private String team;
}
1. List<MemberDto>로 받기
2. MemberDto[]로 받기
3. List<MemberDto>를 가진 MemberListDto 객체로 받기
@RestController
public class PlayerController {
@PostMapping("/memberList")
public ResponseEntity<?> registerMembers(@RequestBody List<MemberDto> members){
return new ResponseEntity<>(members,HttpStatus.OK);
}
@PostMapping("/memberArray")
public ResponseEntity<?> registerMembers(@RequestBody MemberDto[] members){
return new ResponseEntity<>(members,HttpStatus.OK);
}
@PostMapping("/memberListClass")
public ResponseEntity<?> registerMembers(@RequestBody MemberListDto members){
return new ResponseEntity<>(members,HttpStatus.OK);
}
}
1. List<MemberDto>로 받기
결과 :
"org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.ArrayList<core.player.dto.MemberDto>` from Object value (token `JsonToken.START_OBJECT`);
원인 : JACKSON 라이브러리가 어떤 타입으로 받아야할지 모르는 경우 역직렬화를 할 수 없어서 나타나는 에러이다. Json에서 요청한 Json Array에 매핑되는 형식이 없으므로 Controller에서 받았을때 JSON parse error가 발생한 것이다.
2. MemberDto[]로 받기
결과 :
"org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `[Lcore.player.dto.MemberDto;` from Object value (token `JsonToken.START_OBJECT`);
원인 : List<MemberDto>와 마찬가지로 전달받은 Json을 MemberDto[] Array 형식으로 역 직렬화 할 수 없어서 나타나는 에러이다. Json에서 요청한 Json Array에 매핑되는 형식이 없으므로 Controller에서 받았을때 JSON parse error가 발생한 것이다.
3. MemberListDto 객체를 생성하여 받기
MemberListDto는 List<MemberDto>를 객체로 가지고 있는 Class로 전달받을 객체에 대한 형식을 정의한 Class이다.
@Data
public class MemberListDto {
List<MemberDto> members;
}
위와 같은 형식으로 Controller에서 받을 Parameter를 정의했을때, 전달된 json형식이 List<MemberDto>에 매핑되어 문제 없이 처리됨을 알 수 있다.이렇게 Postman을 이용하여 데이터를 Json array로 요청하고 그 데이터를 Controller에서 처리하는 방법에 대해서 알아봤습니다.
혹시라도 정정할 내용이나 추가적으로 필요하신 정보가 있다면 댓글 남겨주시면 감사하겠습니다.
오늘도 Jindory 블로그에 방문해주셔서 감사합니다.
[참조]
반응형