개요
개인 프로젝트에 이미지 파일을 포함한 데이터를 전달하는 multipart/form-data 요청을 적용하였다. 이 기능을 테스트 하는 방법을 처음 알게되었고, 이 부분을 정리하려고 한다.
multipart/form-data 적용
먼저, Spring에서 multipart/form-data 요청을 적용하는 방법을 알아보자.
아래의 코드는 현재 프로젝트에서 카테고리 저장 api 요청을 전달받는 controller의 메소드이다.
@ResponseStatus(HttpStatus.CREATED)
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CategoryResponse save(@RequestParam String name,
@RequestPart MultipartFile iconFile) {
...
return categoryService.save(requestDto);
}
@PostMapping 어노테이션에 "consumes = MediaType.MULTIPART_FORM_DATA_VALUE" 를 적용해서 Content-Type이 multipart/form-data인 요청만 받겠다는 선언을 해주었다.
그리고, @RequestParam 혹은 @RequestPart을 사용해 multipart/form-data로 전달받을 데이터를 지정해주었다. 또는, 아래와 같이 전달받을 데이터 필드 담긴 DTO를 @ModelAttribute과 같이 사용하는 방법을 선택할 수도 있다.
@Getter
@Builder
public static class CategorySaveRequest {
private final String name;
private final MultipartFile iconFile;
...
}
@ResponseStatus(HttpStatus.CREATED)
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CategoryResponse save(@ModelAttribute CategorySaveRequest requestDto) {
return categoryService.save(requestDto);
}
multipart/form-data 테스트
그러면 위에서 작성한 코드가 정상적으로 작동하는지 테스트를 통해 알아보자.
multipart/form-data도 다른 API 요청 테스트와 같이 MockMvc를 통해 테스트를 진행할 수 있다.
String name = "category";
MockMultipartFile iconFile = new MockMultipartFile(
"iconFile",
"categoryIcon.png",
"image/png",
"categoryIcon.png".getBytes());
ResultActions response = mockMvc.perform(multipart("/api/categories")
.file(iconFile)
.part(new MockPart("name", name.getBytes(StandardCharsets.UTF_8))));
테스트용 MultipartFile을 구현하기 위해 MockMultipartFile 클래스를 이용하였다.
그리고 주의깊게 확인해야 할 점은, POST method 임에도 불구하고 mockMvc.perform(post("/api/categories")) 가 아닌, mockMvc.perform(multipart("/api/categories")) 를 사용했다는 것이다. 이렇게 해야 MockMultipartFile을 구현한 파일 객체를 제대로 전달할 수 있기 때문이다.
그리고, 이미지 파일 외에 전달할 다른 데이터가 있다면 위의 코드와 같이 .part() 안에 MockPart() 을 사용하거나, 아래와 같이 쿼리 파라미터로 전달하는 방식을 사용할 수도 있다.
String name = "category";
MockMultipartFile iconFile = new MockMultipartFile(
"iconFile",
"categoryIcon.png",
"image/png",
"categoryIcon.png".getBytes());
ResultActions response = mockMvc.perform(multipart("/api/categories")
.file(iconFile)
.param("name", name));
마지막으로, 응답이 제대로 이루어졌는지 확인하면 테스트는 끝이난다.
response.andExpect(status().isCreated());
'Spring' 카테고리의 다른 글
[Spring] MultipartFile Bean Validation (0) | 2024.01.26 |
---|---|
[Spring] MultipartFile 테스트 시 405 Error가 생기는 이유 (0) | 2024.01.18 |
[Spring] Spring REST Docs 상세 설정 (0) | 2024.01.02 |
[Spring] Filter에서 발생한 예외 핸들링하기 (1) | 2023.12.25 |
[Spring / S3] S3Mock을 사용하여 S3 테스트하기 (0) | 2023.12.24 |