![image](https://private-user-images.githubusercontent.com/45449387/237958262-78a56ee7-9ec6-4503-b4b2-ba6be821cbdb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yMzc5NTgyNjItNzhhNTZlZTctOWVjNi00NTAzLWI0YjItYmE2YmU4MjFjYmRiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ZDQ4MjIyYzhjYjMwY2E1YWM0YTkyZjcwYjJkZGZkNGIzZDQ1M2MyNmUyNWIzYTQ1MzVjMWZmMjVkMTRiMTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x5toVD5B9amfiau_tsKRjUQO6F3NzgX44u5uuTvVTn8)
![image](https://private-user-images.githubusercontent.com/45449387/241679372-425f17e1-7f46-456a-8d65-1c81ee5429ab.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzkzNzItNDI1ZjE3ZTEtN2Y0Ni00NTZhLThkNjUtMWM4MWVlNTQyOWFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZiZmI5ZTE4M2MxMzJmOGU3ZTBmZDdmMDUzYzA5M2ZmYWUxMGZkNzVhZTRiNTFkODgyY2I3YWVjYzM1ZTc2ZjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.7lx0-MYBomvOgmo9tPBcMlEySmJlohXbbi43-RvxMbM)
특정 날짜에 어떤 코인을 얼마만큼 샀다면 현재 얼마가 되어있을지 바로 확인할 수 있는 웹 기반 서비스입니다.
- 코인, 날짜, 금액을 입력하고 현재는 가치가 얼마나 바뀌었는지 계산할 수 있습니다.
- 계산한 코인 종류의 현재 차트를 전체, 1년, 1달, 1주, 1일 단위로 볼 수 있습니다.
- 현재 마켓에 활성화된 모든 코인에 대한 시세표를 볼 수 있고, 페이지별 정렬 기능을 제공합니다.
- 원화와 달러 화폐 단위를 지원합니다.
- 검색 기록을 조회할 수 있습니다. 검색한 화폐단위 별로 필터링하여 조회하는 기능 또한 제공합니다.
- 딱딱한 차트와 복잡한 지표들이 아닌, "만약에~했더라면?" 이라는 재밌는 상상에 기반한 매력적인 가상화폐 정보 플랫폼
- 전체 가상화폐 현황과 더불어 코인별 간단한 차트까지 한 번에 확인할 수 있는 범용성
- 복잡한 페이지 이동, 회원가입 및 로그인 없이 단일 페이지 내에서 부담없이 사용할 수 있는 심플함
- 간편한 공유, sns업로드 기능을 통한 자연스러운 홍보 효과 기대
- 라우트가 없는 싱글페이지 앱인 만큼
dynamic import
기법을 이용하여 페이지 로딩속도를 개선했습니다. - Smart 컴포넌트와 Dumb 컴포넌트를 구분하여 비즈니스 로직과 뷰 로직을 분리시켜 개발경험을 개선했습니다.
styled-components
의 props를 십분 활용하여 스타일 코드를 기능적 코드로부터 격리시키고 디자인 시스템과 유사한 환경을 구축하였습니다.- Pagination 기법을 통해 단일 페이지 내에 자칫 무거워질 수 있는 api요청들을 최소화하여 퍼포먼스 향상을 이루었습니다.
- 상태 관리 라이브러리로
Zustand
를 사용하여 transient한 업데이트를 지향하고 불필요한 재렌더링을 최소화 하였습니다. - 웹, 모바일 환경에서도 이용에 불편함이 없도록 반응형 웹 디자인을 적용했습니다.
🦥 Kenny | 🪓Henry | 🎸 Ian |
---|
- 프로젝트 전역적으로 사용할 수 있는 "마이크로 컴포넌트" 제작
- styled components를 이용하여 마이크로 컴포넌트의 prop만으로 프로젝트에 맞는 폰트, 배경색, 레이아웃 등을 스타일링 할 수 있도록 설계
![image](https://private-user-images.githubusercontent.com/45449387/241664757-3153b3e5-9d19-4a8f-8528-ac180510da62.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NjQ3NTctMzE1M2IzZTUtOWQxOS00YThmLTg1MjgtYWMxODA1MTBkYTYyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNlNGE2OGMxNWQ4NWZhYjFkOThmM2U1MDliNTMzZjVkYzFlZDlkODFmOGVjYTU2YWZkYjVhNmI2ZDUwOTg2MzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0H0KMSucVSJX4S7N0-9yqe_2i082xJ0CN1fJh4UG43Q)
- 사용자 입력 폼 개발 및 반응형 디자인 적용
- react-datepicker 라이브러리 커스텀 디자인 적용
- submit시 api호출 및 입력 데이터와 전역 상태 연동 등 기능 개발
- 입력 데이터 예외 처리
- 로컬 스토리지를 이용하여 검색 기록 저장
- 검색기록 열람 기능 구현
- 사용자가 선택한 화폐에 맞는 기록을 보여주는 검색기록 필터링 기능 구현
- 검색기록 삭제 기능 구현
![image](https://private-user-images.githubusercontent.com/45449387/241669082-7f86ec0e-92bd-4f7b-92da-7404e7ccec4d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NjkwODItN2Y4NmVjMGUtOTJiZC00ZjdiLTkyZGEtNzQwNGU3Y2NlYzRkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE3NjZhMmI4ODliMDYzZDdlNjQ0YTZjYzQ1YzZiNDFkYWI2MGViY2IxMjFmYzQyOWYyMmE4ZmQ1MDMyYjQ3YTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.38TNUEsjnXJyS1reSBsLYDriD7V6wz8xn0ZeG_UwuLc)
![image](https://private-user-images.githubusercontent.com/45449387/241675106-b4d49da5-3723-45f7-a76c-37a82df297c1.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzUxMDYtYjRkNDlkYTUtMzcyMy00NWY3LWE3NmMtMzdhODJkZjI5N2MxLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwYTZjN2RkOTliNTk2MTBiZjgzY2M1MjZjMGMwNjUyNDA1OGUzNjQxMzU0YjE3NGFjMzBkODk1Zjc4M2M1NTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.uSl7Nbsmmr0XN7OIK_RGl6gAN4SkFUzP8_iea78Q2Q8)
- 전역으로 관리할 상태 정의 및 카테고리별로 분류
- zustand를 사용하여 카테고리별 store 개발
- 상태에 따른 액션 정의 및 개발
- api요청을 통해 받아온 코인 정보 캐싱 로직 구현
- 컴포넌트별 필요한 props, state, 함수, 구독할 전역 상태 정의
- 컴포넌트별 필요한 api 선택
![image](https://private-user-images.githubusercontent.com/45449387/241681420-6defe772-43ca-4396-bbae-e74f44f389f2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2ODE0MjAtNmRlZmU3NzItNDNjYS00Mzk2LWJiYWUtZTc0ZjQ0ZjM4OWYyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI1MDY0YzFkOWU5YmY4ZDI2YjhmNDBmOTJhYmMwODA3MWIxNjU5N2QwNTg1OGUwZmQwNDNjODg5MjkzNzhmMzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0._bJGcqw8kDH7iJ_I6CWBdA6YBmHe88STDddkhcflSQ0)
- coinGecko api문서를 참고하여 기능별로 필요한 api 정리
- 호출할 api별 필요한 파라미터 정의
![image](https://private-user-images.githubusercontent.com/45449387/241681336-c6ec58a8-fa57-4b28-a390-2c6249c8c0cf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2ODEzMzYtYzZlYzU4YTgtZmE1Ny00YjI4LWEzOTAtMmM2MjQ5YzhjMGNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc1MDA1ZTQyYTU3NzNhNGZlN2JiNTRiYWM5ZDk4YWU5ZjMyOWM0YjIzMTkxMjc3OWUwNmY3NGFlYmZlZDRjNzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.m_7y_il8ck6UBjQ3xPo-X7ogRgCtv-PM2TnMXiW328I)
- recharts 라이브러리를 이용하여 프로젝트에 맞는 커스텀 디자인 적용
- api 호출로 받아온 차트 데이터 가공
- 선택한 기간별로 다른 데이터를 적용하여 서로 다른 차트 렌더링 구현
- dynamic import기법을 통한 차트 컴포넌트 lazy loading 구현
- Suspense 컴포넌트를 이용하여 차트 데이터를 불러오는 동안 로딩 애니메이션 적용
- ErrorBoundary 컴포넌트를 이용한 예외 처리
- 카카오톡 공유 기능 구현
- 페이스북 게시물 공유 기능 구현
- 링크 복사 기능 구현
![image](https://private-user-images.githubusercontent.com/45449387/241672270-b87af8af-4c26-422c-89f9-8a78781bc226.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzIyNzAtYjg3YWY4YWYtNGMyNi00MjJjLTg5ZjktOGE3ODc4MWJjMjI2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYzNTIyNzdiZmY3NTZjN2VlNjFkNmE2ZjRiNmI3Y2MzYWVhMWNiZDM0NDljNDY1YzU5MmMxMTNkMjMwYmE5NGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.29MhU2R4SrOCWxxGP27sB74R99hw8dGIrtw59-fG6qU)
- 컴포넌트 조립 및 전체 페이지 레이아웃 구성
- 칩, 버튼, select, 가격 변동 폭 UI 컴포넌트 개발
![image](https://private-user-images.githubusercontent.com/45449387/241674674-304a7d77-512a-4097-aabb-acd9e101fc59.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzQ2NzQtMzA0YTdkNzctNTEyYS00MDk3LWFhYmItYWNkOWUxMDFmYzU5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE1ZTA5NDk0MGNkOThiMzVkOGJkYmQzZGQ4MzVmMTVkMGY0MjUyNzMzZjg0MTI1MWFlOGNiNmExZTlmNTU0MWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0_-OCxjOGNF0z8O8WCeJL-qLc23qT25itRehOniWF2c)
- Gnb 컴포넌트 레이아웃 구성
- 반응형 디자인 적용
- 화폐 변경, 초기화, 검색기록 UI 개발
![image](https://private-user-images.githubusercontent.com/45449387/241675448-96592e1a-2355-4ccd-85c2-cfa43a365153.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzU0NDgtOTY1OTJlMWEtMjM1NS00Y2NkLTg1YzItY2ZhNDNhMzY1MTUzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThlZGI0MGRiOWFmZGRlNGJiZjE4MjAyZjcxYzBkOGVmNWY3MThkNTAxYjRhOTg5MThlZDIyMTVhYTVkZTJhNWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.doTkl3snIHOaq9-qLT8-qnFtVTbRlE9bkzpNfLhk7Os)
- semantic 태그를 사용하여 접근성과 SEO를 고려한 UI 구현
- 반응형 디자인 적용
- 뷰포트 사이즈 실시간 변동에도 대응할 수 있는 pagination 로직 설계 및 구현
- 전역 상태에 캐싱된 코인 정보 활용으로 api요청 최소화
![image](https://private-user-images.githubusercontent.com/45449387/241678159-5617a0b4-d961-4b09-bf7f-13b5779a3e43.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0NTgzOTksIm5iZiI6MTczOTQ1ODA5OSwicGF0aCI6Ii80NTQ0OTM4Ny8yNDE2NzgxNTktNTYxN2EwYjQtZDk2MS00YjA5LWJmN2YtMTNiNTc3OWEzZTQzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEzVDE0NDgxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE3NWNkNmM0YzU3MzkwM2U2ZjQzZjBmZTg1YWNmYTEwZTA2ZDIxNDNkMTk1ZmI2M2E0NDZmNjEyOWFlZDAxMzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zf91B_JF0LPUGX41tg7vfJnaprUKGiV1Z7E9lID_A3E)
- axios 라이브러리 사용
- axios 커스텀 인스턴스 생성
- interceptor 사용
- 원활한 비동기 데이터 요청 및 처리를 위한 useAsync 커스텀 훅 개발