내가 서버로 post를 날려야했던건 이미지 파일과 json형식의 데이터였는데
그 중 json형식 데이터를 아래처럼 보내고 있었다.
formData.append("postDto", JSON.stringify(postDto));
그러나 계속 발생했던 500 에러!!!
json형식으로 만들어 보내는 걸 처음하다보니 어느 부분이 문제인지(받는 쪽 설정 문제인지 내쪽 문제인지조차 헷갈렸다)
하지만 백엔드분께서 금방 시원하게도 해결을 해주셨다 ㅎㅎ (최고>_<)!!
정상적으로 전송이 안되었던 이유는
바로 Blob으로 감싸고 명시적으로 json타입임을 알려주지 않았던 것!!!
[아래가 blob을 이용해 감싼 코드]
const blob = new Blob([JSON.stringify(postDto)], { // type에 JSON 타입 지정 type: 'application/json', });
나는 서버에 formdata로 데이터를 전송할때 JSON.stringify(postDto) 로만 해도 괜찮다고 생각한 이유가
JSON.stringify를 하면 json형식을 텍스트 타입으로 전환한 거라고 생각했는데,
blob으로 감싸줘야 정상적으로 post전송이 되었던 이유가 뭘까?
[기존 코드]
formData.append("postDto", JSON.stringify(postDto));
기존 코드에서는 JSON.stringify(postDto)를 직접 FormData에 추가하고 있었다.
이렇게 하면 postDto 객체가 JSON 문자열로 변환되어 FormData에 포함된다.
그러나 이렇게 FormData에 추가된 JSON 문자열은 서버에서 JSON 형식으로 해석되지 않고 일반 텍스트로 처리될 수 있다고 한다.
이는 서버에서 예상치 못한 데이터 처리 오류를 발생시킬 수 있다.
=> 따라서 서버가 JSON 형식의 데이터를 예상하고 있다면, JSON 형식의 데이터를 명시적으로 전달해야 했던 것
[수정 코드]
const blob = new Blob([JSON.stringify(postDto)], { type: 'application/json' });
formData.append("postDto", blob);
수정된 코드에선 JSON.stringify(postDto)를 Blob으로 감싸고 있다.
Blob 은 텍스트 데이터나 바이너리 데이터를 다루는 객체인데, Blob을 사용하여 JSON 문자열을 Blob 객체로 변환했다.
그리고 type을 'application/json'으로 지정하여 이 Blob이 JSON 데이터임을 명시하고 있다.
FormData에는 일반적으로 파일 데이터와 텍스트 데이터만 추가할 수 있는데,
JSON 형식의 데이터를 직접 추가하려면
Blob을 사용하여 텍스트 데이터를 Blob 객체로 변환한 후, FormData에 추가해야 했던 것 !!!
(이렇게 하면 FormData에 포함된 JSON 데이터는 서버에서 JSON 형식으로 올바르게 해석될 수 있다)
이미지 전송을 할때 blob객체를 사용해서 전송한다는 것은 들었었는데 이렇게 formData에 json객체와 이미지 파일을 함께 보낼때 blob객체를 사용해야 한다는 것을 직접 깨닳을(?) 수 잇어서 정말 좋은 경험이었당
'📙 자바스크립트 공부' 카테고리의 다른 글
파일선택을 클릭하면 파일창이 2번 실행됐던 이유? / 이벤트 버블링 (0) | 2023.07.07 |
---|---|
문득 궁금해진 Promise와 콜백지옥(Promise 객체 안쓸때)의 차이 (0) | 2023.04.17 |
&& 연산자로 undefined/null 걸러내기 (타입스크립트에서 응용) (0) | 2023.01.18 |
[js] 프로토타입이란? / 프로토타입 체인 (0) | 2023.01.15 |
[js] 클래스 개념 이해하기 (1) | 2023.01.15 |
댓글