💡 이 포스트에는 Section2의 Unit 11. 미니 해커톤의 과제를 하고 회고를 정리했다!
(누군가에게는 너무 쉬워 하품이 나올 수 있습니다.🥲)
과제에 대한 코드를 전부 공개할 순 없지만, 완성한 배포 페이지와 작업과정, 작업하며 느꼈던 점들을 정리했다.
지난 번 섹션1의 미니 해커톤에서 만들었던 My Agora States 과제를 Section2에서 배운 내용으로 바꾸는 시간이었다.
지난 번 사용했던 더미 데이터를 express를 사용해 서버로 만들고,
지난 번에는 HTML, CSS, JS를 사용해 만들었다면 이번에는 React를 사용해 페이지를 만들었다. (CSS는 그대로 사용했다)
지난 번에 만들었던 HTML 버전 배포 링크이다.
🔗 신나현 | My Agora States
(이번 것은 top버튼, pagination이 없고 다른 모양은 비슷하다.)
TODO
과제 페이지 구조: 지난 번과 같다.
다만 차이점이 있다면 이번에는 React를 사용했기에 컴포넌트 단위로 작업했다.
Pull request 내용
기존 과제 프로젝트를 fork한 후, pull request로 과제를 제출해야 했다.
이제 git으로 과제 정도는 쉽게 clone 한다!
이번에는 BMR을 하려면 Option과제를 할 수 밖에 없어서 그냥 다 해야했다. 나는 최대한 기본 과제에 적용하려고 했는데, 소그룹회고를 하다보니 다들 React에 적용한 것 같았다. 나도 결국은 React로 바꾸었는데... 사정이 있었다.
서버 만들기(express 사용)
기존 My Agora States에 데이터 연동
express를 사용하니 보다 쉽게 서버를 만들 수 있었다.
처음 사용할 때는 나름 해매기도하고 어려웠지만 막상 만들어보니 정말 간편해서 사용하기 편했다.
특히 하나의 기능을 전체 작업하는 것과 (app.use()
)
라우팅 기능( router.get('/url',router)
처럼 사용 )이 제일 편했다.
그리고 서버 만들기는 오래 걸리지 않았다.
기존에 HTML, CSS, JS로 만들었던 과제에 더미 데이터, 로컬 스토리지 데이터 설정을 걷어내고 서버의 데이터로 대체해야 했다.
그러기 위해서 fetch를 통해 서버의 데이터를 받아와야 했는데, 여기서 문제가 생겼다. 😫
되는 줄 알았는데 결국 해결 할 수 없었다. 정확히 말하면 방법이 아예 없지는 않지만 내 상황에서는 해결이 어려웠다. 이유는 알 수 있었다.
왜냐하면 비동기로 데이터를 받아오기 때문에 작업이 순서대로 진행되지 않기 때문이다.
즉, 전역변수를 선언하고, 이 변수에 데이터를 할당하는 작업이 순서대로 진행되지 않는다.
만약 해결하려면 동기적으로 데이터를 받아와 할당해야 한다.
여러 방법이 있으나 그 중에서도 fetch를 사용한다면 동기적으로 실행되어야 할 작업은 then메서드 안에 작성해야 한다.
그러나 내 기존 코드는 처음에 모든 더미 데이터를 변수에 할당하여 그 변수를 활용하고 있었고 그러려면 기존 코드를 좀 많이 수정해야 했다.
시간은 점점 흐르고, 이 문제를 해결하기 위해 해결책을 생각해보았다.
해결방법은
- 기존의 작업들을 then 메서드 안에서 호출 -> 코드 전면 수정 필요
- 리액트로 전환 후 Effect Hook 사용
이렇게 2가지 방법이 있었는데 1,2번으로 하려고 폭풍검색으로 시간을 다 날리고 말았다.😭 해보니까 오히려 리액트로 바꿔서 하는 게 빠를 것 같아 결국 3번의 방법을 선택하게 되었다.
그렇게 최소 요구조건을 만족하기 위해 React로 기존 페이지를 변경했는데,
저번에 도전과제로 만들었던 pagination은 구현할 시간이 없어 포기하고 작업했다. 소그룹 회고 전까지는 더 시간이 모자라서 컴포넌트만 만들어 조립하고 과제를 제출했다.
그렇게 미완성인 상태에서 발표도 하고 동기에게 피드백도 받았는데, 고맙고도 아쉽지만 그렇게 큰 도움은 되질 못했다. 동기가 열심히 해주었지만 오히려 문제의 원인만 확실해졌다. (그래도 블로깅에는 도움이 되었어요ㅠㅠ)
정규 수업이 끝나고 대충 완성했던 React를 완성하고, 서버 데이터를 연결시켰다. 기존 HTML 작업과 다르게 React는 Effect Hook을 사용하면 데이터를 제대로 받아올 수 있다.
const [data, setData]=useState([]);
useEffect(()=>{
getRowData()
.then(result=>{
setData(result);
})
}, [data]);//data값이 바뀔 때마다 실행
//만약 [data]부분을 생략하면 컴포넌트가 새로 랜더링될 때마다 실행된다.
결국 기존 과제의 pagination은 구현하지 못했지만, 과제를 해결할 수 있었다.
아무래도 기존 HTML 과제에서 전역 변수에 fetch 데이터 할당하는 방법을 찾지 못했고, 그나마 해결하는 방법마저 제대로 구현하지 못한 것이 제일 아쉽다. 이번 과제에서 제일 아쉽고 시간도 오래 걸려서 기분이 좋지 않아...
나중에 시간이 난다면 다시 코드를 리팩토링 해보고 싶은데 점점 시간이 부족하다.
-> 221019 내용 추가 :
결국 위에서 분석한 문제점이 맞았고, 후에 시간을 두고 1번의 방법(fetch로 데이터를 받아오고, then 메서드에 코드 작성)대로 HTML 버전을 수정했다. then메서드 안에 기존 데이터를 사용하는 코드를 모두 넣어주었다.
그러자 HTML모드도 정상적으로 돌아갔다.
HTML, CSS, JS는 레퍼런스가 없어도 페이지를 바로바로 만들 수 있지만, React는 하다보니 그렇지 않아 복습의 필요성을 세게 느꼈다. 머리로 이해했지만 아직 내 손이 덜 이해하고 있다.
지난 번에는 손쉽게 advanced 과제를 했는데 이번에는 그렇지 못했다. 지금까지의 방법보다 좀 더 공부하고 열심히 해야한다. 안그래도 없는 쉬는 시간 더 줄여야 하나???