Programming/Spring Boot

SpringBoot form-data list object (객체 리스트 받는 방법)

Jan92 2022. 9. 6. 00:13
반응형

스프링 부트에서 form-data 형식으로 데이터를 받는 과정 중, 리스트 형식의 객체를 받는 방법을 정리한 내용입니다.

해당 방법 외 다른 방법이 있는지가 궁금하여 찾아봤는데, 아직까지 발견하지 못했습니다. 혹시 해당 내용이 아닌 다른 방법을 아신다면 내용 댓글이나 링크 남겨주시면 참고하겠습니다. 미리 감사드립니다.

 

 

1. 사용자 정의 객체 리스트가 아닌 일반적인 리스트 받는 방법 

@PostMapping("")
public void formDataArrayListTest(@RequestParam(name = "name") List<String> nameList) {
    //출력
    nameList.stream().forEach(name -> System.out.println("name : " + name));
}

먼저 복잡한 객체가 아닌 단순한 리스트를 받는 방법입니다.

 

 

form-data list

해당 방법은 비교적 간단하게 처리할 수 있는데요. 

@RequestParam 어노테이션을 통해 요청받는 데이터의 key 값을 설정할 수 있으며, 만약 @RequestParam 어노테이션을 적용하지 않는 경우, 위 코드를 예시로 들면 Controller에서 인자로 받는 리스트의 이름인 nameList를 key 값으로 하여 리스트 데이터를 받을 수 있습니다.

 

 

2. 사용자 정의 객체를 리스트로 받는 방법

@PostMapping("")
public void formDataArrayListTest(@ModelAttribute MemberListReq memeberListReq) {
    //출력
    memberListReq.getMemberList().stream().forEach(member -> {
        System.out.println("member name : " + member.getName());
        System.out.println("member address : " + member.getAddress());
    });
}

(Controller)

 

@Getter
@Setter
public static class MemberListReq {
    List<Member> memberList;
}

@Getter
@Setter
public static class Member {
    private String name;
    private String address;
}

(RequestDto)

 

form-data 방식에서 사용자 정의 객체를 리스트로 받기 위해서는 다음과 같이 해당 객체의 리스트를 인자로 둔 객체를 하나 만들고 컨트롤러 단에서 @ModelAttribute 어노테이션을 사용해서 받는 방법이 있는데요.

 

 

form-data list object

이 경우에는 다음과 같이 'memberList[idx].name', 'memberList[idx].address'와 같은 형식으로 데이터를 입력받게 됩니다.

이 방법의 경우 [idx] 부분이 중요한데요.

 

 

spring boot form-data list

만약 이렇게 데이터가 들어오는 경우, 첫 번째 member 객체는 name = "짱구", address = "서울시 강남구"라는 값을 가지게 되겠지만, 두 번째 member 객체는 name = "철수", address = null, 세 번째 member 객체는 name = null, address = "서울시 송파구"와 같은 데이터를 가지게 됩니다.

 

이렇게 form-data 형식으로 데이터를 받을 때, 해당 방식이 정상적으로 동작은 하지만 과연 더 좋은 방법이 없는지 궁금하여 찾아봤는데 아직 다른 방법을 찾지는 못했습니다. 

(물론 json 형식으로 데이터를 받는 것이 편하겠지만 form-data로 받는다는 가정 하에 생각해본 부분입니다.)

 

혹시 다른 방법이 있다면 알려주시면 참고하겠습니다. 감사합니다.

반응형