Dev_logplaist

React 개발 트러블슈팅 정리 – Plaist #2

2025-01-03
ProjectReactTrouble

1. 초기화되지 않는 문제 발생

이전 유저 데이터가 남아있는 문제 재현 화면

💬 시도해본 것

  • 콘솔 창에 불러오는 Data를 찍어봤는데, 정상적으로 실행되면 [] 이 나와야 하는데, 직전에 로그아웃한 유저의 정보가 그대로 불러와지는 문제가 발생한 것 같다. 원인이 무엇일까?

  • 로그인한 유저의 userId 값으로 가져오는 userInfo에서 userData 는 제대로 가져오는 것을 확인했다. 하지만 getMyCourseObj는 이전 로그인 계정의 데이터를 반환하고 있다.

  • 디버깅을 해본 결과, userData는 정상적으로 받아오지만, fetchMyCourses에서 userId 값이 최신 상태로 갱신되기 전에 getMyCourseObj가 호출되어 이전 로그인 계정의 데이터가 요청되는 문제가 발생한 것 같다.

ts
1
fetchMyCourses: async () => {
  const { userId } = useUserStore.getState();
 
  if (!userId) {
    console.warn("User ID is no set");
    return;
  }
 
  try {
    const data = await getMyCourseObj(userId);
    console.log("data:", data);
 
    if (!data || !Array.isArray(data)) {
      console.warn("Invalid data format:", data);
      return;
    }
 
    // ...
  } catch (error) {
    console.error("fetchMyCourses error:", error);
  }
},

💡 문제 분석

  • 기존에는 userId 가 컴포넌트에서 관리되고, 그 값을 fetchMyCourses 함수로 전달하는 방식이었다.
  • 이렇게 별도로 관리되고 있다면, 응집도가 떨어진다고 한다. 그러면 상태 변경이 즉시 반영이 되지 않을 수 있기 때문에 같은 로직에서 관리하는 것이 좋다고 한다.

💬 시도한 해결 과정

fetchMyCourses 함수 내부에서 userId 값을 직접 받아올 수 있도록 수정하였다. 이전에는 userId가 컴포넌트에서 관리되어 fetchMyCourses로 전달되는 구조였기 때문에, 상태가 최신화되기 전에 getMyCourseObj 요청이 발생하면서 이전 로그인 계정의 데이터가 요청되는 문제가 생긴 것 같다.


2. 회원가입 후 첫 유저 정보 변경 실패

💬 디버깅 결과

  • 유저 정보를 업데이트하는 API 호출은 정상적으로 동작하여 서버에는 데이터가 저장되고 있다.
  • fetchUserInfo() 호출 시 이전 데이터가 반환하여 상태 갱신이 실패한다.
  • 새로 고침 후 2번째 시도부터는 제대로 반영된다.

3. JWT 디코딩 후 ID 값 추출

JWT 디코딩 에러 화면

💬 시도해본 것

일단 디코딩 한 JWT 값이 나오긴 해서 그 안의 데이터 구조를 보았다.

  • 이렇게 Decoded JWT 안에 user 가 있고 그 안에 _id 값이 있었다.
  • 그래서 혹시나 하고 코드를 다시 한 번 쭉 살펴보면서 제대로 가져오고 있나 확인했다.
  • 역시나 접근 방식에 오류가 있었다.

✅ 해결 방법

return decodedToken._id; 에서 return decodedToken.user._id; 으로 바꿔줬더니 CORS 오류도 사라지고 정상적으로 값을 불러올 수 있었다.

🔥 느낀점

  • 이 과정에서 정말 크게 깨달았다. 뭐든 실패하면 일단 데이터 구조를 살펴보고 console.log 로 그 데이터를 찍어보면서 잘 가져와지는 지 체크하고,
  • 어디서 문제가 발생했는지 살펴보는 게 문제를 풀어가는 데 도움이 되는 것 같다.

4. 새로고침 후 초기화

💬 시도해본 것

  • 디버깅 코드를 넣어보면서, 서버에 저장이 되는지 먼저 확인을 했다.
  • 확인 결과, 서버에는 데이터가 정상적으로 업데이트 되었지만, UI에는 동기화가 되지 않는 것을 발견했다.

💡 문제 분석

현재 로직에서는 성공적으로 업데이트는 되지만, 이후 서버에서 데이터를 받아와 UI에 동기화시키는 로직이 없어서 문제가 발생한 것 같다.

✅ 해결 방법

getUserInfo() 로 서버에서 유저 정보를 가져와 다시 refreshData 에 저장해서 업데이트 해주는 로직을 추가하여 반영해주었다.