=> 2주차에서 로그인 상태를 유지하기 위해 서버 요청시 accessToken을 헤더에 담아 authorization을 함으로써, 유저의 로그인 상태를 유지시켜주었다. 로그인을 유지해주기 위해 문제는 없었지만, state를 useState로 관리하다보니, 새로고침을 하는 경우 로그인 상태가 사라져, 새로고침할 때마다 다시 서버 요청을 보내 로그인이 유효한지 확인이 필요했다.
이럴 경우 반복적인 서버 요청이 발생하는 문제점이 있었다.
이를 해결하기위해 4주차에는 redux-persist를 통해 로그인 상태를 관리하기로 했다.
islogin 상태를 localStorage에 저장해주어 새로고침을 하더라도 상태가 유지되도록 하고, 로그아웃되는 경우에만 islogin=false로 주어 로그인 상태를 변화시켜주었다.
처음 map 페이지가 렌더링되었을 때, 지도가 생성되는 로직을 구현하였다.
let map = new kakao.maps.Map(container, options);
하지만 이때 발생하는 문제가 있었다.
useEffect 안에서 map을 선언해 주었기 때문에, 해당 map을 useEffect 밖에서는 사용하지 못한다는 것이다. var를 사용하면 전역에서 사용할 수 있겠지만, 코드의 통일성이 사라지고, 변수가 중첩될 수 있는 문제점 등을 이유로 팀 코드 규칙에서 var를 사용하지 말자고 정하였었다.
이를 해결하기 위해 다양한 방법을 고민했었지만, 결국 해당 컴포넌트의 최상단에 let = map;을 선언하는 방식으로 접근을 하였다.
이렇게 선언하니 원하는 기능을 구현할 수 있었지만, 컴포넌트 밖에 변수를 선언해서 만족스러운 코드는 아니다.
아래의 로직에서 보면 data 값이 들어오면 filterInfo 값이 변경되어 동일한 조건이라도 반복해서 서버 요청이 들어간다.
또한 느린 네트워크 상황에서 필터링 검색을 여러번 눌러 불필요한 서버 요청이 발생하고 서버 부담으로 이어지는 문제가 발생했다.
const [filterInfo, setFilterInfo] = useState({});
const filterSubmit = (data) => {
setFilterInfo({ ...data });
};
이를 방지하기 위해 조건이 하나라도 달라졌는지 판별하고, 달라지지 않았다면 서버 요청을 보내지 않도록 하였다.
MapPage.js
const [filterInfo, setFilterInfo] = useState({gender:'', startDate:'', endDate:'',});
const filterSubmit = (...args) => {
// 하나라도 필터링 조건이 바뀌어야 서버 GET 요청
let [gen, start, end] = args;
let { gender, startDate, endDate } = filterInfo;
if (gen !== gender || start !== startDate || end !== endDate) {
setFilterInfo({ gender: gen, startDate: start, endDate: end });
}
};
유저가 요청이 제대로 들어갔다고 인식할 수 있도록 시각적인 로딩화면을 삽입할 필요가 있다.
=> 스핀 로딩을 넣어주어도 좋을 것 같다.
생각보다 엉망이다...
다시 구조를 짜야할 것 같다.