문제상황
여러 개의 파일과 단일 데이터를 받고자 하는데, 이때 클라이언트측에서 보내는 파일의 순서가 중요합니다. 즉, 클라이언트에서도 파일의 순서를 정확히 알고 전달해야 하며, 서버또한 파일의 순서대로 데이터를 생성해야 합니다.
찾은 해결 방법은 3가지 정도 있었습니다.
1. 사진을 Base64로 인코딩하여 JSON을 이용하여 전달받기
문제점
1. base64로 이미지를 변환하는 경우 최대 33%까지 파일 크기가 증대되어 네트워크 대역 낭비가 심하다고 한다.
2. Spring은 특정 크기 이상의 데이터가 오면 요청을 해석하지 못한다.
2. 파일 데이터 리스트와 단일 데이터들을 @RequestPart, @RequestParm 등을 사용하여 받기
public void create(
@RequestParam("files") List<MultipartFile> files,
@RequestParam("data") CreateData data)
문제점
1. 파일의 순서를 명확하게 보낼 수 없다.
2. form을 이용해 데이터를 전달받고, 해당 데이터를 객체로 매핑하기 위해 Spring Type Conversion을 사용해야 한다.
3. @ModelAttribute를 사용하여 formdata를 하나의 객체로 바인딩
@Builder
@Getter @Setter
@AllArgsConstructor
public class CreateRequest {
private List<MultipartFile> files;
private Long userId;
private Long branchId;
private String message;
}
@PostMapping
public ResponseEntity<ResultResponse> create(
@Valid @ModelAttribute LogCreateRequest request) {
System.out.println(request.getFiles().get(0).getOriginalFilename());
System.out.println(request.getFiles().get(1).getOriginalFilename());
System.out.println(request.getMessage());
System.out.println(request.getUserId());
System.out.println(request.getBranchId());
return ResponseEntity.ok(ResultResponse.of(ResultCode.CREATE_SUCCESS, ""));
}
3번 방법을 사용하니 코드도 훨씬 깔끔해졌고, 각 파일의 순서를 명확히 전달할 수 있었습니다.
@RequestBody vs @ModelAttribute
@ModelAttribute를 이용하여 구현할 때는 @RequestParm/RequestPart/RequestBody를 사용할 때와 다르게 Setter가 필요했습니다. 위 애너테이션은 모두 클라이언트에서 보낸 데이터를 자바 코드에서 사용 가능한 오브젝트로 만들어주지만, 내부 동작에서 차이가 있기 때문입니다.
@RequestBody는 클라이언트가 보내는 HTTP 요청의 본문의 데이터(Json, XML, TEXT)가 HttpMethodConverter를 통해 파싱되어(직렬화) 객체로 변환되지만, @ModelAttribute는 클라이언트가 보내는 HTTP 파라미터(쿼리스트링, 폼데이터)를 특정 오브젝트에 바인딩(매핑) 해주는 것이기 때문입니다.
즉, @ModelAttribute를 사용할 때는 객체의 각 필드에 접근해 데이터를 바인딩 할 수 있는 생성자나 setter가 필요합니다.
'Backend > Spring Boot' 카테고리의 다른 글
[Spring Boot] AWS S3 연결이 비공개로 설정되어 있지 않습니다. (0) | 2023.04.24 |
---|---|
[Spring Boot] AWS S3 연결 - 다중 파일 업로드 (0) | 2023.04.20 |
[자바 ORM 표준 JPA 프로그래밍] 4장 (0) | 2023.04.11 |
[자바 ORM 표준 JPA 프로그래밍] 3장 (0) | 2023.04.11 |
[자바 ORM 표준 JPA 프로그래밍] 1장 (0) | 2023.04.04 |