[TIL-20260213] Swagger์—์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ

2026. 2. 14. 14:59ยทToday I Learned ๐Ÿง

 

๐Ÿ€ 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

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Today I Learned ๐Ÿง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TIL-20260215] iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ Google ์†Œ์…œ ๋กœ๊ทธ์ธ ์ด์Šˆ ํ•ด๊ฒฐ  (0) 2026.02.15
[TIL-20260212] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ณต์Šต - ํƒ‘(Tower) ๋ฌธ์ œ  (0) 2026.02.14
[TIL-20260211] ์ฝ”ํ…Œ - ๋ณ‘ํ•ฉ ์ •๋ ฌ , Open API 3.0 Swagger ๋ฌธ์„œ ์ž‘์„ฑ  (0) 2026.02.12
[TIL-20260208] Instant๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ  (0) 2026.02.08
[TIL-20260206] Duration์œผ๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ  (0) 2026.02.07
'Today I Learned ๐Ÿง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [TIL-20260215] iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ Google ์†Œ์…œ ๋กœ๊ทธ์ธ ์ด์Šˆ ํ•ด๊ฒฐ
  • [TIL-20260212] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ณต์Šต - ํƒ‘(Tower) ๋ฌธ์ œ
  • [TIL-20260211] ์ฝ”ํ…Œ - ๋ณ‘ํ•ฉ ์ •๋ ฌ , Open API 3.0 Swagger ๋ฌธ์„œ ์ž‘์„ฑ
  • [TIL-20260208] Instant๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์ž„๋ฐ• ์—ฌ๋ถ€ ์ฒดํฌ
ํ•ด๋‹ˆ ๐ŸŒฑ
ํ•ด๋‹ˆ ๐ŸŒฑ
๊ธฐ๋ก์ด ์ž์‚ฐ์ด๋‹ค ( •ฬ€แด—•ฬ )ูˆโœ๏ธ
  • ํ•ด๋‹ˆ ๐ŸŒฑ
    haeni.dev
    ํ•ด๋‹ˆ ๐ŸŒฑ
  • ๋งํฌ

    • github
    • velog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (25) N
      • ์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ (4)
      • Today I Learned ๐Ÿง (19) N
      • ๋ถ„๋…ธ์˜ ํƒ€์ดํ•‘ ๋กœ๊ทธ ๐Ÿ”ฅ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ์ฝ”ํ…Œ
    AWS
    springboot
    IT
    ๊ฐœ๋ฐœ์ž
    til
    ๋ฐฑ์—”๋“œ
    ๊ฐœ๋ฐœ
    ci/cd
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
ํ•ด๋‹ˆ ๐ŸŒฑ
[TIL-20260213] Swagger์—์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”