
๐ To Do List
โ๏ธ ์ฌ์ด๋ ํ๋ก์ ํธ - aceess token ์ ํจ์ฑ ์ฒดํฌ api, ํ ํฐ ์ฌ๋ฐ๊ธ api, ์ ์ ์ ๋ณด ์กฐํ/์์ api
๐ฉ๐ป๐ป Today I Learned ...
Swagger์์ MultipartFile๊ณผ DTO ํจ๊ป ๋ฐ๊ธฐ


์ ์ ํ๋กํ ์์ API ๊ฐ๋ฐํ๋ฉด์ ์์ฒญ dto์ ํ๋กํ ์ด๋ฏธ์ง ํ์ผ์ `MultipartFile`๋ก ๋ฐ๊ฒ ํด๋๋๋ฐ,
Swagger UI์์๋ `String` ํํ๋ก ๋ฐ๋๋ก ๋ณด์ฌ์ง๊ณ ์์๋ค.
Swagger๋ ๋ณ๋ ์ค์ ์ด ์์ผ๋ฉด Content Type์ ๊ธฐ๋ณธ๊ฐ์ธ `application/json`์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ์ผ ์ ๋ก๋๋ฅผ ํฌํจํ ์์ฒญ ๊ตฌ์กฐ๋ฅผ ์ ๋๋ก ์ธ์ํ์ง ๋ชป ํ๋ ๋ฌธ์ ์๋ค.
Controller์์ Content type ๋ช ์ํ๊ธฐ

`@PutMapping`์ `consumes` ์์ฑ์ Content Type์ ๋ช ์ํด์คฌ๋ค.

์ด๋ ๊ฒ ํ๋ฉด Swagger๊ฐ ํด๋น API์ Content type์ `multipart/form-data`๋ก ์ธ์ํ๊ณ , DTO์ ๊ฐ ํ๋๋ฅผ ๊ฐ๋ณ ํผ ๋ฐ์ดํฐ๋ก ํ์ํด์ค๋ค.
HttpMediaTypeNotSupportedException ํด๊ฒฐํ๊ธฐ

Swagger UI์ ๋์ ๋ฐฉ์
- Swagger UI๋ `multipart/form-data` ์์ฒญ์ ๋ณด๋ผ ๋, ๊ฐ `part`์ ๋ํด ๊ฐ๋ณ์ ์ผ๋ก Content-Type์ ์ง์ ํ ์ ์๋ค.
- ํ์ผ์ด ์๋ ์ผ๋ฐ ํ๋๋ฅผ ๋ณด๋ผ ๋ ์๋์ผ๋ก `application/json`์ผ๋ก ์ ์กํ๋ค.
@RequestBody์์ @ModelAttribute์ผ๋ก ๋ณ๊ฒฝ
- `@RequestBody`๋ body ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ณํํ๋๋ฐ, `multipart/form-data`๋ ์ฌ๋ฌ part์ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์ Spring์ด multipart/form-data๋ฅผ JSON์ฒ๋ผ ํ์ฑํ ์ ์๋ค. โก๏ธ `HttpMediaTypeNotSupportedException: Content-Type 'multipart/form-data' is not supported` ๋ฐ์.
- `@ModelAttribute`๋ ๊ฐ part๋ฅผ ์ฝ์ด์ ํ๋๋ณ๋ก ํ๋์ฉ ๋งคํํด์ค๋ค.

๋ค์ API ์คํํด๋ณธ ๊ฒฐ๊ณผ, 200 ์๋ต์ cloudinary ์๋ฒ์ ์ด๋ฏธ์ง ์ ๋ก๋๋ ์ฑ๊ณตํ๋ค. โ๐ปโจ
์ฐธ๊ณ >
Swagger์์ MultipartFile๊ณผ DTO ํ ๋ฒ์ ๋ฐ๋ @RequestPart ์์ฒญ์ ์คํํ ์ ์๋๋ก ๋ง๋ค๊ธฐ
MultipartFile์ DTO๋ฅผ ํ ๋ฒ์ ๋ฐ์ ์ ์๋ ์์ฒญ์ ๋ง๋ค๋, ๋ค๋ฅธ ์ฌํ ์์ฒญ๋ค์ฒ๋ผ @PostMapping์ URL๋ง ์ค์ ํ๋ฉด Swagger์ Request body ์น์ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณด์ง๋ ์์๋ฟ๋๋ฌ API Testํ ๋ ํ์ผ(์ฌ์ง)์ ๋ฃ์
velog.io