๐™ต๐š›๐š˜๐š—๐š๐šŽ๐š—๐š/๐š๐šŽ๐šŠ๐šŒ๐š

[REACT] ํŒŒ์ผ post application/octet-stream ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ํŒ

ํ•ด๋ฒ„๋‹ˆ 2024. 11. 23. 11:56
๋ฐ˜์‘ํ˜•

 

 

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ํŠนํžˆ ํŒŒ์ผ ์—…๋กœ๋“œ์™€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ฌ๋ฐ”๋ฅธ Content-Type ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค.

์ตœ๊ทผ ํ”„๋กœ์ ํŠธ์—์„œ FormData๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋˜ ์ค‘ HttpMediaTypeNotSupportedException: Content-Type 'application/octet-stream' is not supported ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์˜ Content-Type์ด ์„œ๋ฒ„์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹์ผ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ๋ฐ ์ „์†ก ๋ฐฉ์‹์„ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

 


 

 

๋ฌธ์ œ ๋ฐœ์ƒ

ํด๋ผ์ด์–ธํŠธ์—์„œ FormData๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ, ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์„ค์ •ํ•˜์ง€ ์•Š์•„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์„œ๋ฒ„์—์„œ๋Š” @RequestPart๋กœ MultipartFile๊ณผ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค ํ–ˆ์ง€๋งŒ, application/octet-stream๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํƒ€์ž…์œผ๋กœ ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งคํ•‘๋˜์ง€ ์•Š์•„ HttpMediaTypeNotSupportedException ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

 

 

์ดˆ๊ธฐ ์ฝ”๋“œ

๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด vo ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ FormData์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค:

formData.append('vo', JSON.stringify(vo));

 

์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ์ž์ฒด๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ application/octet-stream ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋กœ ์ธ์‹ํ•ด ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

 

 

 

 

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, vo ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ์ง๋ ฌํ™”ํ•œ ํ›„, Blob ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ Content-Type์„ ๋ช…์‹œ์ ์œผ๋กœ application/json์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. ์ดํ›„ ์ด๋ฅผ FormData์— ์ถ”๊ฐ€ํ–ˆ๋‹ค:

 
const json = JSON.stringify(vo); 
const blob = new Blob([json], { type: "application/json" }); 
formData.append("vo", blob);

 

 

์ฝ”๋“œ ๊ฒฐ๊ณผ

์ตœ์ข…์ ์œผ๋กœ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

const formData = new FormData(); 
const json = JSON.stringify(vo); 
const blob = new Blob([json], { type: "application/json" }); 
formData.append("vo", blob); 

appendFileIfNeeded('images', postData.image, postData.prevImageId, formData); 
appendFileIfNeeded('files', postData.file, postData.prevFileId, formData);

 

@RequestPart๋ฅผ ํ†ตํ•ด JSON ๋ฐ์ดํ„ฐ์™€ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•