일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- axios
- 리액트코드정렬
- EC2
- next #middleware
- elasticIP
- Node
- express
- 프리티어
- s3확장자
- 부족한 금액 계산하기
- max_allowed_packet
- utf8mb4
- 커밋 한번에
- interactive_timeout
- 자동완성방지
- AWS
- 제일 작은 수 제거하기
- vscode
- react
- 코드정렬
- MySQL
- dotenv
- reacts3
- 프로그래머스
- 코딩테스트
- 자연수 뒤집어 배열로 만들기
- useReducer
- 리액트
- .env
- prettier
- Today
- Total
Sungtt
이벤트 배열 로직 수정 - 전 본문
개요
처음 세모이를 개발할 때 짰던 로직이 문제가 있는거같다.
로직은 아래와 같다
1. DB에 들어있는 배열을 리턴하는 함수 (종료된 이벤트가 들어있을 수도 있는 배열)
2. 웹크롤링한 배열을 리턴하는 함수 (새로운 이벤트가 들어있을 수도 있는 배열)
3. 두 함수의 배열을 가져온다
4. 각 배열의 타이틀(이벤트명)을 새로운 배열에 담아낸다.
5. 다시 한번 각 타이틀명이 들어있는 배열을 비교하여 new배열엔 없는 db배열을 반환
const db_Title = ['첫째', '둘째', '셋째', '넷째', '다섯째', 'haha'];
const new_Title = ['첫째', '둘째', '셋째', '넷째', '여섯째'];
const pareTitle = db_Title.filter((i) => !new_Title.includes(i));
console.log(pareTitle); //[ '다섯째', 'haha' ]
6. 반환된 배열의 길이가 0일 경우 종료된 이벤트가 없음으로 간주하여, 그대로 setState하여 렌더링
7. 반환된 배열의 길이가 1 이상일 경우 종료된 이벤트가 있는걸로 간주하여, 다음 로직을 실행하여
종료된 이벤트는 삭제하고, 새로운 이벤트는 들어있는 recent배열 생성
const tableDataTitle = ['첫째', '둘째', '셋째', '넷째', '다섯째', 'haha'];
const newData = ['첫째', '둘째', '셋째', '넷째', '여섯째'];
const compareNewData = newData.filter((i) => {
const title = i;
return !tableDataTitle.includes(title);
});
console.log(compareNewData); // [ '여섯째' ]
8. recent배열을 db에 전송하여 저장한다.
9. 7번과 반대로 종료된 이벤트들이 들어있는 배열을 생성한다.
const tableDataTitle = ['첫째', '둘째', '셋째', '넷째', '다섯째', 'haha'];
const newData = ['첫째', '둘째', '셋째', '넷째', '여섯째'];
const delData = tableDataTitle.filter((i) => {
const title = i;
return !newData.includes(title);
});
console.log(delData); // [ '다섯째', 'haha' ]
10. 종료된 이벤트배열을 db에 전송하여 삭제한다.
11. db의 배열을 다시 받아와서 최신배열을 렌더링해준다.
개발간에 느꼈던 문제점은 아래와 같다.
1. 페이지 첫 렌더링 시에는 꼭 새로고침을 해줘야만 이벤트가 나온다.
2. 매월 진행되는 이벤트는 날짜만 바뀌기때문에 타이틀명만 비교해서는 날짜 최신값 유지가 안되는 점
각 문제를 해결해보자
1번문제의 특이한 점은 첫 렌더링 시에는 올리브영 데이터를 크롤링 할 때
CORS정책으로 인한 오류가 뜨기때문에 무한로딩에 걸리지만
새로고침시에는 CORS오류없이 api통신을 주고받아 렌더링이 된다는 점이다...
CORS문제는 올리브영 서버에서 내 서버를 허용해주지않는 이상 뜨는게 당연하지만,
왜 새로고침을 하고나면 통신이 되는지 궁금했다.
우선 CORS위반 시 나오는 네트워크 헤더를 보자
이 후 새로고침 시 나오는 네트워크 헤더
응답 헤더의 원격 주소 유무의 차이가 있다.
원격 주소( remote address)는 클라이언트가 요청하는쪽의 주소를 표시해주는것인데
무한 로딩의 원인은 내가 요청하는곳에 주소가 누락되어있으니 데이터 또 한 받아오지 못한다고 본다.
이 상황은 너무 랜덤적이어서 문제에서 배제하였다
임시해결책
useEffect로 데이터를 불러올 때 try catch문으로 감싸주어
CORS ERROR가 났을 때 catch하여 화면을 새로고침해주는것으로 해결하였다.
홈페이지가 리플로우 된다는것은 걱정이다.
'프로젝트 > 개인 프로젝트 [세모이]' 카테고리의 다른 글
removeCommnet API가 계속 pending되던 이유. (0) | 2022.05.04 |
---|---|
viewBoard 리렌더링 최적화해주기 (0) | 2022.05.03 |
게시판 DB설계 (0) | 2022.04.25 |
220425 (0) | 2022.04.25 |
220422 (0) | 2022.04.22 |