[Project] 트러블슈팅(IllegalStateException), Rest API(Delete) - 경력사항

이슬기·2024년 2월 21일
0

project

목록 보기
36/42

경력사항 중 하나를 삭제하려고 할 때

java.lang.IllegalStateException: Optional int parameter 'exp_no' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

에러가 발생했다.

method를 delete로 처리하려면 int 값 그 자체를 넘기면 에러가 발생하며 삭제 처리가 되지 않는다.

문제상황1

deleteDB에 expNO 값을 바로 보내주었다. 콘솔에 해당 경력사항의 exp_no의 숫자가 분명히 다 넘어갔는데도 불구하고 백에서 IllegalStateException이 계속 발생하였다.

  const handleDeleteRow = async (index) => {
    const expNo = filteredExList[index].EXP_NO;
    if (expNo) {
      try {
        // 유효한 EXP_NO 값을 가진 경우에만 삭제 요청을 보냄
        await empExpDeleteDB(expNO);
        // 삭제 후 목록 새로고침
        getExpList();
      } catch (error) {
        console.error("경력 삭제 에러 :", error);
      }
    } else {
      console.error("경력 삭제 에러: EXP_NO가 유효하지 않거나 존재하지 않습니다.");
    }

    const updatedList = [...filteredExList];
    updatedList.splice(index, 1);
    setFilteredExList(updatedList);
    setShowSaveButtons(showSaveButtons.filter((value, idx) => idx !== index)); // 삭제된 행에 대한 저장 버튼 제거
  };

Api에서 expNO를 그대로 보냈다. 콘솔로 찍어봤을 때도 exp_no가 다 제대로 넘어갔으나 에러가 발생하였다.

export const empExpDeleteDB = (expNO) => {
    return new Promise((resolve, reject) => {
        try {
            const response = axios({
                method: "delete",
                url: process.env.REACT_APP_SPRING_IP + "emp/experienceDelete",
                params: expNO,
            });
            resolve(response);
            console.log(response);

        } catch (error) {
            reject(error); 
        }
    });
};

문제상황2

여러 해결 방법을 찾던 중, 해결방법과 유사하게 {키:값}으로 값을 넘겼다.
그러나 이때는 DELETE http://localhost:8000/emp/experienceDelete 500 (Internal Server Error) 500번 에러가 떴었다.
500번 에러가 떴던 이유는 data로 값을 보냈기 때문이다.

export const empExpDeleteDB = (expNo) => {
    return new Promise((resolve, reject) => {
        try {
            const response = axios({
                method: "delete",
                url: process.env.REACT_APP_SPRING_IP + "emp/experienceDelete",
                data: {exp_no: expNo},
            });
            resolve(response);
            console.log(response);

        } catch (error) {
            reject(error); 
        }
    });
};

해결방법

deleteDB에 값을 넘길 때, expNO를 그대로 넘기는 것이 아니라 {키:값}으로 보내줘야 한다.

  const handleDeleteRow = async (index) => {
    const expNo = filteredExList[index].EXP_NO;
    if (expNo) {
      try {
        // 유효한 EXP_NO 값을 가진 경우에만 삭제 요청을 보냄
        await empExpDeleteDB({exp_no: expNo});
        // 삭제 후 목록 새로고침
        getExpList();
      } catch (error) {
        console.error("경력 삭제 에러 :", error);
      }
    } else {
      console.error("경력 삭제 에러: EXP_NO가 유효하지 않거나 존재하지 않습니다.");
    }

    const updatedList = [...filteredExList];
    updatedList.splice(index, 1);
    setFilteredExList(updatedList);
    setShowSaveButtons(showSaveButtons.filter((value, idx) => idx !== index)); // 삭제된 행에 대한 저장 버튼 제거
  };

그리고 Api에서는 params로 값을 넘겨주어야 한다.

export const empExpDeleteDB = (params) => {
    return new Promise((resolve, reject) => {
        try {
            const response = axios({
                method: "delete",
                url: process.env.REACT_APP_SPRING_IP + "emp/experienceDelete",
                params: params,
            });
            resolve(response);
            console.log(response);

        } catch (error) {
            reject(error); 
        }
    });
};

중요한 점!!!!!

delete는 {키:값}형태로 백으로 값을 보낼 것!!!!!!!!
값을 보낼 때는 data가 아닌 params!!!!!!!!!!!!

0개의 댓글

관련 채용 정보