프로젝트에 S3 이미지 업로드를 추가했는데,
Swagger에서 상품 등록을 실행할 경우 발생
원인
- 상품 등록 API의 경우, 이미지를 받기 위한 Multipart와 그 외의 정보를 등록하기 위한 Request Body 부분이 함께 필요함

- 여러가지 Content-Type이 혼재되는 경우, 요청을 전송할 때 명확하게 명시를 해줘야 함
- ex) productCreateRequestDto - application/json
- Swagger로 테스트중에 해당 이슈가 발생을 했는데, Swagger는 요청 타입을 Multipart로 변경할 경우, RequestDto(기존 Request Body) 부분에 대해 application/json을 따로 지정이 안됨
- Content-type을 알 수 없는 경우 기본적으로 octet-stream으로 타입을 지정하는데, 해당 타입에 대한 처리가 없어 “application/octet-stream is not supported”이라는 로그를 띄우면서 Exception이 발생
해결 1 - 요청 시 Content-type 지정
- Front 혹은 Postman으로 API 요청 시 RequestDto에 대해서 Content-type: application/json 을 명시해서 요청을 보냄

해결 2 - octet-stream Converter 작성
- 기본적으로 1번이 맞는 방식이긴 하지만, Swagger에서도 테스트를 하고 싶어서 우회할 방법을 고민했고, HttpMessageConverter를 사용해 Octet-Stream을 위한 Converter를 사용해 우회하기로 결정
- Octet-Stream에 대한 메시지 컨버터를 추가
@Component
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
return false;
}
@Override
protected boolean canWrite(MediaType mediaType) {
return false;
}
}
해결 3 - API 분리
- 이 부분은 다른 분들과 얘기를 나누다가 깨닫게 된 부분이었는데, 노션이나 벨로그 등에서 글을 작성하다가 이미지를 첨부하는 경우 글 등록과는 별개로 먼저 이미지가 등록이 되고 링크가 생성이 되는 것을 확인할 수 있음
- 그래서 기본적으로 Multipart인 API와 RequestBody를 받는 API를 분리하는게 좋지않나 하는 의견을 듣게 되었음.
- 그리고 추가적으로 이렇게 구현할 경우 RequestBody를 활용한 등록 전에 Multipart를 활용하는 부분에 대한 에러가 발생할 경우 먼저 알 수 있다는 장점이 생기게 됨
- 그래서 이후에 Multipart를 활용할 일이 생기게 되면 해당 기능을 분리해서 구현하는걸 우선적으로 고려할 예정