심플 미세먼지 알리미
사이트 미리보기
배포용 링크
https://yohayo-fineduskalimi.netlify.app/
심플 미세먼지 알리미
yohayo-fineduskalimi.netlify.app
소스코드
https://github.com/YoHaiYo/react-finedust-app
GitHub - YoHaiYo/react-finedust-app
Contribute to YoHaiYo/react-finedust-app development by creating an account on GitHub.
github.com
사이트소개
미세먼지 API를 받아서 도시별로 미세먼지 정보를 알려주는 앱입니다.
작업 히스토리
23.07.03 :
해야할것 : BaseCard를 컴포넌트로 빼서 다양하게 카드를 꺼내 쓸수 있게 하기. V |
23.07.10 :
|
23.07.13 :
|
23.07.15 :
=> 그냥 패딩으로 조절했음. |
23.07.17 :
|
23.07.18 :
|
개발후기
@ 개발 도중 어려움. 극복과정 쓰기 : 기상악화 서버통신 문제, 배포시 운영계정 문제 등
개발하면서 기초를 철저히 하는것이 중요하다는걸 느꼈습니다. 그리고 코드가 아닌 API 통신서버가 문제된다던지, 모바일기기마다 다르게 UI가 보여서 특정기기에서는 깨져서 보일 수 있다던지하는 보이는것 외에도 신경쓸게 참 많다는걸 알게되었습니다.
파이널프로젝트 리뷰
@ 파이널 리뷰를 통해 얻은 피드백을 반영하는 과정을 글로 정리하기.
질문 답변
1. 앱 시작시 콘솔에 다음 에러가 뜨는데 이유가 뭔가요? 앱 기능에 영향을 주진 않는 것 같습니다. :Warning: Invalid DOM property `class`. Did you mean `className`? |
React에서는 class 대신 className을 사용해야 합니다. class 대신 className을 사용하는 유일한 이유는 class는 JavaScript에서 예약된 키워드이고 React는 JavaScript 확장인 JSX를 사용하기 때문에 class 속성 대신 className을 사용해야 합니다. 다만 넵 앱 기능에는 영향을 미치진 않습니다만 warning이 뜨는 것은 보통 앱 동작에는 영향을 주지 않지만 좋지 않은 코드 스타일로 작성하고 있다고 경고를 주는 것이라 고쳐주는 것이 좋습니다. https://stackoverflow.com/questions/46989454/class-vs-classname-in-react-16 |
2. 메뉴창이 옆에서 스스륵 튀어나오고 나머지 화면 어두워지게 하는 법을 구현하고 싶습니다. |
우선 해당되는 UI를 drawer라고 부르는데요. mui나 chakra-ui같은 곳에 github을 통해서 어떻게 구현했는지 살펴보시면 좋은 공부가 될 것 같습니다. 일반적으로 다른 레이어를 위에 렌더링 할 때는 보통 createPortal api를 사용해서 구현을 하는 편인데 해당 api도 공부해보세료 참고문서 https://mui.com/material-ui/react-drawer/ https://chakra-ui.com/docs/components/drawer/usage https://react.dev/reference/react-dom/createPortal= |
3. 왜 img폴더의 finedust-logo.png를 제외한 다른 이미지들은 첨부가 안되는지요? (다른 이미지는 계속 엑박으로 나옵니다.) |
어떤 에러인지랑 상황을 적어주시면 보다 파악이 용이할 것 같습니다. 아래 마크업을 추가로 작성해주었는데요 로고가 뜬 이유는 로고에 경로가 public 폴더에 img에 assets이 있어서 그렇습니다. src 폴더에 있는 이미지는 import를 통해서 경로를 지정해주어야 합니다. <span className='title'><img src="/img/finedust-logo.png" alt="title-logo"/></span> <span className='title'><img src="/img/finedust-logo-spare1.png" alt="title-logo"/></span> <span className='title'><img src={spare1} alt="title-logo"/></span> |
4. 즐겨찾기 기능을 구현할려고 ★버튼을 누르면 배열에 해당 객체데이터가 추가되고 다시 누르면 삭제되게 하였습니다. 다른 앱들도 이런 원리로 데이터를 저장하나요? 더 효율적인 방법이 있는지요 |
우선 보통 좋아요는 API로 서버에 요청을 보내서 서버상태를 가지고 처리하는 편인데요. 이 경우 학습을 위해서 클라이언트 상태에서만 처리를 했다고 보시면 될 것 같습니다. 지금 과제 같은 경우 전역으로 좋아요 상태를 관리하는 것이 좋을 것 같습니다. 페이지가 바뀌어도 필요한 정보니까요. 그래서 react-redux랑 redux-persist를 통해서 로컬스토리지에도 동기화를 시켜서 관리할 것 같습니다. https://redux.js.org/introduction/getting-started 배열로 저장해서 조회해서 삭제하는 방식도 있을테고, 객체로 저장해서 조회해서 삭제하는 방식도 있을 것 같네요. 각각의 어떤 장단점이 있을지 공부해보시면 좋을 것 같습니다. |
5. 앞으로의 학습 방향에 대한 조언 부탁드려요. |
우선 리액트 공식문서를 읽어보며 해당 API들을 잘 익히면서 컴포넌트 구조를 짜는 연습을 해보시면 좋을 것 같습니다. 공식문서랑 같이 리액트를 다루는 기술 책을 따라가면서 개념을 익혀보시면 좋을 것 같습니다. https://thebook.io/080203/ 그리고 간단한 버튼, mui에 있는 요소들을 하나씩 재사용성 있게 디자인 해보면서 짜보는 연습을 해보시면 좋을 것 같습니다. https://mui.com/material-ui/react-button/ -> 이를 스토리북 라이브러리로 문서화 하는 것도 추천드리고요 (즉, 내가 작업한 UI나 사이트들을 비쥬얼 리뷰할 수 있도록 하는것. 보여주기도 좋고 내가 복습하기도 좋을 거 같다.) 스토리북이란? https://storybook.js.org/docs/react/get-started/whats-a-story react, react-redux, recoil 등 상태관리 라이브러리를 사용해보면서 전역 상태 관리를 컨트롤 하는 부분을 연습해보시고 react-query, react-router등을 공부해서 보다 편리하게 어플리케이션을 만들어보며 공부하면 좋을 것 같습니다. |
코드리뷰
1. 우선 App.js 에 모든 코드가 있어서 가독성이 떨어집니다. 책임과 역할에 맞춰서 컴포넌트를 분리해주시면 좋을 것 같습니다.
2. getCardColor, getDustState, getEmojiState 모두 같은 pm10Value 로직에 따라서 움직이는데 한 번에 return 값을 묶어서 처리해주셔도 될 것 같네요.
3. 그리고 아래영상을 참고해서 if-else 함수를 switch cases나 객체 맵핑으로 리팩토링 해보시면 좋을 것 같습니다.
https://www.youtube.com/watch?v=p0YEviesgRM&t
4. 북마크 체인지에 함수안에 useEffect를 넣어서 사용하였는데 좋지 않은 패턴입니다. 사이드 이펙트는 따로 빠져서 컨트롤 해주시는게 좋을 것 같네요.
마크업 부분도 함수내에 있지 않고 로직과 분리되어 있어야 가독성이 좋을 것 같습니다.
5. 커스텀 훅으로 사이드 이펙트를 주는 부분을 분리해보시면 좋을 것 같습니다.
아래 참고 문서를 바탕으로 점진적으로 로딩이나 에러 상태 처리 그리고 async await 등을 활용해보시면 좋을 것 같습니다.
보통 screen 으로 페이지 컴포넌트 분리한 것 처럼 api fetch하는 함수를 따로 분리해서 관리하는 편입니다. (유지보수에 용이)
https://www.robinwieruch.de/react-hooks-fetch-data/
6. 볼필요한 주석은 코드상에서 제거해주는 습관들여주세요.
7. react-router 를 활용해서 라우팅 page 컴포넌트를 분리해서 구현해보세요.
https://reactrouter.com/en/main/start/tutorial
7.2 Outlet을 통해서 layout 컴포넌트를 만들고 template 컴포넌트를 만들어서 사용하는게 좋아보이네요.
https://reactrouter.com/en/main/components/outlet
7.3 notFound와 같이 에러가 났을때 페이지도 구성해보시면 좋을 것 같습니다.
8. Lazyloading과 코드스플리팅에 대해서도 공부해보세요
(로딩시간을 줄여주는 기술들)
https://reactrouter.com/en/main/route/lazy
https://react.dev/reference/react/lazy#suspense-for-code-splitting
9. Header, HeaderState, SidoDropDown등 컴포넌트 폴더에 파일을 따로 분리해서 가져오는 방식을 취해주세요.
10. GetApiData , GetApiDataFunction 의미를 알아보기 어려운 이름입니다. 그리고 두 함수의 차이가 뭘까요?
10.2 api 함수를 따로 분리해주시고, 상수나 공통으로 쓰일 부분을 또 변수로 따로 관리하셔서 중복을 줄여주세요.
10.3 axios라는 data-fetching 라이브러리도 공부해보시면 좋을 것 같네요.
11. react-redux를 사용하지 않았는데, 추후에 react-redux를 공부해서 적용해보세요.
12. 코드 중복을 줄이고, 재사용할 수 있게 짜려고 노력해주세요.
13. 노드모듈은 지우고 올려주세요. 받는 사람이 package.json을 보고 npm install을 통해서 관련 모듈을 설치할 수 있습니다.
(즉, 쓸데없이 용량큼.)
공공데이터 운영계정 신청
공공데이터를 사용해서 만든 사이트를 배포하려면 운영계정 신청을 해야됩니다.
이에 대한 정보는 다음 링크를 참고해주세요.
공공데이터로 내가 만든 사이트가 API 호출이 안된다면? 운영계정 신청하기 !
미세먼지 공공데이터로 만든 사이트 개발을 마치고 배포까지 했으나 API가 호출되지않는 문제를 경험했습니다. 원인은 바로 공공데이터 운영계정 신청을 하지않은것. 이제부터 공공데이터 운영
yohayo.tistory.com