[REACT] ํ์ผ post application/octet-stream ์ค๋ฅ ํด๊ฒฐ: ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ์ ์ก ํ
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋, ํนํ ํ์ผ ์ ๋ก๋์ 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 ๋ฐ์ดํฐ์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๋งคํํ ์ ์์๋ค.