이번 포스팅에서는 코틀린에서 Json(이미지 설명) 파일과 함께 이미지 파일을 한 번에 여러 개 업로드하는 방법에 대해서 작성하려고 한다.
다중 이미지 업로드
Controller
여러 이미지를 대한 입력받기 위해 @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)를 추가해 준다. 파일 입력은 MultipartFile 클래스로 받을 수 있으므로 여러 파일을 입력받기 위해 List 형태로 지정해 준다.
Swagger
스웨거에는 다음과 같은 형태로 나온다 Add string item 버튼을 눌러서 입력할 file 개수를 정할 수 있다.
Service
이미지를 저장하기 위해 file system을 이용했다. 다른 방법으로는 AWS S3 등을 사용해 외부에 파일을 저장하는 방법이 있는데, 이번 프로젝트에서는 온프로미스 방식으로 서버를 운영할 계획이라 애플리케이션을 실행하는 인스턴스에 파일을 저장하기로 했다.
UUID에서 랜덤 UUID를 생성해 file 이름에 붙어줬다. 더 확실한 방법으로는 이전에 생성된 UUID를 데이터베이스에 저장하고 새로운 이미지를 저장할 때 생성된 UUID로 데이터베이스에 중복이 있는지 확인하는 방법이 있다.
uploadDir은 입력받은 이미지를 저장하는 디렉터리 위치이다. 노출되지 않도록 yml 파일에서 환경변수로 빼주었다.
아래는 설정하는 방법이다. 인텔리제이 환경에서 환경변수를 설정하는 방법이 나와있다.
2024.09.19 - [백엔드/Java + Spring] - [백엔드] Blog - 실행 오류 정리 (application.yml, SDK, test)
원래는 file을 저장한 위치인 filePath도 데이터베이스에 저장해야 하는데 테스트 코드라 인스턴스의 file system에만 저장하는 로직을 구현했다.
Test
테스트를 해서 다음과 같은 결과를 얻었고 저장한 이미지가 올바르게 저장된 것을 확인할 수 있었다.
Json + 다중 이미지 업로드
Controller, Service
Controller
아까와 비슷한 방식으로 입력을 받지만 NewsArticle에 대한 정보과 그 내부에 각 이미지에 대한 캡션(설명) 리스트를 입력받도록 구현했다.
Service
imageList와 request.imageList(캡션) 리스트를 zip으로 묶어 각 이미지를 저장 후 Image 객체를 생성하고 NewsArticle과 연관관계를 설정해 주었다.
415 Error
잘 작동할 줄 알았으나 받은 응답은 415 Unsupported Media Type Error
스웨거의 Curl 부분을 보면 -F 뒤에 Json 형식의 문자열과 이미지 파일이 있는 것을 확인할 수 있다.
컨트롤러에서 MediaType.MULTIPART_FORM_DATA_VALUE 방식으로 입력을 받았기에 @RequestPart에서 해당하는 부분을 각각 요청으로 보낸 것을 확인할 수 있다.
처음에는 코드 상에 문제가 있는 줄 알았지만 아무리 생각해도 4xx 에러길래 메서드 요청하는 부분을 열심히 찾아봤다.
위 요청에는 수상한 부분이 있는데, 컨트롤러에서는 모든 입력을 @RequestPart으로 처리했지만 -F request 부분과 -F image 부분의 뒷부분 형식이 다르다는 점이다.
문제점
JSON 형식의 파일과 문자열 입력이 다르다.
이 이유 때문에 415 에러를 계속 받았던 것이었다.
{
"title": "string",
"content": "string",
"aiSummary": "string"
}
JSON 형식의 문자열은 다음과 같고 이것을 그대로 입력하는 것이 아닌,
image 입력과 같은 형태인 -F 'request=@/path/to/request.json' 형식으로 입력을 했어야 됐던 것이다
이 경우 @를 이용해 파일 형식으로 입력을 한다.
해결
Swagger로는 해결 방법을 찾지 못해서 Postman을 사용해서 요청을 보냈다.
입력에서 Body 부분을 from-data 형식으로 지정한 후 request와 image 부분을 입력한다. 이때 request 부분에는 application/json을 명시해 주어야 올바르게 요청을 전달할 수 있다. Postman에서 시도했던 테스트는 성공적으로 작동했다.
'백엔드 > Kotlin + Spring' 카테고리의 다른 글
[Kotlin Spring] Relogging - Spring AI 활용 구현 정리 (OpenAI, ChatGPT API 사용하기) (2) | 2024.11.07 |
---|